web-dev-qa-db-ja.com

プログラムでWebフォームをレンダリングする

ブロックプラグイン内でWebフォームをレンダリングしようとしています。次のコードを使用してWebフォームを正常に取得できます

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

ただし、このフォームをレンダリングしたいと思います。私が使ってみました

return $webform;

しかし、私はエラーを受け取ります

回復可能な致命的なエラー:Drupal\Core\Render\Element :: isEmpty()に渡される引数1は、配列型である必要があります

これは$ webformが適切なレンダー配列としてフォーマットされていないためだと思いますが、これを行う方法がわかりません。元のwebformモジュールのコード内で手がかりを探していましたが、何も見つかりませんでした。

プログラムでWebフォームをどのようにレンダリングしますか?および/またはモジュールまたはエンティティのコードでそのエンティティをレンダリングする方法を見つける方法はありますか?

4
Matt

GetSubmissionFormと呼ばれるwebformエンティティークラスのメソッドをなんとか見つけました。私はそれをsrc/Entity/Webform.phpのwebformモジュールコードで見つけました

そのように呼び出しました

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

return $webform;

レンダリングされた指定のWebフォームを返します。

11
Matt

レンダー配列を返すこともできます。

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

マットの回答は私にとってはうまくいきますが、それを使ってより完全なテーマ構造を作りたい場合は、以下を使用することをお勧めします。

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

このWebフォームをレンダー配列としてレンダリングし、出力に追加するには

5
Pauleau

Blockプラグイン内でWebフォームをレンダリングするには、そのために Block Token module を使用できます。それはあなたのブロックのトークンを作成することができます。

Webフォームブロックを作成するには、Block Layoutに移動し、次にPlaceaに移動します。ブロック、次にブロックのCreate the token for this blockチェックボックスをオンにします。これで、特定のWebフォームがブロックとして利用可能になります。

上記の作成されたWebフォームブロックを手動でレンダリングする例を次に示します。

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