通常のDrupal8コンテンツエンティティがあり、エンティティフォームビルダー用に追加の引数を設定したいのですが。
つまり、次のようなエンティティフォームパスがあります:/ tilaus/uusi/{tilaus_type}そして、次のように追加のパラメーターを追加します:/ tilaus/uusi/{tilaus_type}/{some_additional_argument}。できれば、これらのURLが両方とも機能するようにして、buildFormメソッドで欠落している引数を処理できるようにします。
しばらく探していましたが、エンティティフォームのパスに要素を追加する方法が見つかりません。通常のフォームで結構ですが、私はそれらの処理方法を知っています。エンティティのルーティングがわからないようです。
だから:エンティティフォームのURLとビルダーに追加の引数を追加するには?
乾杯、
ジャンヌ
エンティティ追加フォームは、新しいエンティティで作成されます。そして、このエンティティを作成するときに、このパラメータを使用できます。このブロックモジュールの例を参照してください。
追加のパラメーターを持つ新しいルート:
block.routing.yml
block.admin_add:
path: '/admin/structure/block/add/{plugin_id}/{theme}'
defaults:
_controller: '\Drupal\block\Controller\BlockAddController::blockAddConfigureForm'
theme: null
_title: 'Configure block'
requirements:
_permission: 'administer blocks'
これにより、パラメータtheme
が追加されます。
そして、このルートのコントローラー:
BlockAddController.php
public function blockAddConfigureForm($plugin_id, $theme) {
// Create a block entity with prepopulated values.
$entity = $this->entityManager()->getStorage('block')->create([
'plugin' => $plugin_id,
'theme' => $theme,
]);
return $this->entityFormBuilder()->getForm($entity);
}
ここでは、エンティティの作成時に追加のパラメーターtheme
が使用されます。
両方のルートを同時に使用しても問題ありません。エンティティアノテーションで構成された標準のエンティティルートは引き続き有効です。
エンティティフォームでパラメータを使用する別の方法は、3番目のパラメータ$form_state_additions
:
$form_state_additions['langcode'] = $langcode;
$form = \Drupal::service('entity.form_builder')->getForm($entity, 'default', $form_state_additions);
この例はエンティティformbuilderのソースからのものです:
ここで2つの質問をしています。私はすべてのフォームに対して一般的な用語で両方に答えようとしましたが、エンティティフォームの詳細は少し特殊です。
これはかなり単純です。ルートのデフォルト値を指定できます。たとえば、次のようなルーティングファイルがあるとします。
_some.route:
path: '/foo/{bar}/{baz}'
defaults:
baz: 42
...
_
defaults
を使用すると、パラメーターのデフォルト値を指定できます。デフォルト値はいくつでも指定でき、不明なパラメータがなくなったときにDrupalがそれをキャッチします。上記の例では、bar
そう
foo/some-value
_foo/some-value/42
_どちらも同じ結果になります
これを行うには2つの方法があります。 _::buildForm
_メソッドで使用できるフォームビルダーのgetForm
にパラメーターを追加できます。 EntityFormBuilder
は、これに対するサポートがすでにあるという点で少し特殊です。フォームを取得するための3つの引数は、_::buildForm
_および_::form
_
コードでは(エンティティフォームクラスの場合)、次のようになります。
_$form = \Drupal::service('entity.form_builder')->getForm($entity, 'default', ['bar' => 'some_data']);
_
エンティティフォームクラス
_public function form(array $form, FormStateInterface $form_state) {
$storage = $form_state->getStorage();
$storage['bar'] == 'some_data';
}
_
他の方法は、しばしば少し複雑です。エンティティフォームビルドを使用する代わりに、フォームクラスをインスタンス化して、必要なものを_::__construct
_に追加できます。エンティティフォームは、コンストラクタがないため少し特殊であり、代わりにフォームクラスを取得するためのセッターとメソッドがあります。
エンティティフォームのコードでは、次のようになります。
_$form_object = \Drupal::entityTypeManager->getFormObject($entity_id, $operation);
$form_object->setEntity($entity);
$form_object->setCustomValue($value);
$form_render = \Drupal::formBuilder->getForm($form_object);
_
この後者の方法の利点は、フォームクラスに追加したデータがすべてのメソッド呼び出しで使用できることです。 1つの問題として、同じフォームの複数のバリエーションを同じページに表示する必要がある場合があります。 Drupalこれを行うには、getFormId
メソッドで処理できる一意のフォームIDが必要です。または、乱雑になるサービスを使用する必要があるかもしれません。フォーム構築メソッドを使用してフォームをどこかに保存し、送信プロセスに渡します。
次のように、フォームビルダーでリクエストパラメータに直接アクセスできます。
/**
* {@inheritdoc}
*/
public function form(array $form, FormStateInterface $form_state) {
$some_additional_argument = $this->getRequest()->get('some_additional_argument');
}