web-dev-qa-db-fra.com

supprimer le cache dans hook_preprocess_node

J'utilise hook_preprocess_node pour obtenir le champ du nœud et créer des processus, puis transmettre une variable au nœud pour l'utiliser dans le modèle de nœud twig. Le problème avec moi que lorsque je modifie ce nœud, cela n'affecte pas la vue, je dois vider le cache pour voir ce changement sur la vue du nœud.

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

Vous devez ajouter des balises de cache de toutes les entités dont vous obtenez les données. Ajoutez cette ligne à la boucle foreach:

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

Le nœud parent est déjà balisé, ce qui se produirait également pour les entités de planification s'il était rendu normalement.

C'est tout ce que vous devez faire, en ajoutant les balises des entités que vous utilisez pour créer la sortie rendue. Le système d'entités invalide automatiquement les éléments de cache, qui sont correctement étiquetés, sur toutes les opérations CRUD.

7
4k4

Chaque entité a des balises de cache pour obtenir les balises de cache de l'utilisation actuelle de l'entité

$cache_tags = $entity->getCacheTags();

Vous devez invalider le cache, vous devez donc appeler

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

Ensuite, le cache de ces cache_tags sera invalidé.

3
Insasse