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

9.8. Travailler avec les formulaires dans Drupal. Ajouter un formulaire de configuration de manière programmatique.

07/07/2025, by Ivan

Menu

Dans ce tutoriel, nous allons aborder l'API des formulaires de Drupal et créer un formulaire de paramètres pour le module. Nous avons déjà créé des modules pour afficher une page et un bloc, créons maintenant un formulaire de configuration dans lequel nous stockerons des données pour se connecter à un service conditionnel. Par exemple, nous devons stocker la clé API et l’ID client API sur le site, pour l’API Google Maps par exemple.

Les exemples de code sont disponibles sur github :
https://github.com/levmyshkin/drupalbook8

Nous pourrions stocker ces données dans settings.php et ajouter ces paramètres dans git. Mais ce ne serait pas sûr, il est préférable de stocker l’accès aux services dans la base de données.

Formulaire de paramètres

Ajoutons une nouvelle route pour notre formulaire :

modules/custom/drupalbook/drupalbook.routing.yml

drupalbook.settings:
  path: '/admin/structure/drupalbook/settings'
  defaults:
    _form: '\Drupal\drupalbook\Form\DrupalbookSettingsForm'
    _title: 'Formulaire de paramètres DrupalBook'
  requirements:
    _permission: 'administer site configuration'

Contrairement aux routes précédentes où dans defaults on précisait _controller, ici on précise _form. En effet, nous ne créerons pas une classe Controller pour le formulaire, mais une classe Form. Créons un fichier pour cette classe :

modules/custom/drupalbook/src/Form/DrupalbookSettingsForm.php

Vous devrez créer un dossier Form dans src pour vos formulaires. Cela permet de structurer le code du module en dossiers séparés et de retrouver facilement le code nécessaire selon le nom des dossiers.

Ajoutez le code suivant pour le formulaire et analysons chaque bloc :

<?php

namespace Drupal\drupalbook\Form;
 
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
 
/**
 * Configuration des paramètres exemple pour ce site.
 */
class DrupalbookSettingsForm extends ConfigFormBase {
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'drupalbook_admin_settings';
  }
 
  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'drupalbook.settings',
    ];
  }
 
  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('drupalbook.settings');
 
    $form['drupalbook_api_key'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API Key'),
      '#default_value' => $config->get('drupalbook_api_key'),
    ];
 
    $form['drupalbook_api_client_id'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API Client ID'),
      '#default_value' => $config->get('drupalbook_api_client_id'),
    ];
 
    return parent::buildForm($form, $form_state);
  }
 
  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // Récupérer la configuration éditable
    $this->configFactory->getEditable('drupalbook.settings')
      // Enregistrer la clé API soumise
      ->set('drupalbook_api_key', $form_state->getValue('drupalbook_api_key'))
      // Enregistrer l’ID client API soumis
      ->set('drupalbook_api_client_id', $form_state->getValue('drupalbook_api_client_id'))
      ->save();
 
    parent::submitForm($form, $form_state);
  }
}

Nous avons déjà vu les namespaces et use, Drupal les utilise pour charger automatiquement les classes nécessaires :

namespace Drupal\drupalbook\Form;
 
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

Pour créer un formulaire de configuration, on hérite de ConfigFormBase qui implique que les données du formulaire seront enregistrées dans la configuration :

extends ConfigFormBase {

Ensuite, on précise un ID de formulaire unique :

public function getFormId() {
  return 'drupalbook_admin_settings';
}

On indique les noms des configurations éditables que le formulaire modifie :

protected function getEditableConfigNames() {
  return [
    'drupalbook.settings',
  ];
}

Voici comment créer les champs du formulaire. Vous pouvez consulter la documentation de l’API Form pour découvrir tous les types de champs :

https://api.drupal.org/api/drupal/elements/8.5.x

Nous avons ici deux champs de type textfield :

$form['drupalbook_api_key'] = [
  '#type' => 'textfield',
  '#title' => $this->t('API Key'),
  '#default_value' => $config->get('drupalbook_api_key'),
];

$form['drupalbook_api_client_id'] = [
  '#type' => 'textfield',
  '#title' => $this->t('API Client ID'),
  '#default_value' => $config->get('drupalbook_api_client_id'),
];

On retourne le formulaire construit avec parent::buildForm() :

return parent::buildForm($form, $form_state);

La méthode submitForm() s’exécute si le formulaire a été soumis sans erreur. Si un champ requis est vide, la validation échoue et submitForm() n’est pas appelée. Pour valider les données, on utilise validateForm() (non montré ici).

Dans submitForm(), on récupère les valeurs soumises et on met à jour la configuration :

public function submitForm(array &$form, FormStateInterface $form_state) {
  $this->configFactory->getEditable('drupalbook.settings')
    ->set('drupalbook_api_key', $form_state->getValue('drupalbook_api_key'))
    ->set('drupalbook_api_client_id', $form_state->getValue('drupalbook_api_client_id'))
    ->save();

  parent::submitForm($form, $form_state);
}

On appelle aussi la méthode parente qui affiche un message de confirmation. Vous pouvez la remplacer par votre propre message :

// parent::submitForm($form, $form_state);
drupal_set_message($this->t('Mon super formulaire a été enregistré !'));

N’oubliez pas de vider le cache pour que la route soit prise en compte. Vous pouvez maintenant tester votre formulaire. Pour récupérer la clé API, utilisez ce code :

$config = \Drupal::config('drupalbook.settings');
$api_key = $config->get('drupalbook_api_key');
$api_client_id = $config->get('drupalbook_api_client_id');

Ce code fonctionne dans n’importe quel module ou fonction de prétraitement, car Drupal utilise un système de configuration unique.

C’est tout pour cette leçon sur les formulaires. Dans la prochaine, nous verrons comment créer des formulaires à plusieurs étapes.

Les exemples de code sont disponibles sur github :
https://github.com/levmyshkin/drupalbook8