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
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.
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 filtres exposés et à un autre le tri exposé.
J'ai donc créé un bloc, qui récupère ce formulaire, masque un champ.
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