Как правильно определить, является ли регион пустым? [закрыто]

11

У меня есть условие для печати областей в моем шаблоне страницы, так как он не пустой , но он всегда будет печатать пустые области, несмотря ни на что. Как правильно определять пустые регионы?

Например, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}распечатывает <div class="region region-local-tasks"></div>.

Если я отобразлю регион themename_preprocess_page()с помощью, var_dump(drupal_render($variables['page']['highlighted']));я получу SafeString с токеном-заполнителем:

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

Итак, технически регион не пустой, но я ничего не могу с этим поделать.

киамлалуно
источник
Что page.local_tasksсодержится, когда вы чувствуете, что оно должно быть пустым?
Клайв
Это регион для локальных задач.
Хорошо, но что содержит объект? Он не пустой, поэтому посмотрите, какие еще свойства он может подсказать вам, что нет содержимого (по сути, оно содержит строку или необработанный массив?)
Клайв
У меня та же проблема, и кажется, что это ошибка
Юсеф

Ответы:

10

TL; DR для этого заключается в том, что нет способа надежно проверить, является ли регион пустым или нет в шаблоне.

В Drupal 8 в тот момент, когда мы находимся на уровне шаблонов, мы не можем сказать, есть ли в регионе контент или нет, потому что контент воспроизводится лениво. Существует открытая проблема Drupal 8 для этого.

Для этого вам, вероятно, придется написать CSS, который проверяет, является ли область пустой. Вы можете попробовать использовать : empty псевдоселектор .

lauriii
источник
Я пришел к выводу, что самый надежный способ обойти эту проблему - добавить предложения шаблона в hook_theme_suggestions_HOOK_alter и полностью удалить области из шаблона, где он не должен быть видимым.
Йохан
10

попробуйте применить фильтры после рендера, вот так:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}
just_like_good_vibes
источник
это сработало для меня
Андрей Козориз
Это довольно полезно.
ACanadianCoder
2
Этот подход не работает, потому что он не учитывает, что некоторые регионы могут быть преобразованы в заполнители, которые затем будут заменены фактической разметкой. Просто нет способа определить, является ли регион пустым или нет в файле html.html.twig. Если вы хотите ознакомиться с полным фоном этой проблемы, я предлагаю прочитать эту проблему в Drupal Core
lauriii
Как сказал @lauriii, это не работает с заполнителями drupal (мои представления в блоках обычно отфильтровываются из-за strip_tagsфильтра).
Даквамин
2

В ветке вы действительно должны уметь:

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

Однако, возможно, что-то есть внутри page.local_tasks (например, пустая разметка). Пожалуйста, попробуйте следующее:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}
QueenVictoria
источник
Этот отладочный фрагмент ничего не показывает (т. Е. Ничего не отображается, переменная пуста).
Когда вы говорите, debugчто имеете в виду dump? Что произойдет , если вы делаете {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria
Читая ваш вопрос, я вижу, что page.local_tasksэто не пусто. Это полно HTML. Я обновлю свой ответ.
Queenvictoria
Разве ваш фрагмент не отображает содержимое дважды, если оно есть? Или, если он отображается, он кэшируется и не влияет на производительность? Также я не понимаю, почему мне нужно делать какие-либо обходные пути. Это должно работать из коробки в ядре. @ Бердир, есть комментарии по этому поводу?
Беда в том, что локальные задачи не пусты. Так как веточка и друпал следуют за MVC, ничто не говорит о том, что ветка пуста (она не пуста). Либо вы можете написать препроцессор, который переопределяет то, что предоставляют локальные задачи, когда он пуст, предоставляет другое значение со свойством типа count, с которым вы можете проверить, или что-то вроде того, что я предлагаю. Так или иначе, вы собираетесь получить удар. Я думаю, что снижение производительности будет незначительным.
Queenvictoria
1

Это сработало для меня.

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

Достаточно просто.

SHALO
источник
Я не уверен, но это может привести к тому, что ваша боковая панель будет визуализироваться дважды (один раз для оценки и другой раз для отображения).
Jigarius
-1

попробуй это :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}
Matoeil
источник
-1

Это на самом деле работает в моем случае

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

striptags принимает строку тегов для хранения, поэтому вы также можете добавить любые теги без содержимого, которые вы ожидаете, например, и <form><img>т. д.

Джин Скофф
источник
-1

Следующее также работает, когда включена отладка веток:

{% 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

Чтобы определить, является ли регион пустым или нет кода, как это:

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

В приведенном выше коде он проверяет, является ли регион local_tasks пустым или нет, и если он пуст, он не будет печатать этот регион.

Сэчин
источник
1
не работал, это всегда так
Юсеф
Ленивый рендеринг блоков является причиной того, что этот фрагмент не работает. Потому что массив не пустой, но рендеринг ничего не возвращает.
Renrhaf