Drupal 8 - Ajouter une propriété à un type d'entité config

Posté le Vendredi 9 novembre 2018 - 11:08

Voici comment altérer un type d'entité config pour lui ajouter une propriété.

Dans le cas présent, nous allons modifier le type d'entité ConfigurableLanguage afin de lui ajouter un champ google_analytics, pour avoir par exemple un code de tracking différent pour chaque langue.

Commençons par définir les nouveaux formulaire concernant pour l'édition et la création de langue :

modules/custom/mon_module/mon_module.module

  1. function mon_module_entity_type_alter(array &$entity_types) {
  2. $entity_types['configurable_language']->setFormClass('add', \Drupal\mon_module\Entity\Form\LanguageCustomAddForm::class);
  3. $entity_types['configurable_language']->setFormClass('edit', \Drupal\mon_module\Entity\Form\LanguageCustomEditForm::class);
  4. }

 

Ci dessous, le contenu des formulaires qui héritent directement des formulaires de base qu'ils supplantent.

modules/custom/mon_module/src/Entity/Form/LanguageCustomAddForm.php

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Entity\Form;
  4.  
  5. use Drupal\Core\Form\FormStateInterface;
  6. use Drupal\language\Form\LanguageAddForm;
  7.  
  8. class LanguageCustomAddForm extends LanguageAddForm {
  9. use LanguageCustomTrait;
  10.  
  11. public function form(array $form, FormStateInterface $form_state) {
  12. $form = parent::form($form, $form_state);
  13. $this->getFormCustomFields($form);
  14. return $form;
  15. }
  16.  
  17. }

 

modules/custom/mon_module/src/Entity/Form/LanguageCustomEditForm.php

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Entity\Form;
  4.  
  5. use Drupal\Core\Form\FormStateInterface;
  6. use Drupal\language\Form\LanguageEditForm;
  7.  
  8. class LanguageCustomEditForm extends LanguageEditForm {
  9. use LanguageCustomTrait;
  10.  
  11. public function form(array $form, FormStateInterface $form_state) {
  12. $form = parent::form($form, $form_state);
  13. $this->getFormCustomFields($form);
  14. return $form;
  15. }
  16.  
  17. }

 

Enfin, afin d'éviter la répétition de code, je passe par un trait qui contient mes customisations.

Ce trait est appelé dans les classes ci-dessous via l'appel : $this->getFormCustomFields($form);

Ce trait, fait deux choses, dans la méthode getFormCustomFields() il altère le formulaire pour ajouter le champs qui nous intéresse, et via l'appel à la méthode customEntityBuilder(), l'enregistrement de ce champ est effectué.

modules/custom/mon_module/src/Entity/Form/LanguageCustomTrait.php

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Entity\Form;
  4.  
  5. use Drupal\Core\Form\FormStateInterface;
  6. use Drupal\language\ConfigurableLanguageInterface;
  7.  
  8. trait LanguageCustomTrait {
  9.  
  10. public function getFormCustomFields(&$form) {
  11. /* @var $language \Drupal\language\ConfigurableLanguageInterface */
  12. $language = $this->entity;
  13.  
  14. $form['google_analytics'] = [
  15. '#title' => t('ID Google Analytics'),
  16. '#type' => 'textfield',
  17. '#default_value' => $language->getThirdPartySetting('mon_module', 'google_analytics')
  18. ];
  19. $form['#entity_builders'][] = '::customEntityBuilder';
  20. }
  21.  
  22. function customEntityBuilder($entity_type, ConfigurableLanguageInterface $language, &$form, FormStateInterface $form_state) {
  23. if ($form_state->getValue('google_analytics')) {
  24. $language->setThirdPartySetting('mon_module', 'google_analytics', $form_state->getValue('google_analytics'));
  25. return;
  26. }
  27. $language->unsetThirdPartySetting('mon_module', 'google_analytics');
  28. }
  29.  
  30. }

évidement, pensez à modifier toutes les occurrences de mon_module par le nom machine de votre module.

Merci à Alexandre Mallet aka @woprrr pour la piste

 

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