À 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
Hier, nous avons vu comment surcharger le formulaire de création / modification d'un nœud, voici aujourd'hui comment faire la même chose mais pour un terme de taxonomie.
La page par défaut de liste des termes de taxonomie de drupal 8 n'est pas très flexible. Elle peut facilement être substituée à une vue mais dans ce cas on perd le « drag'n'drop » dans le cas d'une arborescence.
Pour charger toute l'arborescence :
$categories = \Drupal::service('entity_type.manager')
->getStorage('taxonomy_term')
->loadTree('NOM_MACHINE_VOCABULAIRE');
Pour charger que l'arborescence en partant d'un taxon (term) donné :
Ajouter un commentaire