it-swarm.com.de

Entfernen Sie den Cache in hook_preprocess_node

Ich verwende hook_preprocess_node, um das Knotenfeld abzurufen und einige Prozesse auszuführen, und übergebe dann eine Variable an den Knoten, um sie in der Vorlage node twig) zu verwenden. Das Problem bei mir, dass ich diesen Knoten bearbeite, Es wirkt sich nicht auf die Ansicht aus. Ich muss den Cache leeren, um diese Änderung in der Knotenansicht zu sehen.

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

Sie müssen Cache-Tags aller Entitäten hinzufügen, von denen Sie Daten erhalten. Fügen Sie diese Zeile zur foreach-Schleife hinzu:

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

Der übergeordnete Knoten ist bereits markiert, was bei normalem Rendern auch für die Zeitplanentitäten der Fall wäre.

Dies ist alles, was Sie tun müssen, indem Sie die Tags der Entitäten hinzufügen, die Sie zum Erstellen der gerenderten Ausgabe verwenden. Das Entitätssystem macht Cache-Elemente, die korrekt gekennzeichnet sind, bei allen CRUD-Vorgängen automatisch ungültig.

7
4k4

Jede Entität verfügt über Cache-Tags, um die Cache-Tags der aktuellen Entitätsverwendung abzurufen

$cache_tags = $entity->getCacheTags();

Sie müssen den Cache ungültig machen, damit Sie anrufen können

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

Dann wird der Cache für diese cache_tags ungültig.

3
Insasse