Drupal 8 & Drupal 9 - Afficher un formulaire dans un bloc ou un contrôleur

Posté le Jeudi 15 octobre 2020 - 12:00

Il est possible dans un contrôleur ou un bloc de récupérer un formulaire et de l'afficher comme n'importe quelle autre variable.

À l'époque de drupal 7 on utilisait la fonction drupal_get_form(), à partir de drupal 8, il faut utiliser le service form_builder et sa méthode getForm() en lui passant la classe du formulaire :

#dans la méthode build de mon bloc ou mon controleur :
$build['#mon_formulaire'] = \Drupal::service('form_builder')->getForm(\Drupal\mon_module\Form\LoginForm::class);
$build['#theme'] = 'mon_template';

Note : il est toujours préférable d'injecter le service en utilisant l'injection de dépendance.

Ensuite il sera possible d'afficher le formulaire dans le template via la variable mon_formulaire :

{# Dans le template twig : mon-template.html.twig #}
{{ mon_formulaire }}

Évidement, il ne faut pas oublier d'avoir déclaré la variable mon_formulaire dans la déclaration du template :

//mon_module.module 

function mon_module_theme() {
  $themes = [];
  $themes['mon_template'] = [
    'render element' => 'elements',
    'variables' => [
      'mon_formulaire' => [],
    ],
    'template' => 'mon-template',
  ];

  return $themes;
}

 

Aller plus loin ?

 

Commentaires

Salut,

Merci pour le coup de main !
J'essaye justement d'ajouter un bouton dans un custom block, avec l' action de créer automatiquement un contenu.
le bloc génère plusieurs items, et sous chaque item j'aimerai rajouter un bouton pour créer un contenu. Le contenu doit avoir des champs rempli en fonction de l'item sélectionné.
SI j'appelle dans ma fonction build un formulaire comment lui passer des variables en fonction de l'item sur lequel l'utilisateur clique??
Merci !

Ajouter un commentaire

Ne sera pas publié

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