Filtrer sur un critère personnel dans Symfony

De e-glop
Révision datée du 6 janvier 2011 à 16:35 par BeTa (discussion | contributions) (Webographie)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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