web-dev-qa-db-fra.com

Rendre un formulaire Web par programme

J'essaie de rendre un formulaire Web à l'intérieur d'un plugin de bloc. Je peux récupérer le formulaire Web avec succès à l'aide du code suivant

$webform = \Drupal::entityTypeManager()->getStorage('webform')->load('my_webform');

Cependant, je voudrais rendre ce formulaire. J'ai essayé d'utiliser

return $webform;

Mais je reçois l'erreur

Erreur fatale récupérable: l'argument 1 passé à Drupal\Core\Render\Element :: isEmpty () doit être du type tableau, objet donné

Je suppose que c'est parce que $ webform n'est pas formaté comme un tableau de rendu approprié, mais je ne sais pas comment faire. J'ai cherché des indices dans le code du module webform original, mais je n'ai rien trouvé.

Comment puis-je rendre un formulaire Web par programme? Et/ou existe-t-il un moyen de trouver dans le code d'un module ou d'une entité le moyen de rendre cette entité?

4
Matt

J'ai réussi à trouver une méthode pour la classe d'entité de formulaire Web appelée getSubmissionForm. Je l'ai trouvé dans le code du module webform dans src/Entity/Webform.php

Je l'ai invoqué comme ça

$webform = \Drupal::entityTypeManager()->getStorage('webform')->load('my_webform');
$webform = $webform->getSubmissionForm();

return $webform;

Qui a renvoyé le formulaire Web spécifié.

11
Matt

Vous pouvez également simplement renvoyer un tableau de rendu.

[
  '#type' => 'webform',
  '#webform' => 'my_webform',
  '#default_data' => [
    'nid' => 10
  ]
]
5
Marek Vantuch

Matt répond pour moi, mais si vous voulez avoir une structure de thème plus complète avec lui, vous feriez mieux d'utiliser:

$webform      = \Drupal::entityTypeManager()->getStorage('webform')->load('my_webform');
$view_builder = \Drupal::service('entity_type.manager')->getViewBuilder('webform');
$build        = $view_builder->view($webform);
return $build;

Pour rendre ce formulaire Web sous forme de tableau de rendu et l'ajouter à votre sortie

5
Pauleau

Pour rendre un Webform à l'intérieur d'un plugin Block, vous pouvez utiliser module Token Block pour cela. Il vous permettra de créer les jetons pour vos blocs.

Pour créer un bloc de formulaire Web, accédez à Disposition des blocs , puis Placez a bloc, puis cochez la case Créez le jeton pour ce bloc pour le bloc. Le formulaire Web spécifique doit maintenant être disponible sous forme de bloc.

Voici l'exemple pour rendre manuellement le bloc de formulaire Web créé ci-dessus:

$block = BlockViewBuilder::lazyBuilder('mywebform', 'full', 1);
$block_content = render($block);
2
kenorb