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.