web-dev-qa-db-ja.com

特定のバンドルのノードが追加または更新されたときに、ブロックのキャッシュをどのようにクリアしますか?

ノードが更新されたときにレンダー配列のキャッシュをクリアしたい場合は、cache_tag、 "node_list"として追加できます。

  '#cache' => [
    'tags' => ['node_list']
  ],

ただし、特定のバンドルのノードのみが追加または更新される場合、これを行う方法はありません。

たとえば、ブロックがあり、バンドル「article」を持つノードが追加または更新されたときに、そのキャッシュをクリアしたい場合、どのようにしますか?

6
oknate

自分で無効にすることにより、ノードのプロパティに関連するカスタムキャッシュタグを簡単に作成できます。

この記事に基づく: https://www.drupal.org/project/views_custom_cache_tag

ノードタイプごとにカスタムタグを作成しましたが、ノードの更新時に無効になります。

/**
 * Implements hook_ENTITY_TYPE_presave().
 */
function mymodule_node_presave(Node $node) {
  // Allows for clearing of blocks based on node type.
  $tags = ['node_type:' . $node->getType()];
  Cache::invalidateTags($tags);
}

/**
 * Implements hook_ENTITY_TYPE_delete().
 */
function mymodule_node_delete(Node $node) {
  // Allows for clearing of blocks based on node type.
  $tags = ['node_type:' . $node->getType()];
  Cache::invalidateTags($tags);
}

次に、私のブロックのビルド配列に追加しました:

$build['#cache'] = [
  'tags' => [
    'node_type:article',
    'node_type:video'
  ],
];

つまり、このブロックは、「article」または「video」タイプのノードが作成または更新されたときにのみ更新されます。

バンドルするだけでなく、エンティティの任意のプロパティに対して同じプロセスを実行できます。たとえば、ノード内のノードがURLエイリアスを変更しない限り、ノードのリストをキャッシュしたままにする場合は、URLエイリアスが変更されているかどうかを確認して、タグnode:123:url_aliasを無効にするコードを追加できます。

13
oknate

バンドルに基づいてキャッシュタグを作成する同じ質問を持つ他の人のために、本当にうまく機能する「便利な」モジュールHandy Cache Tagsがあります。 https://www.drupal.org/project/handy_cache_tags

1
Joshua Boltz