Aumentando o timeout da sessão do usuário (sf 1.2)

Editar arquivo apps/(aplicacao)/config/factories.yml e alterar os segundos do ‘timeout’:

all:
  user:
   class: myUser
   param:
     timeout:         2700
 

php
snippet
yml

Comments (0)

Permalink

Tratando múltiplos telefones com embedded forms no admin generator

No meu post anterior, comentei sobre uma tabela (imovel) que possui diversos telefones (1-N). Nesse post vou tentar explicar como fiz o formulário de edição para tratar os N telefones dos imoveis.

O jeito que fiz vai ficar como a imagem abaixo. Vou deixar sempre 3 campos em branco para adicionar novos telefones. Para remover um telefone, basta deixa-lo em branco (em breve eu crio um botão com ajax para remover).

Vamos começar editando o lib/form/ImovelForm.class.php

class ImovelForm extends BaseImovelForm
{
  public function configure()
  {
      $todoWrapperForm = new sfForm();
      if ($this->getObject()->countTelefoneImovels() > 0) {
          foreach ($this->getObject()->getTelefoneImovels() as $telefone){
             $todoWrapperForm->embedForm(‘tel_’.$telefone->getId(), new TelefoneImovelForm($telefone));
          }
      }
    // adiciona os 3 forms em branco
    $todoWrapperForm->embedForm(‘tel_A’, new TelefoneImovelForm());
    $todoWrapperForm->embedForm(‘tel_B’, new TelefoneImovelForm());
    $todoWrapperForm->embedForm(‘tel_C’, new TelefoneImovelForm());

    $this->embedForm(‘tels’, $todoWrapperForm);

    $this->validatorSchema->setOption(‘filter_extra_fields’, false);
    $this->validatorSchema->setOption(‘allow_extra_fields’, true);

  }

  public function bind(array $taintedValues = null, array $taintedFiles = null) {
    foreach($this->embeddedForms[‘tels’]->getEmbeddedForms() as $key=>$telForm)
    {
       if ($taintedValues[‘tels’][$key][‘telefone’] == "")
       {
          unset($this->embeddedForms[‘tels’]->embeddedForms[$key], $taintedValues[‘tels’][$key]);
          $telForm->getObject()->delete();
       }
    }
    parent::bind($taintedValues, $taintedFiles);
  }

  // http://trac.symfony-project.org/ticket/5842
  public function saveEmbeddedForms($con = null, $forms = null, $taintedValues = null, $taintedFiles = null)
  {
    //atualiza o imovel_id da telefone_imovel depois de ter o imovel salvo
    //http://www.thatsquality.com/articles/embedding-child-forms-with-sfformpropel-a-practical-example
    foreach($this->embeddedForms[‘tels’]->getEmbeddedForms() as $telForm)
    {
       if (!$telForm->getObject()->getImovelId())
       {
         $telForm->getObject()->setImovelId($this->getObject()->getId());
       }
    }

    if (is_null($con))
    {
      $con = $this->getConnection();
    }

    if (is_null($forms))
    {
      $forms = $this->embeddedForms;
    }

    if (is_null($taintedValues))
   {
      $taintedValues = $this->taintedValues;
   }

   if (is_null($taintedFiles))
   {
      $taintedFiles = $this->taintedFiles;
   }

   foreach ($forms as $key => $form)
   {
       // é esse trecho que corrige o problema
       if ($form instanceof sfFormPropel)
       {
          $form->bindAndSave($taintedValues[$key], $taintedFiles);
       } else {
          $this->saveEmbeddedForms($con, $form->getEmbeddedForms(), $taintedValues[$key], $taintedFiles);
       }
   }
 }
}
 

Agora vamos criar um partial para mostrar os telefones no formulário. Crie o arquivo apps/backend/imovel/templates/_tels.php


<div id="embed_tels">
<?php foreach ($form->getEmbeddedForms() as $key => $itemForm) {
             if (substr($key , 0 , 8) == ‘tels’): ?>
                 <div class="sf_admin_form_row sf_admin_text sf_admin_form_field_telefone<?php echo preg_replace("/[^0-9]/", ‘’, $key); //only number ?>">
                    <div>
                       <?php echo $form[$key]; ?>
                    </div>
                 </div>
             <?php endif ?>
<?php } ?>
</div>
 

Depois de ter criado o partial, basta adiciona-lo ao apps/backend/imovel/config/generator.yml


edit:
  display: [_tels, campo1, campo2]
 

É isso.. tive como referência diversos sites, mas principalmente o blog that’s quality.

http://www.thatsquality.com/search?query=embedded

embedded form
form
php
propel

Comments (0)

Permalink

Adicionando um filtro customizado no admin generator (symfony 1.2)

Tenho uma tabela (1-N) que possui diversos telefones relacionados.

config/schema.yml:


imovel:
  id:
  ()
  created_at:

imovel_telefone:
  id:
  imovel_id:
  telefone:   varchar(20)
  created_at:
 

No admin generator, será necessário criar um filtro customizado, porque o telefone não faz parte da tabela imovel. Para isso, vamos alterar o arquivo lib/filter/ImovelFormFilter.class.php


class ImovelFormFilter extends BaseImovelFormFilter
{
  public function configure() {
     $this->widgetSchema[‘telefone’] = new sfWidgetFormInput();
     $this->validatorSchema[‘telefone’] = new sfValidatorPass(array(‘required’ => false));
  }

  public function getFields() {
    return array_merge(array(‘telefone’ => ‘Telefone’), parent::getFields());
  }

  protected function addTelefoneColumnCriteria(Criteria $criteria, $field, $values) {
    $criteria->addJoin(ImovelPeer::ID, TelefoneImovelPeer::IMOVEL_ID, Criteria::LEFT_JOIN);
    $criteria->add(TelefoneImovelPeer::TELEFONE, $values);
  }
}
 

Para finalizar, altere o generator.yml do seu backend e adicione o field telefone.


filter:
  fields:
    display:  [ telefone, campo1, campo2 ]
 

filter
php
symfony

Comments (0)

Permalink

Symfony Experts

Dia 21 de fevereiro o pessoal do symfonynerds.com lançou um novo portal: www.symfonyexperts.com

O site é basicamente igual ao WP Questions, porém totalmente voltado para o symfony.

Vale a pena dar uma olhada.

Mais informações aqui: http://symfonynerds.com/blog/?p=359

php
symfony

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

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

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

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