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;
}
}
Ajouter un commentaire