Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

[gelöst] referenzierten Inhalt in Paragraph-Twig ausgeben - ohne clear_all_cache

Eingetragen von tetri999 (153)
am 14.02.2019 - 14:26 Uhr in
  • Allgemeines zu Drupal
  • Drupal 8.x

Hallo,

ich habe einen Content-Type mit einem Paragraph-Element, das u.a. eine Entity-Refenzierung auf andere Inhalte enthält.
Die Ausgabe baue ich in einem speziellen Template zusammen: "paragraph--SPECIAL-TEASER.html.twig".
Dem übergebe ich aus der "MY_THEME_preprocess_paragraph(&$variables)" die nötigen Elemente aus dem refenzierten Inhalt:

...
if( $paragraph->bundle()=='SPECIAL-TEASER' ) {
  $lang = \Drupal::languageManager()->getCurrentLanguage()->getId();
  $paragraph = $variables['paragraph'];
  $nid = $paragraph->field_entity_ref->target_id;
  $node = \Drupal::entityManager()->getStorage('node')->load($nid)->getTranslation($lang);
  $SPECIAL_ELEMS = new MY_MODUL_CLASS($node);
  $variables['elems'] = $SPECIAL_ELEMS;
...
Das funktioniert soweit.
ABER: Wenn ich den referenzierten Inhalt bearbeite, wird die Änderung im aufrufenden Inhalt erst nach clear_all_cache wirksam.

Hat jemand eine Idee, woran das liegt bzw. wie man das umgehen kann?

mfG, Michael

‹ Seite lädt nicht mehr nach update auf 8.6.9 [gelöst] referenzierten Inhalt in Paragraph-Twig ausgeben - ohne clear_all_cache ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja, das liegt daran, dass

Eingetragen von Zman (185)
am 14.02.2019 - 15:43 Uhr

Ja, das liegt daran, dass Drupal die Ausgabe cached und manuell verarbeitete Änderungen (hier im preprocess) nicht automatisch für die Invalidierung von Inhalten nutzen kann. Hier musst du selbst sogenannte Cache tags mitliefern. Das sorgt dafür, dass dein paragraph invalidiert wird, wenn der node geändert wurde.

Beispielsweise

<?php
$variables
['elems']['#cache']['tags'] = $node->getCacheTags();
?>

Das klappt aber nur, wenn $variables['elems'] ein ordentliches Drupal Render Array ist und in deinem twig so gerendert wird. Ansonsten müsste der Cache Tag an ein anderes Element angehängt werden.

Wenn $variables['elems'] schon cache-tags besitzt müsstest du diese mergen.

Hier findest du eine ausführliche Beschreibung: https://www.drupal.org/docs/8/api/cache-api/cache-tags

  • Anmelden oder Registrieren um Kommentare zu schreiben

EDIT: vielen Dank für den Hinweis,

Eingetragen von tetri999 (153)
am 14.02.2019 - 18:01 Uhr

aber so einfach, wie Du geschrieben hast, ging's nicht - wahrscheinlich ist mein $variables['elems'] kein ordentliches Drupal Render Array.
(ich habe in MY_MODUL_CLASS einfach ein Array mit mehreren Elementen erzeugt, und die dann im TWIG mit {{ elems.val_1}} {{ elems.val_2}} usw. eingebaut)
Was ist ein "ordentliches Drupal Render Array"?

Ich hab dann mal gegoogelt und das gefunden, woraus ich mir folgendes zusammengereimt habe:
hook_node_presave() und hook_node_delete() habe ich in die MY_THEME.theme eingebaut, und dann das:

function MY_THEME_invalidate_node(NodeInterface $node) {
  $tags = [];
  if ($node->getType() == '[CONT-TYPE]'){
    $tags[] = '[CONT-TYPE]:' . $node->label;  // d.h. den Node-Titel, der ist ja immer da
  }
  if (!empty($tags)) {
    Cache::invalidateTags($tags);
  }
}
So geht's dann mit $variables['elems']['#cache']['tags'] = $node->getCacheTags();

Das ist hoffentlich richtig so?, oder zu umständlich?, oder gibt's damit möglicherweise andere Probleme?

Michael

EDIT:
Kommando zurück.
Ich weiß nicht, wieso es vorhin ging - jetzt nicht mehr.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: Was ist ein

Eingetragen von Zman (185)
am 14.02.2019 - 20:25 Uhr
Zitat:

Was ist ein "ordentliches Drupal Render Array"?

https://www.drupal.org/docs/8/api/render-api/render-arrays

Mit dem oben genannten Code gewinnst du nichts. Da invalidierst du quasi den Node manuell. Das passiert allerdings beim Speichern eines Nodes ohnehin. Das Problem ist, dass die Cache-Tags eben nicht beim rendern des Paragraphs gesetzt sind und damit der Paragraph nicht mit invalidiert wird.

Lange Rede…

Du hast entweder die Möglichkeit die Elemente deiner MY_MODUL_CLASS in ein Drupal Render array zu packen und dieses dann in Twig zu rendern. Andersweitig können die Cache Tags auch auf andere Elemente gesetzt werden. Diese Elemente müssen halt eben gerendert werden. Da wir dein Twig-File nicht kennen, wissen wir nicht welche Elemente dort gerendert werden.

Wenn du beispielsweise im Paragraph Twig file {{ content }} renderst, kannst du das Cache-Tag folgendermaßen setzen.

<?php
$cache_tags
= isset($variables['content']['#cache']['tags']) ? $variables['content']['#cache']['tags'] : [];
$variables['content']['#cache']['tags'] = \Drupal\Core\Cache\Cache::mergeTags($cache_tags, $node->getCacheTags()); 
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat:wissen wir nicht

Eingetragen von tetri999 (153)
am 15.02.2019 - 13:05 Uhr
Zitat:

wissen wir nicht welche Elemente dort gerendert werden

Ich hatte in meiner MY_MODUL_CLASS die Elemente einfach in ein Array geschrieben und diese dann im paragraph--SPECIAL-TEASER.html.twig mit html-tags ausgegeben:
z.B. so: <div class="title"><a href="{{ elems.url }}">{{ elems.title }}</a></div>

Jetzt habe ich die Elemente gleich in einen HTML-String geschrieben und diesen in MY_THEME_preprocess_paragraph(&$variables) als $variables['content']['#markup'] zugewiesen.
Mit den zwei Zeilen für die Cache-Tags funktioniert es jetzt.
kint($variables['content']['#cache']['tags']); gibt dann:

$args array(1)
    →array(1)
        string(6) "node:9"
Richtig so? (node:9 ist der im Paragraph referenzierte Node)
Aber noch eine Frage: Wenn ich das richtig verstehe, wird der Paragraph jetzt bei jedem Aufruf neu gecached.
Sollte das nicht besser nur dann passieren, wenn der referenzierte Node modifiziert wird?

Vielen Dank für die geduldige Hilfe,
Michael

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja. Das ist richtig so. Du

Eingetragen von Zman (185)
am 16.02.2019 - 15:54 Uhr

Ja. Das ist richtig so. Du solltest aber nochmal schauen, ob es vorher nicht schon Cachetags für das Element gab. Wenn ja, musst du sie zusammenführen.

Der Paragraph wird so nicht bei jedem Aufruf neu gecached. Es wird immer die gecachte Variante ausgeliefert. Nur im Fall, dass du den Paragraph selbst aktualisierst oder den Node, den du als Cachetag mitgegeben hast wird der Paragraph beim nächsten Aufruf neu generiert und neu gecached und fortan wird wieder nur die gecachte Variante ausgeliefert.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
Weiter

Neue Kommentare

  • Inzwischen sind wir bei
    vor 1 Woche 2 Tagen
  • Migrieren von D7 auf D8/ D10/ D11
    vor 1 Woche 2 Tagen
  • melde mich mal wieder, da ich
    vor 9 Wochen 1 Stunde
  • Hey danke
    vor 9 Wochen 20 Stunden
  • Update: jetzt gibt's ein
    vor 9 Wochen 1 Tag
  • Hallo, im Prinzip habe ich
    vor 9 Wochen 6 Tagen
  • Da scheint die Terminologie
    vor 9 Wochen 6 Tagen
  • Kannst doch auch alles direkt
    vor 10 Wochen 3 Tagen
  • In der entsprechenden View
    vor 10 Wochen 3 Tagen
  • Dazu müsstest Du vermutlich
    vor 10 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250235
Registrierte User: 20462

Neue User:

  • marouane.blel
  • capilclinic
  • Quabzibboter

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 20 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association