web-dev-qa-db-ja.com

エンティティは追加の引数を形成します

通常のDrupal8コンテンツエンティティがあり、エンティティフォームビルダー用に追加の引数を設定したいのですが。

つまり、次のようなエンティティフォームパスがあります:/ tilaus/uusi/{tilaus_type}そして、次のように追加のパラメーターを追加します:/ tilaus/uusi/{tilaus_type}/{some_additional_argument}。できれば、これらのURLが両方とも機能するようにして、buildFormメソッドで欠落している引数を処理できるようにします。

しばらく探していましたが、エンティティフォームのパスに要素を追加する方法が見つかりません。通常のフォームで結構ですが、私はそれらの処理方法を知っています。エンティティのルーティングがわからないようです。

だから:エンティティフォームのURLとビルダーに追加の引数を追加するには?

乾杯、

ジャンヌ

1
Janne Suominen

エンティティ追加フォームは、新しいエンティティで作成されます。そして、このエンティティを作成するときに、このパラメータを使用できます。このブロックモジュールの例を参照してください。

追加のパラメーターを持つ新しいルート:

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のソースからのものです:

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityFormBuilderInterface.php/8.2.x

2
4k4

ここで2つの質問をしています。私はすべてのフォームに対して一般的な用語で両方に答えようとしましたが、エンティティフォームの詳細は少し特殊です。

1.ルートでオプションパラメータをどのように処理しますか?

これはかなり単純です。ルートのデフォルト値を指定できます。たとえば、次のようなルーティングファイルがあるとします。

_some.route:
  path: '/foo/{bar}/{baz}'
  defaults:
    baz: 42
  ...
_

defaultsを使用すると、パラメーターのデフォルト値を指定できます。デフォルト値はいくつでも指定でき、不明なパラメータがなくなったときにDrupalがそれをキャッチします。上記の例では、bar そう

  • _foo/some-value_
  • _foo/some-value/42_

どちらも同じ結果になります

2. en(エンティティ)フォームに追加のパラメーターを追加するにはどうすればよいですか?

ソリューションa

これを行うには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';
}
_

ソリューションb

他の方法は、しばしば少し複雑です。エンティティフォームビルドを使用する代わりに、フォームクラスをインスタンス化して、必要なものを_::__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が必要です。または、乱雑になるサービスを使用する必要があるかもしれません。フォーム構築メソッドを使用してフォームをどこかに保存し、送信プロセスに渡します。

1
googletorp

次のように、フォームビルダーでリクエストパラメータに直接アクセスできます。

/**
 * {@inheritdoc}
 */
public function form(array $form, FormStateInterface $form_state) {

  $some_additional_argument = $this->getRequest()->get('some_additional_argument');

}
1
ya.teck