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

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

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...