symfony

Olá! Neste post vamos mostrar como incluir campos customizados para o seu filtro, no admin generator.

Atenção! Este tutorial é relativo à versão 1.4 do Symfony!

Contextualizando, imagine que temos uma tabela Product com a seguinte estrutura:

name: bicycle
quantity: 1500
quantity_alarm: 50

Imagine agora que precisaríamos de um campo no nosso filtro para exibir ao usuário quais são os produtos que estão com a quantidade baixa, utilizando o campo quantity_alarm como referência. Como fazer isto? Simples!

Primeiramente vamos alterar a seção filters do nosso generator.yml, incluindo o nosso novo campo do filtro:

filter:
  display: [ alarming ]

Em nosso ProductFormFilter.class.php teremos que fazer as seguintes alterações:

    public function configure() {
        // ...
 
        $this->manageFieldAlarming();
    }
 
    protected function manageFieldAlarming() {
        $this->widgetSchema ['alarming'] =
                new sfWidgetFormChoice(array(
                    'choices' => array(
                        '' => 'yes or no',
                        1 => 'yes',
                        0 => 'no'
                        )));
        $this->validatorSchema ['alarming'] =
                new sfValidatorPass();
    }

Além disso, devemos sobrescrever o método getFields

public function getFields()
{
  $fields = parent::getFields();
  $fields['alarming'] = 'alarming';
  return $fields;
}

…e criar o método para tratar o novo campo:

public function addAlarmingColumnQuery($query, $field, $value)
{
  Doctrine::getTable('Product')
    ->applyAlarmingFilter($query, $value);
}

Pronto! Agora com o filtro atualizado, devemos criar nosso método para realizar a busca de acordo com os nossos parâmetros.

  static public function applyAlarmingFilter($query, $value)
  {
    $rootAlias = $query->getRootAlias();
    switch ($value)
    {
      case '0':
        $query->where($rootAlias.'.quantity > '.$rootAlias.'.quantity_alarm');
        break;
      case '1':
        $query->where($rootAlias.'.quantity <= '\.$rootAlias.'.quantity_alarm');
        break;
    }
    return $query;
  }

Desta maneira, teremos um novo campo no filtro para exibir os produtos de acordo com a necessidade do usuário.

Bem, qualquer dúvida ou sugestão utilize o comentário.

Até mais!