web-dev-qa-db-ja.com

埋め込みビューのキャッシュを無効にするにはどうすればよいですか?

繰り返し Paragraphs フィールドを含むノードタイプ「Article」があります。段落タイプの1つで、エンティティ参照フィールドを使用してビューを埋め込むことができます。ビュー参照を含むArticleノードをレンダリングするときに、選択したビューをhook_preprocess_paragraphに次のように埋め込みます。

$view_id = $paragraph->field_view->target_id;
$view = \Drupal\views\Views::getView($view_id);
$view->setDisplay('embed_1');
$vars['content'] = $view->preview();

これは、キャッシュを有効にする場合を除いて、正常に機能しています。たとえば、私のビューの1つは、「イベント」タイプのノードをリストします。新しいイベントを追加すると、キャッシュを消去するまでリストに表示されません。 「イベント」を挿入/更新/削除するときにキャッシュを強制的に消去することもできますが、Drupal 8のキャッシュタグシステムを使用し、イベントリストを含むキャッシュされたコンテンツのみを無効にする方がよいでしょう。問題は動かせません。

これまでのところ、ノード、ビュー、およびhook_preprocess_paragraphhook_preprocess_nodeの段落に次のようにキャッシュタグを追加してみました。

$vars['paragraph']->addCacheTags(['node_list']);
...
$view->storage->addCacheTags(['node_list']);
...
$vars['node']->addCacheTags(['node_list']);

によると、このページnode_listは、ノードが更新されるたびにキャッシュを無効にするノードリストに使用できます。しかし、効果はありません。多分、前処理フックはキャッシュタグを追加するのが遅いのでしょうか?

何が欠けていますか?

編集:

さらにテストを行った結果、イベントを編集すると変更がリストに表示され、イベントを削除するとリストから消えることがわかりました。この問題は、新しいイベントを追加したときにのみ発生します。

7
reekris

buildRenderable()を使用してみてください。これにより、必要なキャッシュ可能性メタデータが自動的に追加されます。

$vars['content'] = $view->buildRenderable();

ヒント:あなたは私の Views Custom Cache Tag プロジェクトに興味があるかもしれません。イベントが変更されたときにのみビューが変更される場合でも、node_listキャッシュタグは、ノードのタイプが保存されるたびに無効になります。プロジェクトページに示すように、そのモジュールと少しのカスタムコードを使用すると、キャッシュの無効化が少なくなり、パフォーマンスが向上します。

9
Berdir

オブジェクトではなく、キャッシュ配列をレンダー配列に追加します。

$vars['#cache']['tags'][] = 'node_list';

前処理では、オブジェクトではなくレンダー配列を操作します。ドキュメントのこのページを見てください: https://www.drupal.org/developing/api/8/render/arrays/cacheability

3
4k4

モジュール Views Custom Cache Tag を使用して同様の問題を解決しました:

ビューエディターの[詳細設定]で、[キャッシュ]をクリックし、[カスタムタグベース]を選択します。ノードが変更されるたびにビューを再レンダリングするには、カスタムタグ設定に「node_list」と入力します。

0
Hendrik