web-dev-qa-db-ja.com

「操作」リンクをカスタムルートに追加する方法

Drupal 8.のバンドルでカスタムエンティティを実装しています。

バンドルエンティティのリストページ(つまり、ノードのコンテンツタイプのリストページに相当)で、リストの追加オプションを提供したいと思います- operationsには現在Edit、Manage Fields、Manage Display、Deleteが含まれており、ユーザーはそのバンドルのエンティティを作成できます。したがって、これがノード上にある場合は、コンテンツリストページの各コンテンツタイプに「コンテンツの追加」リンクを追加するようなもので、/node/add/{node_type}

これまでに持っていた関連コード:

Configエンティティのアノテーションのリンクセクションに「add-entity」オプションを追加しました。

* @ConfigEntityType(
*   id = "bloom_stem_type",
*   label = @Translation("BloomStemType"),
*   bundle_of = "bloom_stem",
*   ...
*   links = {
*     "edit-form" = "entity.bloom_stem_type.edit_form",
*     "delete-form" = "entity.bloom_stem_type.delete_form",
*     "collection" = "entity.bloom_stem_type.collection",
*     "add-entity" = "entity.bloom_stem.add_form"
*   }
* )
*/

これは別のエンティティのルート、つまりこれがバンドルである実際のエンティティを指していることに注意してください。

そのルートは(routing.yml)で定義されています:

entity.bloom_stem.add_form:
  path: '/admin/bloom_stem/{bloom_stem_type}/add'
  defaults:
    _title: 'Add BloomStem'
    _controller: '\Drupal\bloom\Controller\BloomStemController::addForm'
  requirements:
    _entity_create_access: 'bloom_stem'

次に、カスタムリストビルダークラスにgetDefaultOperationsを実装しました。

class BloomStemTypeListBuilder extends ConfigEntityListBuilder {
  ...
  /**
   * Gets this list's default operations.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   The entity the operations are for.
   *
   * @return array
   *   The array structure is identical to the return value of
   *   self::getOperations().
   */
  public function getDefaultOperations(EntityInterface $entity) {
    $operations = parent::getDefaultOperations($entity);

    $operations['add'] = array(
      'title' => $this->t('Add'),
      'weight' => 10,
      'url' => $entity->urlInfo('add-entity'),
    );

    return $operations;
  }

しかし、エンティティバンドルリストページにアクセスすると、ルート/パスを作成できないという例外がスローされます。ステップスルーデバッグでは、これは Entity :: urlInfo() が独自のルートを構築する次の行のおかげで、アノテーションに設定されたルートを使用していないように見えるためです。

$route_name = "entity.{$this->entityTypeId}." . str_replace(array('-', 'drupal:'), array('_', ''), $rel);

唯一の documentation 注釈のlinks部分で見つけることができるのは、

リンク
エンティティURLの定義。MODULE.routing.ymlからのルートを参照します。 'canonical'はエンティティのデフォルトルートです。編集フォームと削除フォームも設定できます。これらは主にフィールドUIに使用されます。ここで任意のキーを設定できます。たとえば、ユーザーはキャンセルフォームを設定し、Nodeは削除フォームを使用します。

これは、「MODULE.routing.ymlからのルートを参照する」という意味ですが、ルートを参照すると、そのルートが使用されます。

余談:私が試した他のことには、URLをより直接的に作成することが含まれます(明らかに正しい方法ではありません)。

$url = \Drupal::getContainer()->get('url_generator')
  ->generateFromRoute('entity.bloom_stem.add_form', ['bloom_stem_type'=>$entity->id()]);

これは有効なパスを生成しますが、文字列値は、getOperationsキー出力の下でurlが出力すると予期されるものではありません。

これがどのように機能するか/私が間違っている場所について誰かが私に記入できますか?ありがとう。

2
artfulrobot

使用しているdrupalコアバージョンは何ですか?

リンクテンプレートは、数か月前にルート名ではなくリンクに変更されました。 Nodeおよびその他のエンティティタイプの例を参照してください。

別の要件は、リンクテンプレート名とルート名が一致する必要があることです。

ただし、主な問題は、エンティティまたは少なくともエンティティタイプに関するテンプレートをリンクすることであり、この例ではそうではありません。

操作にリンクテンプレートを使用すると、可能な場合は便利ですが、必須ではありません。任意のUrlオブジェクトを使用できます。したがって、最後の試みは実際には終わりです。まだ適切なAPIを使用していないだけです(もちろん、リンクやURLを生成する方法が多すぎます)。

これを試して:

\Drupal\Core\Url::fromRoute('entity.bloom_stem.add_form', ['bloom_stem_type' => $entity->id()])

次に、それを「url」に使用します。

2
Berdir