Drupal 8 - Surcharger la page de liste des termes de taxonomie

Posté le Mercredi 15 janvier 2020 - 08:07
Dernière mise à jour le Lundi 20 janvier 2020 - 11:09

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 garder ce comportement, mais pouvoir quand même ajouter des colonnes, il est possible de surcharger le formulaire gérant cette page.

Cela se passe en 3 étapes :

1. Déclaration du service d'alteration de la route

# mon_module.services.yml
services:
  mon_module.route_subscriber:
    class: Drupal\mon_module\Routing\VocabularyOverviewRouteProvider
    tags:
      - { name: event_subscriber }

2. Altération de la route

<?php
# src/Routing/VocabularyOverviewRouteProvider.php

namespace Drupal\mon_module\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
use Drupal\mon_module\Form\VocabularyOverviewTerms;

class VocabularyOverviewRouteProvider extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Find the route we want to alter
    $route = $collection->get('entity.taxonomy_vocabulary.overview_form');
    // Make a change for default taxonomy overview form.
    $route->setDefault('_form', VocabularyOverviewTerms::class);
    // Re-add the collection to override the existing route.
    $collection->add('entity.taxonomy_vocabulary.overview_form', $route);
  }

}

3. Surcharge du formulaire

Note : Ici je ne modifie le formulaire que pour un seul vocabulaire (etudiant_promos) et j'ajoute une colonne « Domain ».

<?php
# src/Routing/VocabularyOverviewRouteProvider.php
namespace Drupal\mon_module\Form;

use Drupal\taxonomy\Entity\Term;
use Drupal\taxonomy\Form\OverviewTerms;
use Drupal\Core\Form\FormStateInterface;
use Drupal\taxonomy\VocabularyInterface;

class VocabularyOverviewTerms extends OverviewTerms {

  public function buildForm(array $form, FormStateInterface $form_state, VocabularyInterface $taxonomy_vocabulary = NULL) {
    $form = parent::buildForm( $form, $form_state, $taxonomy_vocabulary);
    // Si on ne veut alterer le formulaire que pour un seul vocabulaire
    if($taxonomy_vocabulary && $taxonomy_vocabulary->id() !== 'etudiant_promos') {
      return $form;
    }
    // On ajoute l'entête du tableau
    $form['terms']['#header']['domain'] = $this->t('Domain');
    
    // On parcours les ligne pour ajouter notre colonne
    foreach ($form['terms'] as $key => &$termRow) {
      if(strpos($key, 'tid:') === 0) {
        /** @var \Drupal\taxonomy\Entity\Term $term */
        $term = $termRow['#term'];
        /** @var \Drupal\domain\Entity\Domain $domain */
        $domain = $term->get('domain')->referencedEntities()[0];
        $termRow['domain'] = ['#markup' => $domain->label()];
      }
    }
    return $form;
  }

}

 

 

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