Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.
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
function mon_module_entity_type_alter(array &$entity_types) {
$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
<?php
namespace Drupal\mon_module\Entity\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\language\Form\LanguageAddForm;
class LanguageCustomAddForm extends LanguageAddForm {
use LanguageCustomTrait;
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$this->getFormCustomFields($form);
return $form;
}
}
modules/custom/mon_module/src/Entity/Form/LanguageCustomEditForm.php
<?php
namespace Drupal\mon_module\Entity\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\language\Form\LanguageEditForm;
class LanguageCustomEditForm extends LanguageEditForm {
use LanguageCustomTrait;
public function form(array $form, FormStateInterface $form_state) {
$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
<?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
Commentaires (0)