Custom filters dans l’Admin Generator de Symfony 1.2

Lorsque que les filtres par défaut ne suffisent pas, il arrive parfois que l’on ai besoin d’en créer de nouveaux pour l’admin generator. Pour un projet, j’ai eu besoin de filtrer les ID des objets entre deux valeurs. Il était donc nécessaire d’insérer deux champs dans la zone des filtres.

Dans le fichier lib/filter/MaClasseFormFilter.class.php, on va commencer par ajouter les nouveaux champs dans la fonction configure :

public function configure()
{
  $this->widgetSchema['id_debut'] = new sfWidgetFormFilterInput(array('with_empty' => false));
  $this->widgetSchema['id_fin'] = new sfWidgetFormFilterInput(array('with_empty' => false));
  $this->validatorSchema['id_debut'] = new sfValidatorPass(array('required' => false));
  $this->validatorSchema['id_fin'] = new sfValidatorPass(array('required' => false));
}

On ajoute deux nouveaux Widget Input ainsi que leurs validateurs associés.

On va à présent surcharger la fonction getFields qui retourne les champs au formulaire :

public function getFields() {
  return array_merge(array(
      'id_debut' => 'IdDebut',
      'id_fin' => 'IdFin',
    ), parent::getFields()
  );
}

L’Admin Generator génère pour chaque filtre une fonction addNomDuChampsColumnCriteria qui contient les critères pour la requête de filtrage. On va donc lui fournir deux nouvelles fonctions pour nos deux nouveaux champs. A noter ici que j’utilise Propel. Pour Doctrine, les paramètres de la fonction doivent être différents.

public function addIdDebutColumnCriteria(Criteria $criteria, $field,$values)
{
  if (isset($values['text']) && '' != $values['text'])
  {
    $criteria->addAnd(MaClassePeer::ID, $values['text'], Criteria::GREATER_EQUAL);
  }
}
 
public function addIdFinColumnCriteria(Criteria $criteria, $field,$values)
{
  if (isset($values['text']) && '' != $values['text'])
  {
    $criteria->addAnd(MaClassePeer::ID, $values['text'], Criteria::LESS_EQUAL);
  }
}

En clair, on complète simplement le criteria de la requête de filtrage. La valeur du champs est contenue dans $values['text'].

Il ne reste plus qu’à ajouter nos champs dans le generator.yml de votre module :

filter:
  display: [ id_debut, id_fin ]

3 commentaires

  1. Laurent DELAGE dit :

    Génial !!!
    Me manquait la notion de méthode autogénérée par champ !!!
    Tu viens de me faire gagner une heure !!!! Merci !

  2. Laurent DELAGE dit :

    De mon point de vue, l’override du getFields n’est pas nécessaire …

  3. Nicolas dit :

    Cool =)

Laisser un commentaire

Remarque: La modération de commentaires est activée ce qui peut retarder la publication de vitre commentaire. Inutile de le republier.