Drupal 8 - rendre un formulaire dans un template

Posté le Mercredi 5 juin 2019 - 09:36
Dernière mise à jour le Mardi 3 novembre 2020 - 08:24

La form api de drupal est très puissante, mais pour jouer avec le markup html avec les #prefix et #suffix peut s'avérer rapidement complexe en plus d'être un peu sale au niveau du code.

Dans drupal 8 il est possible de facilement utiliser un template pour un formulaire. Pour cela il faut se baser sur le nom machine du formulaire.

Cela fonctionne pour nos formulaires custom, mais aussi pour les formulaires des modules tiers ou du core. Je vais ici utiliser un template pour le formulaire user_form qui correspond au formulaire de modification du compte utilisateur. Le nom machine de ce formulaire est user_form.

Définition du template :

Fichier : mon_module.module

  1. function mon_module_theme() {
  2. $theme = [];
  3. $theme['user_form'] = [
  4. 'render element' => 'form',
  5. 'template' => 'user-form',
  6. ];
  7. return $theme;
  8. }

J'utilise comme clé de thème le nom machine du formulaire.

Je peux ensuite créer dans le dossier templates de mon thème le fichier user-form.html.twig : (attention au _ remplacé par un -)

  1. <div>
  2. <p>Test</p>
  3. {{ form }}
  4. <div>

On peut rendre des champs « manuellement », mais il ne faut pas oublier de rendre le formulaire form à la fin : 

  1. <div>
  2. {{ form.form_build_id }}
  3. {{ form.form_token }}
  4. {{ form.form_id }}
  5. <p>Test</p>
  6. <div class="col-sm-6">
  7. {{ form.mon_champ_1 }}
  8. </div>
  9. <div class="col-sm-6">
  10. {{ form.mon_champ_2 }}
  11. </div>
  12. {{ form | without('mon_champ_1', 'mon_champ_2') }}
  13. <div>

Note, il est aussi possible de spécifier un template autre dans un form alter par exemple :

  1. function MON_MODULE_form_views_exposed_form_alter(&$form, &$form_state) {
  2. if ($form['#id'] === 'views-exposed-form-recherche-page') {
  3. $form['#theme'] = 'form_recherche_block';
  4. }
  5. }

 

Aller plus loin ?

 

Commentaires

Christophe CARON

Posté le Mercredi 6 mai 2020 - 14:55

Sur cet article j'ai un doute Kevin,
il me semble que le render array form contient la totale : la balise form, les champs, les quelques input hidden genre form_id form_token, etc..
si tu sors deux champs de {{form}} est ce qu'ils ne sont pas de faite sortie de la base et non soumis?

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...