Dans cet article nous allons voir comment utiliser les filtres dans vos vues de type liste d'item.
La clé du système est essentiellement dans la méthode populatestate de la classe mère ListModel dont vos model devront hériter.
Cette methode se trouve en libraries/src/model/ListModel.php ligne 472.
populatestate de la classe ListModel (anciennement JModelList) va principalement effectuer :
1) appele la methode app->getUserStateFromRequest ($key, $request) (voir libraries/src/Application/CMSApplication.php ligne 560) pour le tableau des filtres ($key = contexte et $request = filter) qui cherche la valeur actuelle du tableau des filtres en session, et la nouvelle valeur du tableau dans la requête (input->get($request).
Si des filtres sont trouvés on stocke le nouveau tableau en session.
2) le tableau des nouveaux filtres est parcouru, et si le filtre n'est pas exclu (s'il ne figure pas en table filterBlacklist du model) on enregistre le filtre qui sera ensuite utilisé dans la methode getListQuery de votre model pour préparer la requête SQL.
L'enregistrement dans l'environnement se faisant par la classique methode setstate('filter.'$name, $value).
3) Ensuite cette méthode populatestate va faire de même pour les variables de requete de type List (pagination et ordre de tri)
Si l'on respecte le nommage des champ de formulaire, il n'y a donc pas grand chose à faire pour les filtres, la pagination et les tris dans votre model.
tableau filter_fields
Doivent figurer dans ce tableau tous les filtre autorisés.
Il est à initialiser dans votre constructeur de votre model.
Methode getActiveFilter
Cette méthode lit le tableau filter_fields, regarde si les variables filter.nom_du_filtre existent dans l'environnement (state) actuel et si la valeur du filtre n'est pas vide ou si elle est numérique par un setState('filter.nom_du_filtre)
Elle construit un tableau qu'elle retournera avec toutes les valeurs des filtres initialisés.
Elle est appelée par $this->activeFilters = $this->get('ActiveFilters'); généralement dans view.html.php
Article en cours de rédaction...
Les Tris
Dans le template de la vue, au niveau des entêtes de la table :
$listDirn = $this->escape($this->state->get('list.direction'));
Il faut bien veiller à ce que les nom des options de tri dans le xml correspondent bien aux noms figurants en 3ème paramètre de l'appel à searchtools.sort (ici "equipe") :
JHtml::_('searchtools.sort', 'COM_GSKI_EQUIPE', 'equipe', $listDirn, $listOrder);
<option value="equipe ASC">COMGSKICOMITEEQUIPE_ASC</option>
<option value="equipe DESC">COMGSKICOMITEEQUIPE_DESC</option>
Sinon la selectList ne se mettra pas à jour lors du rafraichissement de la page si l'on fait un tri.