====== Formulaire ====== Définir une route qui mène au formulaire : mymodule.form: path: '/mon-formulaire' defaults: _form: '\Drupal\mymodule\Form\MyForm' _title: 'Mon premier formulaire' requirements: _permission: 'access content' ===== Construction du formulaire ===== public function buildForm( array $form, FormStateInterface $form_state ) { $node = \Drupal::routeMatch()->getParameter('node'); $nid = $node->nid->value; // CHAMP DE TYPE TEXTE $form['name'] = [ '#title' => t('Name'), '#type' => 'textfield', '#size' => 50, '#description' => t("Your name."), '#required' => True, ]; // CHAMP DE TYPE EMAIL $form['email'] = [ '#title' => t('Email Address'), '#type' => 'email', '#size' => 25, '#description' => t("We'll send update to this address."), '#required' => True, ]; // BOUTON SUBMIT $form['submit'] = [ '#type' => 'submit', '#value' => t('Save'), ]; // CHAMP CACHÉ $form['nid'] = [ '#type' => 'hidden', '#value' => $nid, ]; return $form; } ===== Validation du formulaire ===== public function validateForm( array &$form, FormStateInterface $form_state ) { $value = $form_state->getValue('email'); if(!\Drupal::service('email.validator')->isValid($value)) { $form_state->setErrorByName( 'email', t('The email address %mail is not valid.', ['%mail' => $value]) ); } } L'appel à **setErrorByName** stoppe le traitement du formulaire, et **submitForm** ne sera pas appelé. Le formulaire est réaffiché et le message d'erreur est inclus sur la page. ===== Soumission du formulaire ===== public function submitForm( array &$form, FormStateInterface $form_state ) { // Afficher un message à l'utilisateur \Drupal::messenger()->addMessage("Le formulaire a été correctement posté."); }