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

Posté le Lundi 14 septembre 2020 - 18:47

À 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

  1. services:
  2. mon_module.route_subscriber:
  3. class: Drupal\mon_module\Routing\TaxonomyListingViewsRoutingSubscriber
  4. tags:
  5. - { name: event_subscriber }

Définition du service

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

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Routing;
  4.  
  5. use Drupal\Core\Routing\RouteSubscriberBase;
  6. use Symfony\Component\Routing\RouteCollection;
  7. use Drupal\Core\Routing\RoutingEvents;
  8.  
  9. class TaxonomyListingViewsRoutingSubscriber extends RouteSubscriberBase {
  10.  
  11. public function alterRoutes(RouteCollection $collection) {
  12. if ($route = $collection->get('entity.taxonomy_term.canonical')) {
  13. $route->setDefault('_controller', '\Drupal\mon_module\Controller\TaxonomyTermViewPageController::handle');
  14. }
  15. }
  16.  
  17. public static function getSubscribedEvents() {
  18. $events = parent::getSubscribedEvents();
  19. $events[RoutingEvents::ALTER] = array('onAlterRoutes', -180);
  20. return $events;
  21. }
  22.  
  23. }

Surcharge du contrôleur

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

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Controller;
  4.  
  5. use Drupal\views\Routing\ViewPageController;
  6. use Drupal\Core\Routing\RouteMatchInterface;
  7.  
  8. class TaxonomyTermViewPageController extends ViewPageController {
  9.  
  10. /**
  11.   * {@inheritdoc}
  12.   */
  13. public function handle($view_id, $display_id, RouteMatchInterface $route_match) {
  14. //Vue et mode d'affichage par défaut
  15. $view_id = 'taxonomy_term';
  16. $display_id = 'page_1';
  17.  
  18. $term = $route_match->getParameter('taxonomy_term');
  19.  
  20. $vid = $term->get('vid')->first()->getValue();
  21. $vid = $vid['target_id'];
  22.  
  23. //on teste le vocabulaire
  24. if ($vid === 'modules_categories') {
  25. $view_id = 'front_modules';
  26. $display_id = 'page_categories';
  27. }
  28.  
  29. return parent::handle($view_id, $display_id, $route_match);
  30. }
  31.  
  32. }

 

Aller plus loin ?

 

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...