it-swarm.com.de

So konditionieren Sie die Ausgabe anhand einer URL-Abfragezeichenfolge

In meiner Knotenvorverarbeitungsfunktion überprüfe ich den Wert eines Abfrageparameters ...

$variables['exclude_urls'] = \Drupal::request()->get('exclude_urls');

Und in meiner Vorlage habe ich ...

{% if not exclude_urls %}
  <div class="gr-url">{{ url }}</div>
{% endif %}

Dieser Ansatz funktioniert jedoch nicht, da die Knotenvorverarbeitungsfunktion nicht ausgelöst wird, wenn sich außer dem Wert für den Parameter 'exclude_urls' nichts in der URL ändert.

Ich habe verschiedene Methoden ausprobiert, um das Caching für die Seite zu deaktivieren. Das Hinzufügen zur Route funktioniert nicht ...

  options:
    no_cache: 'TRUE'

Ich habe auch versucht, den page_cache_kill_switch in meinem Controller zu verwenden, aber es funktioniert nicht ...

\Drupal::service("page_cache_kill_switch")->trigger();

Das Hinzufügen des Abfrageparameters zu Cache-Kontexten wird ebenfalls nicht durchgeführt ...

$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';

Gibt es eine andere Möglichkeit, den Wert von $ _GET ['exclude_urls'] zu überprüfen und an die Vorlage zu übergeben, anstatt hook_preprocess_node zu verwenden? Füge ich der Vorlage twig selbst) Code hinzu, um den Wert von 'exclude_urls' zu überprüfen? Gibt es eine sichere Möglichkeit, hook_preprocess_node jedes Mal zum Auslösen zu zwingen? Was ist der übliche Ansatz, um die Anzeige von Inhalten zu konditionieren? basierend auf einem URL-Abfrageparameter, damit das Caching nicht stört?

pdate: Um klar zu sein, habe ich auch die oben genannten Ansätze in Kombination ausprobiert, ohne Erfolg. Zum Beispiel sieht das Ende meiner Seitenfunktion in meinem Controller so aus ...

\Drupal::service("page_cache_kill_switch")->trigger(); 
$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';
return $element;

pdate 2: Auf meiner lokalen Entwickler-Site tritt dieses Problem nicht auf, und ich habe festgestellt, dass diese Zeile in meinen lokalen Einstellungen dazu führt, dass hook_preprocess_node jedes Mal ausgelöst wird ...

$settings['cache']['bins']['render'] = 'cache.backend.null';

Ich bin mir jedoch nicht sicher, wie ich dies in meiner Produktionssite nutzen soll, da ich den Render-Cache nicht generell deaktivieren möchte. Ich kann so etwas in settings.php machen, aber es ist ein Hack:

$parts = explode('?', $_SERVER['REQUEST_URI'], 2);
if ('/disable/cache/at/this/path' == $parts[0]) {
  $settings['cache']['bins']['render'] = 'cache.backend.null';
}
3
arnoldbird

Es gibt drei Ebenen, in denen gerenderte Inhalte zwischengespeichert werden können:

  • Der Seiten-Cache, in dem vollständige Seiten basierend auf der URL für anonyme Benutzer gespeichert werden.
  • Der dynamische Seitencache, in dem Seiten mit Platzhaltern für dynamischen Inhalt gespeichert werden, der bei jeder Anforderung gerendert wird.
  • Der Render-Cache, in dem einzelne gerenderte Elemente gespeichert werden.

Jeder hat einen entsprechenden Cache-Bin, der während der Entwicklung in settings.php Deaktiviert werden kann.


Aktualisieren Sie die Variable hook_preprocess, Um einen zusätzlichen Cache-Kontext in #cache Festzulegen, damit der Dynamic Page-Cache dieses Fragment erneut rendern kann und der Render-Cache nach Bedarf Varianten speichert:

function hook_preprocess_HOOK(&$variables) {
  $variables['#cache']['contexts'][] = 'url.query_args:exclude_urls';
}
3
gapple