Drupal 8 - Ajouter une propriété à un type d'entité config
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
$entity_types['configurable_language']->setFormClass('add', \Drupal\mon_module\Entity\Form\LanguageCustomAddForm::class); $entity_types['configurable_language']->setFormClass('edit', \Drupal\mon_module\Entity\Form\LanguageCustomEditForm::class); }
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
namespace Drupal\mon_module\Entity\Form; use Drupal\Core\Form\FormStateInterface; use Drupal\language\Form\LanguageAddForm; class LanguageCustomAddForm extends LanguageAddForm { use LanguageCustomTrait; $form = parent::form($form, $form_state); $this->getFormCustomFields($form); return $form; } }
modules/custom/mon_module/src/Entity/Form/LanguageCustomEditForm.php
namespace Drupal\mon_module\Entity\Form; use Drupal\Core\Form\FormStateInterface; use Drupal\language\Form\LanguageEditForm; class LanguageCustomEditForm extends LanguageEditForm { use LanguageCustomTrait; $form = parent::form($form, $form_state); $this->getFormCustomFields($form); return $form; } }
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
namespace Drupal\mon_module\Entity\Form; use Drupal\Core\Form\FormStateInterface; use Drupal\language\ConfigurableLanguageInterface; trait LanguageCustomTrait { public function getFormCustomFields(&$form) { /* @var $language \Drupal\language\ConfigurableLanguageInterface */ $language = $this->entity; $form['google_analytics'] = [ '#title' => t('ID Google Analytics'), '#type' => 'textfield', '#default_value' => $language->getThirdPartySetting('mon_module', 'google_analytics') ]; $form['#entity_builders'][] = '::customEntityBuilder'; } function customEntityBuilder($entity_type, ConfigurableLanguageInterface $language, &$form, FormStateInterface $form_state) { if ($form_state->getValue('google_analytics')) { $language->setThirdPartySetting('mon_module', 'google_analytics', $form_state->getValue('google_analytics')); return; } $language->unsetThirdPartySetting('mon_module', 'google_analytics'); } }
évidement, pensez à modifier toutes les occurrences de mon_module par le nom machine de votre module.
Merci à Alexandre Mallet aka @woprrr pour la piste