Drupal - Afficher un formulaire dans un bloc ou un contrôleur

Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.

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;
}

 

Contenus en rapport

snippet · 5 Jun 2019 Drupal 8 - rendre un formulaire dans un template 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… snippet · 17 Nov 2017 Drupal 8 - Views - Récupérer un formulaire exposé Pour un besoin spécifique, il fallait que je récupère un formulaire exposé de views pour l'afficher ailleurs. Il fallait en fait qu'à un endroit j'affiche les…

Commentaires (1)

Comments

Christophe (non vérifié)

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 !