Mastering symfony 1.4 form widgets

Usage examples of lots of symfony form widgets.

sfWidgetFormDateTime

$months = array(1 => "January", 2 => "February", 3 => "March", 4 => "April", 5 => "May", 6 => "June", 7 => "July", 8 => "August", 9 => "September", 10 => "October", 11 => "November", 12 => "December");
$years = range(2010, date("Y") +5);
$years_list = array_combine($years, $years);
$this->widgetSchema["data"] = new sfWidgetFormDateTime(array("date" => array("months" => $months, "format"=>" %day% / %month% / %year%", "years" => $years_list)));
$this->setValidator("data" , new sfValidatorDateTime(array("required" => false)));
 

sfWidgetFormChoice

$cultures = array("en" => "en" , "pt" => "pt");
$this->widgetSchema["culture"] = new sfWidgetFormChoice(array("choices" => $cultures));
$this->widgetSchema["culture"] = new sfValidatorChoice(array("choices" => $cultures, "empty_value" => "", "required" => true));
 

post validator

// post validator
$this->validatorSchema->setPostValidator(
  new sfValidatorCallback(array("callback" => array($this, "checkSomething")))
);

public function checkSomething($validator, $values)
{    
  if ($values["fase_id"] == 5)
  {      
    $error = new sfValidatorError($validator , "Cannot use fase_id = 5");
    throw new sfValidatorErrorSchema($validator, array("ingresso_preco" => $error));    
  }

  return $values;
}
 

embeding i18ned forms

// embeding i18ned forms
// http://symfony.com/legacy/doc/jobeet/1_2/en/19?orm=Propel
$this->embedI18n(array("en", "pt"));
$this->widgetSchema->setLabel("en", "English");
$this->widgetSchema->setLabel("pt", "Português");

//http://stackoverflow.com/a/1831580/597060
$mce_config = "valid_elements: "*[*]", cleanup: false, inline_styles: true";
$this->widgetSchema["en"]["texto"] = new sfWidgetFormTextareaTinyMCE(array("config" => $mce_config));
$this->widgetSchema["pt"]["texto"] = new sfWidgetFormTextareaTinyMCE(array("config" => $mce_config));
 

handling files

// handling files
$this->setWidget("cover_image", new sfWidgetFormInputFileEditable(
    array(
        "edit_mode" => false,
        "with_delete" => false,
        "file_src" => "/uploads/cover_image/".$this->getObject()->getCoverImage(),
    )
));
$this->setValidator("cover_image", new sfValidatorFile(
    array(
        "max_size"             => 1000000,
        "mime_types"           => "web_images", //you can set your own of course
        "path"                 => sfConfig::get("sf_web_dir")."/uploads/cover_image/",
        "required"             => false,
        "validated_file_class" => "sfValidatedFileCoverImage"
    )
));

// lib/validator/sfValidatedFileCoverImage.class.php
class sfValidatedFileCoverImage extends sfValidatedFile {

  public function save($file = null, $fileMode = 0666, $create = true, $dirMode = 0777) {

    // let the parent class save the file and do what it normally does
          $saved = parent::save($file, $fileMode, $create, $dirMode);

    /* Here we will put all our custom logic. Say, to create a thumbnail,
     or maybe manipulate it in whatever way you see fit.
    There are many possibilities here, so see the extended
    class sfValidatedFile in the Symfony 1.4 API Documentation
    to get a better idea about what you can manipulate and extend */

    $img = new sfImage(sfConfig::get("sf_web_dir")."/uploads/cover_image/".$saved, "image/jpg");
    $img->thumbnail(1105,456);
    $img->setQuality(90);
    $img->save();

    // return the saved file as normal
    return $saved;
  }
}
 

sfWidgetFormInputCheckbox

$this->widgetSchema["use_name"] = new sfWidgetFormInputCheckbox();
$this->setValidator("use_name" , new sfValidatorBoolean(array("required" => false)));
 

sfWidgetFormInputPassword

$this->widgetSchema["pass"] = new sfWidgetFormInputPassword();
$this->widgetSchema["pass"]->setLabel("Password");
$this->setValidator("pass" , new sfValidatorString(array("min_length" => 6, "required" => true), array("required" => "Password field required." , "min_length" => "Password field shoud have 6 caracters at least.")));
 

sfWidgetFormInputText – sfValidatorUrl

$this->widgetSchema["website_url"] = new sfWidgetFormInputText();
$this->setValidator("website_url", new sfValidatorUrl(array("required" => false), array("invalid" => "Invalid Website Url")));
 

sfWidgetFormInputText – sfValidatorString

$this->widgetSchema["text"] = new sfWidgetFormInputText();
$this->setValidator("text", new sfValidatorString(array("max_length" => 200, "required" => false)));
 

sfWidgetFormInputText – sfValidatorInteger

$this->widgetSchema["number"] = new sfWidgetFormInputText();
$this->setValidator("number", new sfValidatorInteger(array("min" => -128, "max" => 127)));
 

sfWidgetFormInputHidden – sfValidatorPropelChoice

// propel fk hidden
$this->widgetSchema["user_id"] = new sfWidgetFormInputHidden();
$this->setValidator("user_id", new sfValidatorPropelChoice(array("model" => "User", "column" => "id")));
 

sfWidgetFormPropelChoice – sfValidatorPropelChoice

// propel fk select choice
$this->widgetSchema["user_id"] = new sfWidgetFormPropelChoice(array("model" => "User", "add_empty" => false));
$this->setValidator("user_id", new sfValidatorPropelChoice(array("model" => "User", "column" => "id")));
 

Suggestions? Always welcome.

form
snippet

Comments (0)

Permalink

Escape getResponse()->setTitle on sfActions

Use the second parameter as false. Default is true.

$this->getResponse()->setTitle($event->getTitle(), false);
 

snippet

Comments (0)

Permalink

Cross application clear cache partials using sfAPCCache – symfony 1.4

Remember to have the prefix set in your factories.yml:

all:
  view_cache_manager:
    class: sfViewCacheManager
    param:
      cache_key_use_vary_headers: true
      cache_key_use_host_name:    true

  view_cache:
    class: sfAPCCache
    param:
      prefix: frontend
 

Remember also to have the cache: true on the settings.yml:

dev:
  .settings:
    cache:                  true
    …
 

Having this, you can remove the cache from APC in your backend application using something like this:

  protected function doSave($con = null)
  {

    // removing cache
    $cache = new sfAPCCache(array(‘prefix’ => ‘frontend’));
    $cache->removePattern(‘*/all/page/article/sf_format/html/slug/’.$this->values[‘slug’], ‘*’);

    parent::doSave($con);  // continue with the parent save()
  }

 

php

Comments (0)

Permalink

Symfony – Snippet – Maneiras de acessar o objeto User

Esses dias precisei utilizar o objeto User do symfony dentro dos forms.

Pesquisando na internet achei diversas maneiras de acessar o objeto pelo symfony.

Template / View

 $user = $sf_user;

Model ou Form

 $user = sfContext::getInstance()->getUser();

Action

 $user = $this->getUser();

ou

 $user = sfContext::getInstance()->getUser();

Creio que esse último exemplo funcione em qualquer lugar do symfony.

font: “http://erisds.co.uk/symfony/snippet-symfony-user-access-the-user-object”:http://erisds.co.uk/symfony/snippet-symfony-user-access-the-user-object

php
snippet

Comments (0)

Permalink

Cansei de digitar “php symfony”, agora uso “sf”

Ontem cansei de tanto digitar “php symfony” no terminal.

Comecei um novo projeto no sf1.3 com o Doctrine. Como não conheço muito bem ainda essa versão, leveis uns trancos e tive que utilizar diversas vezes a linha de comando.

Para evitar de ficar toda hora escrevendo “php symfony …” fiz um alias:

$ echo “alias sf=’php symfony’” >> ~/.bash_profile

$ . ~/.bash_profile

Pronto. Ao invés de digitar “php symfony” basta utilizar “sf”.

php

Comments (1)

Permalink

Snippet – Slug String

<?php
 
function slugString($string, $replacement = ‘_’)
{
  $aux = preg_quote($replacement, ‘/’);
 
  $map = array(
    ‘/à|á|ã|â/’ => ‘a’,
    ‘/è|é|ê|ẽ|ë/’ => ‘e’,
    ‘/ì|í|î/’ => ‘i’,
    ‘/ò|ó|ô|õ|ø/’ => ‘o’,
    ‘/ù|ú|ũ|û/’ => ‘u’,
    ‘/ç/’ => ‘c’,
    ‘/ñ/’ => ‘n’,
    ‘/ä|æ/’ => ‘ae’,
    ‘/ö/’ => ‘oe’,
    ‘/ü/’ => ‘ue’,
    ‘/Ä/’ => ‘Ae’,
    ‘/Ü/’ => ‘Ue’,
    ‘/Ö/’ => ‘Oe’,
    ‘/ß/’ => ‘ss’,
    ‘/[^\w\s]/’ => ‘ ‘,
    ‘/\\s+/’ => $replacement
  );
 
  return preg_replace(array_keys($map), array_values($map), $string);
}
 

Fonte: “http://api.cakephp.org/view_source/inflector/#line-480″:http://api.cakephp.org/view_source/inflector/#line-480

php
snippet

Comments (1)

Permalink

Limpar cache do symfony sem utilizar o CLI

O método removePattern do sfFileCache pode receber “**” como parâmetro e desse modo conseguimos remover recursivamente todos os arquivos de uma determinada pasta.

Esse trecho é útil para apagar o cache sem acessar o CLI.

$frontend_cache_dir = sfConfig::get(‘sf_cache_dir’).‘/frontend/prod/template’;
$cache = new sfFileCache(array(‘cache_dir’ => $frontend_cache_dir));
$cache->removePattern(‘**’); // remove tudo do diretorio
 

É só isso.. =D

php

Comments (0)

Permalink

Removendo recursivamente diretórios .svn

Comecei a migrar essa semana todos meus projetos para o SVN. Acontece que, se quisermos baixar o arquivo de um SVN e migrar para outro, temos problemas porque é criado um diretório .svn/ dentro de todos subdiretórios. Para resolver este problema, criei um alias que remove recursivamente os diretórios .svn/ da pasta corrente.

Com o comando find conseguimos achar os diretórios .svn:

$ find . -type d -name .svn

./.svn

./sourceA/.svn

./sourceB/.svn

./sourceB/module/.svn

./sourceC/.svn

Podemos, junto ao find, passar o comando rm -rf:

$ rm -rf `find . -type d -name .svn`

Podemos agora criar um alias e adicionar ao profile do usuário:

$ echo “alias csvn=’echo ‘removendo pastas .svn/’; rm -rf `find . -type d -name .svn`’” >> ~/.bash_profile
$ . ~/.bash_profile
$ svn checkout svn://server.com/svn/project

A project/index.php

A project/sourceA/a.php

A project/sourceA/a1.php

A project/sourceA/a2.php

A project/sourceB/b.php

A project/sourceB/module/lib.php

A project/sourceC/c.php

Checked out revision 15.

$ cd project

$ csvn

removendo pastas .svn/

Agora podemos fazer checkout de um SVN, jogar para outro e versionar normalmente.

Observações:

-> Tomar muito cuidado para não utilizar este comando na raiz ou em algum diretório perigoso.
-> Não é recomendável utilizar este alias como root.

É isso! Valeu!

php
symfony
unix

Comments (2)

Permalink

Manipulando campos BLOB com symfony 1.2 e Propel 1.3

Estou começando a dar meus primeiros passos com o symfony 1.2. Acabei de perder 1 hora pesquisando sobre como manipular campos *BLOB* no MySQL.

Tenho uma tabela que possui uma coluna imagem do tipo BLOB. Quando tento obter o valor desta coluna com o *$objeto->getImagem()*, o retorno é um *resource* (vardump: Resource id #403). Antigamente, no symfony 1.0, o próprio método era responsável por ‘converter’ o resource para string.

Agora, pesquisando na internet, descobri um modo de fazer esta ‘conversão’. Podemos fazer override da função getImagem() ou criar uma nova. No meu caso, resolvi criar uma função nova. Considerando minha tabela noticia:

_lib/model/Noticia.class.php_

class Noticia extends BaseNoticia
{
    public function getPathImg() {
        $content="";
        if (is_resource($this->getImagem())) {
          while(!feof($this->getImagem())){
                    $content.= fread($this->getImagem(), 1024);
                  }
                  rewind($this->getImagem());
                  return ‘/uploads/banners/’.$content;
                } else return ‘/uploads/banners/’.$this->getImagem();   
    }
}
 

Achei esta dica no site do propel, em: “http://propel.phpdb.org/trac/ticket/672″:http://propel.phpdb.org/trac/ticket/672

Pelo status do ticket, este retorno passou a ser um resource por questão de flexibilidade e performance.

Gostaria de obter comentários sobre performance e/ou sugestão sobre esta solução que achei.

Valeu!

php
symfony

Comments (0)

Permalink

symfony é um dos finalistas para o 2009 Sourceforge Community Choice Awards

Graças à dedicada comunidade, o symfony foi escolhido como um dos finalistas para o 2009 Sourceforge Community Choice Awards em três categorias!

  • Best Project (Melhor projeto)
  • Best Tool or Utility for Developers (Melhor ferramenta para desenvolvedores)
  • Best Project for the Enterprise (Melhor projeto para empresa)

Alguns outros projetos também são finalistas como: phpMyAdmin, FLOW3, Joomla, TYPO3, and vtiger CRM.

Se você gosta do symfony, ou se gosta de PHP, ou se quer estar junto com a gente, vote: “http://sourceforge.net/community/cca09/vote/”:http://sourceforge.net/community/cca09/vote/

php
symfony

Comments (0)

Permalink