Ingénieur IT, photographe amateur, musicien du dimanche
Filtres personnalisés pour symfony
Filtres personnalisés pour symfony

Filtres personnalisés pour symfony

Introduction

Dans symfony, les filtres sont utiles pour créer des listes d’informations selon des paramètres définis. Il est possible de générer les filtres automatiquement à l’aide de la commande $ php symfony doctrine:build-filters Ainsi, pour chaque modèle, un filtre sera créé dans « lib/doctrine/filter ». Seulement, les options de filtre correspondent aux attributs du modèle, comment est-il possible de filtrer d’après une jointure ?

Exemple

Utilisons une modélisation simple, dont le but est de lier des villes à des pays. Nous avons donc 2 modèles : « Ville » (définit par un id auto-généré, un nom et une clé étrangère pays_id) et « Réunion » (définit par un id auto-généré et un nom). Si nous générons les filtres, ceux-ci nous permettent de filtrer pour chaque modèle selon ses attributs, c’est à dire filtrer les villes par nom, et les pays par leur nom également.

Pour aller plus loin, imaginons que nous voulons filtrer les villes d’un pays en particulier. Nous allons donc recourir au champ nom de la table Pays depuis le filtre Ville. Il va donc falloir insérer notre filtre de Pays dans celui de Ville. Pour cela, nous ajouterons à l’intérieur de la methode « configure » de la classe VilleFormFilter une instruction permettant d’intégrer le formulaire : $this->embedForm('pays', new PaysFormFilter());

Si vous affichez a présent le filtre d’une ville, vous verrez que l’option « pays_nom » est aussi présente mais qu’elle n’a aucun effet. C’est normal, il nous faut encore définir le comportement de ce champ.

Ajoutez une seconde méthode nommée addPaysColumnQuery dans la classe « VilleFormFilter ». Par défaut, sf reconnait cette méthode car elle est de la syntaxe « addXxxxColumnQuery« .

public function addPaysColumnQuery($query, $field, $values){
  //initialisation du query
   $q = new Doctrine_Query();
   $q->select('p.id')->from('Pays p');
  //Liaison avec le formulaire intégré (le nom est celui définit dans le configure)
   $pForm = $this->getEmbeddedForm('pays')
  //insertion du query qu'on vient d'initialiser
   $pForm->setQuery($q);
  //création du query de filtre
   $q = $pForm->buildQuery($values);
  //récupération des paramètres de filtres
   $params = $q->getParams();
  //ajout du subquery au query initial
   $query->andWhere('v.pays_id IN('.$q->getDql().')', $params['where']);
}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *