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

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

2. Altération de la route

  1. <?php
  2. # src/Routing/VocabularyOverviewRouteProvider.php
  3.  
  4. namespace Drupal\mon_module\Routing;
  5.  
  6. use Drupal\Core\Routing\RouteSubscriberBase;
  7. use Symfony\Component\Routing\RouteCollection;
  8. use Drupal\mon_module\Form\VocabularyOverviewTerms;
  9.  
  10. class VocabularyOverviewRouteProvider extends RouteSubscriberBase {
  11.  
  12. /**
  13.   * {@inheritdoc}
  14.   */
  15. protected function alterRoutes(RouteCollection $collection) {
  16. // Find the route we want to alter
  17. $route = $collection->get('entity.taxonomy_vocabulary.overview_form');
  18. // Make a change for default taxonomy overview form.
  19. $route->setDefault('_form', VocabularyOverviewTerms::class);
  20. // Re-add the collection to override the existing route.
  21. $collection->add('entity.taxonomy_vocabulary.overview_form', $route);
  22. }
  23.  
  24. }

3. Surcharge du formulaire

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

  1. <?php
  2. # src/Routing/VocabularyOverviewRouteProvider.php
  3. namespace Drupal\mon_module\Form;
  4.  
  5. use Drupal\taxonomy\Entity\Term;
  6. use Drupal\taxonomy\Form\OverviewTerms;
  7. use Drupal\Core\Form\FormStateInterface;
  8. use Drupal\taxonomy\VocabularyInterface;
  9.  
  10. class VocabularyOverviewTerms extends OverviewTerms {
  11.  
  12. public function buildForm(array $form, FormStateInterface $form_state, VocabularyInterface $taxonomy_vocabulary = NULL) {
  13. $form = parent::buildForm( $form, $form_state, $taxonomy_vocabulary);
  14. // Si on ne veut alterer le formulaire que pour un seul vocabulaire
  15. if($taxonomy_vocabulary && $taxonomy_vocabulary->id() !== 'etudiant_promos') {
  16. return $form;
  17. }
  18. // On ajoute l'entête du tableau
  19. $form['terms']['#header']['domain'] = $this->t('Domain');
  20.  
  21. // On parcours les ligne pour ajouter notre colonne
  22. foreach ($form['terms'] as $key => &$termRow) {
  23. if(strpos($key, 'tid:') === 0) {
  24. /** @var \Drupal\taxonomy\Entity\Term $term */
  25. $term = $termRow['#term'];
  26. /** @var \Drupal\domain\Entity\Domain $domain */
  27. $domain = $term->get('domain')->referencedEntities()[0];
  28. $termRow['domain'] = ['#markup' => $domain->label()];
  29. }
  30. }
  31. return $form;
  32. }
  33.  
  34. }

 

 

 

Commentaires

Posté le Mardi 4 février 2020 - 09:17

Your article is very good, I have read many articles but I am really impressed with your posts. Thank you, I will review this article. To know about me, try talking to me.

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