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 ]
Génial !!!
Me manquait la notion de méthode autogénérée par champ !!!
Tu viens de me faire gagner une heure !!!! Merci !
De mon point de vue, l’override du getFields n’est pas nécessaire …
Cool =)