logo

Types de blocs supplémentaires (EBT) – Nouvelle expérience de Layout Builder❗

Types de blocs supplémentaires (EBT) – types de blocs stylisés et personnalisables : diaporamas, onglets, cartes, accordéons et bien d’autres. Paramètres intégrés pour l’arrière-plan, la boîte DOM, les plugins JavaScript. Découvrez dès aujourd’hui le futur de la création de mises en page.

Démo des modules EBT Télécharger les modules EBT

❗Types de paragraphes supplémentaires (EPT) – Nouvelle expérience Paragraphes

Types de paragraphes supplémentaires (EPT) – ensemble de modules basé sur les paragraphes analogiques.

Démo des modules EPT Télécharger les modules EPT

Défilement
04/07/2025, by Ivan

Menu

Dans les articles précédents, nous avons vu ce que sont les Services, l’Injection de Dépendances (DI) et comment les utiliser dans un Controller ou un bloc :

12.15. Services et Injection de Dépendances.
12.15.1. Injection de Dépendances dans un contrôleur
12.15.2. Injection de Dépendances dans un bloc

Dans cet article, un exemple montrant comment ajouter des services via DI dans une classe de formulaire héritant de FormBase :

<?php

namespace Drupal\drupalbook\Form;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Egulias\EmailValidator\EmailValidator;

/**
 * Classe ModalForm.
 */
class ModalForm extends FormBase {

  /**
   * Validateur d’email.
   *
   * @var \Egulias\EmailValidator\EmailValidator
   */
  protected $emailValidator;

  /**
   * Constructeur de ModalForm.
   *
   * @param \Egulias\EmailValidator\EmailValidator $email_validator
   *   Le validateur d’email.
   */
  public function __construct(EmailValidator $email_validator) {
    $this->emailValidator = $email_validator;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('email.validator')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'drupalbook_contact_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) {
    $form['email'] = [
      '#type' => 'email',
      '#title' => $this->t('Email'),
      '#description' => $this->t('Votre adresse email'),
      '#required' => TRUE,
    ];

    $form['actions']['send'] = [
      '#type' => 'submit',
      '#value' => $this->t('Envoyer'),
    ];

    return $form;
  }

  /**
   * Validation de l’email.
   */
  protected function validateEmail(array &$form, FormStateInterface $form_state) {
    if (!$this->emailValidator->isValid($form_state->getValue('email'))) {
      return FALSE;
    }
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $email = $form_state->getValue('email');

    if (!empty($email)) {
      if (!$this->validateEmail($form, $form_state)) {
        $form_state->setErrorByName('email', $this->t('%email est une adresse email invalide.', ['%email' => $email]));
      }
    }
    else {
      $form_state->setErrorByName('email', $this->t("Veuillez saisir une adresse email."));
    }
    $form_state->setValue('email', $email);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // Traitement à l’envoi du formulaire.
  }

  /**
   * Obtient les noms des configurations modifiables.
   *
   * @return array
   *   Un tableau des noms d’objets de configuration modifiables.
   */
  protected function getEditableConfigNames() {
    return ['config.drupalbook_contact_form'];
  }
}

Pour appeler un service via DI dans un formulaire, on utilise les méthodes __construct et create(), comme nous l’avons fait pour les blocs.