Wie erkenne ich richtig, ob die Region leer ist? [geschlossen]


11

Ich habe die Bedingung, Bereiche in meiner Seitenvorlage zu drucken, da diese nicht leer ist , aber es werden immer leere Bereiche gedruckt, egal was passiert. Was ist der richtige Weg, um leere Regionen zu erkennen?

Zum Beispiel {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}druckt aus <div class="region region-local-tasks"></div>.

Wenn ich die Region themename_preprocess_page()mit var_dump(drupal_render($variables['page']['highlighted']));rendere, erhalte ich SafeString mit Platzhalter-Token:

<div class="region region-highlighted"><drupal-render-placeholder callback="Drupal\Core\Render\Element\StatusMessages::renderMessages" arguments="0" token="a8c34b5e"></drupal-render-placeholder></div>

Also, technisch ist die Region nicht leer , aber ich kann nichts dagegen tun.


Was page.local_tasksenthält, wenn Sie der Meinung sind, dass es leer sein sollte?
Clive

Das ist eine Region für den Block lokaler Aufgaben.

Richtig, aber was enthält das Objekt? Es ist nicht leer, also schauen Sie nach, welche anderen Eigenschaften es haben könnte, die Sie darauf hinweisen könnten, dass es keinen Inhalt gibt (enthält es im Wesentlichen eine Zeichenfolge oder ein nicht gerendertes Array?)
Clive

Ich habe das gleiche Problem, und es scheint, dass dies ein Fehler ist
Yusef

Antworten:


10

TL; DR dafür ist, dass es keine Möglichkeit gibt, zuverlässig zu überprüfen, ob die Region leer ist oder nicht in der Vorlage.

In Drupal 8 können wir zu dem Zeitpunkt, an dem wir uns auf Vorlagenebene befinden, nicht feststellen, ob die Region Inhalt enthält oder nicht, da der Inhalt träge gerendert wird. Hierfür gibt es ein offenes Drupal 8-Problem .

Um dies zu erreichen, müssen Sie wahrscheinlich CSS schreiben, das prüft, ob die Region leer ist. Sie können versuchen, Folgendes zu verwenden : leerer Pseudo-Selektor .


Ich bin zu dem Schluss gekommen, dass der zuverlässigste Weg, um dieses Problem zu umgehen, darin besteht, Vorlagenvorschläge in hook_theme_suggestions_HOOK_alter hinzuzufügen und die Bereiche vollständig aus der Vorlage zu entfernen, in denen sie nicht sichtbar sein sollen.
Johan

10

Versuchen Sie, Filter nach dem Rendern wie folgt anzuwenden:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}

das hat bei mir funktioniert
Andrew Kozoriz

Das ist sehr nützlich.
ACanadianCoder

2
Dieser Ansatz funktioniert nicht, da nicht berücksichtigt wird, dass einige Regionen möglicherweise in Platzhalter gerendert werden, die später durch das eigentliche Markup ersetzt werden. Es gibt einfach keine Möglichkeit festzustellen, ob eine Region in der Datei html.html.twig leer ist oder nicht. Wenn Sie den vollständigen Hintergrund dieses Problems lesen möchten, empfehle ich Ihnen, diese Drupal Core-Ausgabe
lauriii

Wie @lauriii sagte, funktioniert dies nicht mit Drupal-Platzhaltern (meine Ansichten in Blöcken werden normalerweise aufgrund des strip_tagsFilters herausgefiltert).
Dakwamine

2

Im Zweig sollten Sie wirklich in der Lage sein:

{% if page.local_tasks %}{{ page.local_tasks }}{% endif %}

Möglicherweise befindet sich jedoch etwas in page.local_tasks (z. B. leeres Markup). Bitte versuche folgendes:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}

Dieses Debug-Snippet zeigt nichts an (dh nichts, was angezeigt werden soll, die Variable ist leer).

Wenn du sagst, debugmeinst du dump? Was passiert, wenn Sie es tun {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria

Wenn ich Ihre Frage lese, sehe ich, dass sie page.local_tasksnicht leer ist. Es ist voller HTML. Ich werde meine Antwort aktualisieren.
Queenvictoria

Rendert Ihr Snippet den Inhalt nicht zweimal, wenn Inhalt vorhanden ist? Oder wenn es gerendert wird, wird es zwischengespeichert und hat keinen Einfluss auf die Leistung? Außerdem verstehe ich nicht, warum ich Problemumgehungen durchführen muss. Dies sollte sofort im Kern funktionieren. @Berdir irgendeinen Kommentar dazu?

Das Problem ist, dass lokale Aufgaben nicht leer sind. Da Zweig und Steinfrucht beide MVC folgen, gibt es nichts, was Zweig leer sagt (er ist nicht leer). Entweder können Sie einen Präprozessor schreiben, der überschreibt, was lokale Aufgaben im leeren Zustand bereitstellen, einen anderen Wert mit einer Eigenschaft vom Typ 'count' bereitstellen, gegen die Sie testen können, oder etwas, wie ich es vorschlage. Irgendwo wirst du einen Treffer erzielen. Ich denke, die Leistungssteigerung wird vernachlässigbar sein.
Queenvictoria

1

Das hat bei mir funktioniert.

{% if page.sidebar_first|render|striptags %}
<aside id="sidebar-first" class="sidebar sidebar-first layout-sidebar-first" role="complementary">{{ page.sidebar_first }}</aside>
{% endif %}

Einfach genug.


Ich bin mir nicht sicher, aber das könnte dazu führen, dass Ihre Seitenleiste zweimal gerendert wird (einmal zur Auswertung und das andere Mal zur Anzeige).
Jigarius


-1

Versuche dies :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}

-1

Das funktioniert in meinem Fall tatsächlich

{% if page.sidebar_second|render|striptags('<drupal-render-placeholder>')|trim|length > 0 %}

striptags akzeptiert eine Reihe von Tags, die beibehalten werden sollen, sodass Sie auch alle inhaltslosen Tags hinzufügen können, die Sie erwarten, wie z <form><img>.


-1

Folgendes funktioniert auch, wenn das Debuggen von Zweigen aktiviert ist:

{% set sidebarLength = page.sidebar_first|render|trim|striptags|length %}
{% if sidebarLength > 1 %}
  {% set has_sidebar_first = page.sidebar_first %}
{% else %}
  {% set has_sidebar_first = null %}
{% endif %}

-3

So erkennen Sie, ob die Region leer ist oder nicht: Code wie folgt:

{% if page.local_tasks%}
   {{page.local_tasks}}
{% endif%}

Im obigen Code wird geprüft, ob die Region local_tasks leer ist oder nicht, und wenn sie leer ist, wird diese Region nicht gedruckt


1
nicht funktioniert, das ist immer wahr
Yusef

Das verzögerte Rendern der Blöcke ist die Ursache dafür, dass dieses Snippet nicht funktioniert. Da das Array nicht leer ist, aber beim Rendern nichts zurückgegeben wird.
Renrhaf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.