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

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

Aller plus loin ?

Ajouter un commentaire

Ne sera pas publié

Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...