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 :

# web/modules/custom/mon_module/src/Plugin/views/argument_default/UserLocalite.php
<?php

namespace Drupal\mon_module\Plugin\views\argument_default;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
use Drupal\mon_module\Entity\User;

/**
 * Filtre les noeuds en fonction de la localité de l'utilisateur
 *
 * @ViewsArgumentDefault(
 *   id = "user_localite",
 *   title = @Translation("Localite de l'utilisateur")
 * )
 */
class UserLocalite extends ArgumentDefaultPluginBase implements CacheableDependencyInterface {

  // C'est dans cette méthode que l'on récupère la valeur du filtre
  public function getArgument() {
    $user = \Drupal::currentUser();
    // Si l'utilisateur est anonyme alors on retourne « all » pour
    //bypasser le filtre
    if($user->isAnonymous()) {
      return 'all';
    }
    $user = User::load($user->id());
    // getLocalitesId() est une methode personnalisée de la classe User
    // qui retourne l'id du terme de taxonomy de la localité
    return $user->getLocalitesId();
  }

  // Ma classe implémentant CacheableDependencyInterface, on peut ainsi ajouter des paramètres 
  // de cache, si ça n'est pas nécessaire, il suffit de supprimer l’implémentation et les deux méthodes ci-dessous.
  public function getCacheMaxAge() {
    return Cache::PERMANENT;
  }

  public function getCacheContexts() {
    return ['user:localite'];
  }
}

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

 

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...