web-dev-qa-db-ja.com

hook_preprocess_nodeのキャッシュを削除します

私はhook_preprocess_nodeを使用してノードフィールドを取得し、いくつかのプロセスを作成してから、変数をノードに渡してノードで使用しますtwigテンプレート。このノードを編集すると、ビューには影響しません。ノードビューでこの変更を確認するには、キャッシュをクリアする必要があります。

function THEME_preprocess_node(&$variables) {

    if (isset($variables['elements']['#node'])) {
        $node = $variables['elements']['#node'];
        $bundle = $node->bundle();
    }
    if (isset($bundle) && $bundle == 'crse') {
        $course_schedules = array();
        foreach ($node->get('crse_sched') as $schedule_item) {
            $schedule_entity = \Drupal\node\Entity\Node::load($schedule_item->target_id);
            $schedule = new stdClass();
            $schedule->title = $schedule_entity->get('title')->getValue()[0]['value'];
            $schedule->seats = $schedule_entity->get('seats')->getValue()[0]['value'];
            $schedule->state = $schedule_entity->get('moderation_state')->getValue()[0]['value'];
            $course_schedules[] = $schedule;
        }
        $variables['schedules'] = $course_schedules;
    }
}
4

データを取得するすべてのエンティティのキ​​ャッシュタグを追加する必要があります。次の行をforeachループに追加します。

$variables['#cache']['tags'][] = 'node:' . $schedule_entity->id();

親ノードは既にタグ付けされています。これは、正常にレンダリングされた場合、スケジュールエンティティでも発生します。

これがあなたがする必要があるすべてであり、レンダリングされた出力を構築するために使用するエンティティのタグを追加します。エンティティシステムは、すべてのCRUD操作で、正しくタグ付けされたキャッシュアイテムを自動的に無効にします。

7
4k4

すべてのエンティティには、現在のエンティティの使用のキャッシュタグを取得するためのキャッシュタグがあります

$cache_tags = $entity->getCacheTags();

呼び出す必要があるので、キャッシュを無効にする必要があります

\Drupal\Core\Cache\Cache::invalidateTags($cache_tags);

これらのcache_tagsのキャッシュは無効になります。

3
Insasse