Jak prawidłowo wykryć, czy region jest pusty? [Zamknięte]

11

Mam warunek drukowania regionów w szablonie strony, ponieważ nie jest pusty , ale zawsze drukuje puste regiony bez względu na wszystko. Jaki jest właściwy sposób wykrywania pustych regionów?

Na przykład {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}drukuje <div class="region region-local-tasks"></div>.

Jeśli renderuję region za themename_preprocess_page()pomocą var_dump(drupal_render($variables['page']['highlighted']));, otrzymam SafeString z tokenem zastępczym:

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

Więc technicznie region nie jest pusty, ale nic na to nie poradzę.

kiamlaluno
źródło
Co page.local_taskszawiera, gdy uważasz, że powinno być puste?
Clive
To region dla lokalnych bloków zadań.
Racja, ale co zawiera obiekt? Nie jest pusta, więc sprawdź, jakie inne właściwości ma dla ciebie, że nie ma treści (czy zawiera ona ciąg znaków lub niewyrenderowaną tablicę?)
Clive
Mam ten sam problem i wydaje się, że to błąd
Yusef

Odpowiedzi:

10

TL; DR w tym przypadku polega na tym, że nie ma możliwości wiarygodnego sprawdzenia, czy region jest pusty, czy nie w szablonie.

W Drupal 8 w momencie, gdy jesteśmy na poziomie szablonu, nie jesteśmy w stanie stwierdzić, czy region ma treść, czy nie, ponieważ treść jest renderowana leniwie. Jest do tego otwarty problem Drupala 8 .

Aby to osiągnąć, prawdopodobnie będziesz musiał napisać CSS, który sprawdza, czy region jest pusty. Możesz spróbować użyć : pusty pseudo-selektor .

Lauriii
źródło
Doszedłem do wniosku, że najbardziej niezawodnym sposobem na obejście tego problemu jest dodanie sugestii szablonów w hook_theme_suggestions_HOOK_alter i usunięcie regionów całkowicie z szablonu, gdzie nie powinien być widoczny.
Johan
10

spróbuj zastosować filtry po renderowaniu, w ten sposób:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}
just_like_good_vibes
źródło
to zadziałało dla mnie
Andrew Kozoriz
To jest całkiem przydatne.
ACanadianCoder
3
To podejście nie działa, ponieważ nie bierze pod uwagę, że niektóre regiony mogą zostać przekształcone w symbole zastępcze, które następnie zostaną zastąpione rzeczywistym znacznikiem. Po prostu nie ma żadnego sposobu ustalenia, czy region jest pusty, czy nie w pliku html.html.twig. Jeśli chcesz przeczytać pełne tło tego problemu, proponuję przeczytać ten problem Drupal Core
lauriii
Jak @lauriii powiedział, to nie działa Drupal zastępcze (moje poglądy w blokach zwykle się odfiltrowane ze względu na strip_tagsfiltrze).
Dakwamine
2

W gałązce naprawdę powinieneś być w stanie:

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

Jednak być może istnieje coś w obrębie page.local_tasks (np. Puste znaczniki). Spróbuj wykonać następujące czynności:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}
Królowa Wiktoria
źródło
Ten fragment debugowania nic nie pokazuje (tzn. Nic do wyświetlenia, zmienna jest pusta).
Kiedy mówisz debug, masz na myśli dump? Co się stanie, jeśli to zrobisz {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria,
Czytając twoje pytanie, widzę, że page.local_tasksnie jest puste. Jest pełen HTML. Zaktualizuję moją odpowiedź.
Queenvictoria
Czy Twój fragment nie renderuje treści dwukrotnie, jeśli istnieje? Lub jeśli jest renderowany, jest buforowany i nie ma wpływu na wydajność? Nie rozumiem też, dlaczego muszę robić obejścia. Powinno to działać po wyjęciu z pudełka w rdzeniu. @Berdir jakikolwiek komentarz na ten temat?
Problem polega na tym, że zadania lokalne nie są puste. Ponieważ zarówno gałązka, jak i drupal podążają za MVC, nic nie mówi o gałązce, która jest pusta (nie jest pusta). Albo możesz napisać preprocesor, który przesłoni to, co lokalne zadania zapewniają, gdy jest pusty, dostarczy inną wartość z właściwością typu „count”, na której możesz przetestować, lub coś takiego, co sugeruję. Gdzieś lub tam trafisz. Myślę, że wzrost wydajności będzie znikomy.
Queenvictoria,
1

To zadziałało dla mnie.

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

Wystarczająco proste.

Shalo
źródło
Nie jestem pewien, ale może to powodować renderowanie paska bocznego dwa razy (raz dla oceny, a drugi dla wyświetlenia).
Jigarius,
-1

Spróbuj tego :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}
Matoeil
źródło
-1

To faktycznie działa w moim przypadku

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

striptags akceptuje ciąg tagów do zachowania, więc możesz także dodawać dowolne tagi bez zawartości , takie jak <form><img>itp.

Gene Scoff
źródło
-1

Poniższe działa również, gdy włączone jest debugowanie gałązek:

{% 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 %}
Stef Van Looveren
źródło
-3

Aby wykryć, czy region jest pusty, czy nie taki kod:

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

W powyższym kodzie sprawdza, czy region zadania_lokalne jest pusty, czy nie, a jeśli jest pusty, nie wydrukuje tego regionu

Sachin
źródło
1
nie działa, to zawsze jest prawda
Yusef
Leniwe renderowanie bloków powoduje, że ten fragment kodu nie działa. Ponieważ tablica nie jest pusta, ale renderowanie nic nie zwraca.
Renrhaf