web-dev-qa-db-ja.com

現在のノードIDをブロックテンプレートに渡す

現在のページのnidを取得し、値をブロックテンプレートに渡すカスタムブロックMyCustomBlock.phpを含むモジュールがあります。

$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->nid->value;
return array(
  'currentnid' => $nid,
);

テンプレート内で、渡された値{{currentnid}}を出力しますが、これはキャッシュのクリーニングのみで機能します!たとえば、nid 5のページをロードすると5が印刷されますが、nid 3のページに移動すると5が印刷されます。キャッシュを消去し、nid 3でページをリロードすると、値3が印刷されます。 D8のテンプレートキャッシングシステムの問題だと思いますが、これについて何か考えはありますか?

4
Gabriele

ブロックはキャッシュされます。ただし、ブロックはDrupal 8でもコンテキストに対応しています。キャッシュコンテキストに関するドキュメントページでは、次のようになっています。

キャッシュコンテキストは、キャッシュする必要がある何かのコンテキスト依存のバリエーションを作成する宣言的な方法を提供します。宣言型にすることで、キャッシュを作成するコードが読みやすくなり、同じコンテキストのバリエーションが必要なすべての場所で同じロジックを繰り返す必要がなくなります。

Cache API のドキュメントページは、どなたにもお読みいただけます。

BlockプラグインはgetCacheContextsを実装する必要があります。この場合、 "route.name"または "url.path"のいずれかである必要があると思います。特定のユースケースでは、これについてもう少し掘り下げる必要があるかもしれません。

  public function getCacheContexts() {
    return array('route.name');
  }
4
mradcliffe

これを行う適切な方法は、コンテキストを使用することです。キャッシュコンテキストではなく、プラグインコンテキスト。

NodeType 条件プラグインと同様に、プラグインアノテーションに次のように記述します。

* context_definitions = {
*  "node" = @ContextDefinition("entity:node", label = @Translation("Node"))
* }

次に、$ this-> getContextValue( 'node')を使用してノードを取得します。

これには2つの利点があります。

  • ブロックはグローバルな状態に直接依存していません。たとえば、別のノードを持つページマネージャーでも使用できます。
  • Drupalは、渡されるノードによってブロックが変化することを自動的に理解します。現在のノードを使用している場合は、ルートによって変化します。静的ページマネージャーコンテキストからのノードである場合、そうではありません。出力に影響を与えるような方法でノードが変更された場合に備えて、キャッシュタグも含まれます。
7
Berdir