Filtrer sur un critère personnel dans Symfony

De e-glop.
Aller à : Navigation, rechercher

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.

Webographie

Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils