kgaut.net // Développeur web PHP / Drupal freelance
contactez-moi

Drupal 8 & Drupal 9 - Utiliser des vues différentes selon les taxonomies

Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.

À partir de drupal 8, c'est une vue qui gère la page des contenus d'un terme de taxonomie.

Le soucis est que c'est la même vue pour l'ensemble des vocabulaires.

Pour le site courant je voulais une page différente pour les catégories de module (exemple avec la catégorie backoffice) de la page par défaut (exemple avec le tag drupal).

Pour cela il faut surcharger le contrôleur gérant les vues, et n'ayez pas peur c'est moins compliqué à faire qu'à dire.

Déclaration du service

Le service va altérer la route /taxonomy/term/% pour changer le contrôleur qui sera executé

modules/custom/mon_module/mon_module.services.yaml

services:
  mon_module.route_subscriber:
    class: Drupal\mon_module\Routing\TaxonomyListingViewsRoutingSubscriber
    tags:
      - { name: event_subscriber }

Définition du service

modules/custom/mon_module/src/Routing/TaxonomyListingViewsRoutingSubscriber.php

<?php

namespace Drupal\mon_module\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
use Drupal\Core\Routing\RoutingEvents;

class TaxonomyListingViewsRoutingSubscriber extends RouteSubscriberBase {

  public function alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('entity.taxonomy_term.canonical')) {
      $route->setDefault('_controller', '\Drupal\mon_module\Controller\TaxonomyTermViewPageController::handle');
    }
  }

  public static function getSubscribedEvents() {
    $events = parent::getSubscribedEvents();
    $events[RoutingEvents::ALTER] = array('onAlterRoutes', -180);
    return $events;
  }

}

Surcharge du contrôleur

modules/custom/mon_module/src/Controller/TaxonomyTermViewPageController.php

<?php

namespace Drupal\mon_module\Controller;

use Drupal\views\Routing\ViewPageController;
use Drupal\Core\Routing\RouteMatchInterface;

class TaxonomyTermViewPageController extends ViewPageController {

  /**
   * {@inheritdoc}
   */
  public function handle($view_id, $display_id, RouteMatchInterface $route_match) {
    //Vue et mode d'affichage par défaut
    $view_id = 'taxonomy_term';
    $display_id = 'page_1';

    $term = $route_match->getParameter('taxonomy_term');

    $vid = $term->get('vid')->first()->getValue();
    $vid = $vid['target_id'];

    //on teste le vocabulaire
    if ($vid === 'modules_categories') {
      $view_id = 'front_modules';
      $display_id = 'page_categories';
    }

    return parent::handle($view_id, $display_id, $route_match);
  }

}

 

Contenus en rapport

snippet · 5 Jul 2019 Drupal 8 - Surcharger la classe de formulaire d'un terme de taxonomie snippet · 15 Jan 2020 Drupal 8 - Surcharger la page de liste des termes de taxonomie snippet · 18 Jul 2016 Drupal 8 & Drupal 9 - Taxonomy - Charger l'arborescence d'un vocabulaire

Commentaires (0)