Drupal 8 - Views - Créer un filtre contextuel personnalisé

Posté le Vendredi 7 février 2020 - 09:05

Les contextual filters ou filtres contextuels sont une fonctionnalité très utile du module views de drupal : il permettent, comme le nom l'indique de filtrer les éléments affichés en fonction d'un paramètre contextuel (lié à un nœud, à l'internaute, un paramètre GET...).

Certains sont fournis de base avec drupal mais ils ne conviennent pas forcement à tous les cas d'utilisation.

Dans le cas présent, le but est de filtrer des nœuds en fonction de la localité de l'utilisateur (techniquement un terme de taxonomie) afin que l'utilisateur ne visualise que les nœuds qui concerne sa commune. Les nœuds ont un champ « référence à un terme de taxonomie » multiple, même chose pour l'utilisateur mais simple pour lui. Donc un nœud peut concerner plusieurs communes alors qu'un utilisateur n'appartient qu'à une seule commune.

Création du filtre contextuel :

  1. # web/modules/custom/mon_module/src/Plugin/views/argument_default/UserLocalite.php
  2. <?php
  3.  
  4. namespace Drupal\mon_module\Plugin\views\argument_default;
  5.  
  6. use Drupal\Core\Cache\Cache;
  7. use Drupal\Core\Cache\CacheableDependencyInterface;
  8. use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
  9. use Drupal\mon_module\Entity\User;
  10.  
  11. /**
  12.  * Filtre les noeuds en fonction de la localité de l'utilisateur
  13.  *
  14.  * @ViewsArgumentDefault(
  15.  * id = "user_localite",
  16.  * title = @Translation("Localite de l'utilisateur")
  17.  * )
  18.  */
  19. class UserLocalite extends ArgumentDefaultPluginBase implements CacheableDependencyInterface {
  20.  
  21. // C'est dans cette méthode que l'on récupère la valeur du filtre
  22. public function getArgument() {
  23. $user = \Drupal::currentUser();
  24. // Si l'utilisateur est anonyme alors on retourne « all » pour
  25. //bypasser le filtre
  26. if($user->isAnonymous()) {
  27. return 'all';
  28. }
  29. $user = User::load($user->id());
  30. // getLocalitesId() est une methode personnalisée de la classe User
  31. // qui retourne l'id du terme de taxonomy de la localité
  32. return $user->getLocalitesId();
  33. }
  34.  
  35. // Ma classe implémentant CacheableDependencyInterface, on peut ainsi ajouter des paramètres
  36. // de cache, si ça n'est pas nécessaire, il suffit de supprimer l’implémentation et les deux méthodes ci-dessous.
  37. public function getCacheMaxAge() {
  38. return Cache::PERMANENT;
  39. }
  40.  
  41. public function getCacheContexts() {
  42. return ['user:localite'];
  43. }
  44. }

Il nous reste plus qu'à sélectionner le filtre dans la liste des filtre contextuels de drupal, en choisissant bien le champs sur lequel le filtre doit s'appliquer (dans mon cas : node.localites_cibles) :

Ajout filtre contextuel

 

Configuration du filtre contextuel

 

 

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...