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