Filtrer sur un critère personnel dans Symfony
Sommaire
Présentation de la problématique
Un module généré par :generate-admin dans Symfony ne permet pas nativement de filtrer sur le caractère d'un "sous-objet" d'un modèle donné. Exemple : on veut filtrer tous les objets dont une objet-fils lié à une propriété donnée.
Ici l'exemple portera sur un champ "prestation_type_id" d'une table Prestation liée par une clé étrangère à une table Prescription. La liste où s'appliquera le filtre sera la représentation de cette seconde table : Prescription.
L'exemple porte sur un module doctrine:generate-admin, et ne s'applique pas forcément de la même manière à Propel.
Solution
Créer le widget
Nous allons donc créer le widget prestation_types dans le FormFilter lib/filter/doctrine/PrescriptionFormFilter.class.php :
public function configure() { /* (...) */ $this->widgetSchema['prestation_types'] = new sfWidgetFormDoctrineChoice(array( 'model' => 'PrestationType', 'add_empty' => true, )); $this->validatorSchema['prestation_types'] = new sfValidatorInteger(); /* (...) */ }
Déclaration du widget
Encore dans lib/filter/doctrine/PrescriptionFormFilter.class.php créer la fonction :
public function getFields() { return array_merge(array('prestation_types' => 'Prestation types'), parent::getFields()); }
Amendement de la requête Doctrine
Toujours dans lib/filter/doctrine/PrescriptionFormFilter.class.php, nous allons déclarer une nouvelle fonction sous la forme add[nomDuChamp]ColumnQuery :
public function addPrestationTypesColumnQuery(Doctrine_Query $query, $field, $value) { $fieldName = $this->getFieldName($field); if ( $value ) { $a = $query->getRootAlias(); $query->addWhere($a.'.Prestations.prestation_type_id = ?',$value); } return $query; }
Ici, "$a.Prestations" est l'alias proposé pour référencer les prestations dans la table/class Prescription.
Le générator
Il reste maintenant à faire apparaître le champ dans le filtre graphique. Pour se faire, il faut l'ajouter comme un champ classique dans le fichier app/[nom de l'app]/modules/prescription/config/generator.yml.
Conclusion
Ainsi, le "tour" est joué. Nous avons bien un champ Prestation types qui apparaît avec une liste des types de prestations disponibles. CQFD.