Як правильно визначити, чи область порожня? [зачинено]


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міститься, коли ви відчуваєте, що воно повинно бути порожнім?
Клайв

Це блок для місцевих завдань.

Правильно, але що містить об’єкт? Це не порожньо, тож подивіться, які ще властивості, які можуть підказати вам відсутності вмісту (чи містить він по суті рядок чи відредагований масив?)
Clive

У мене така ж проблема, і здається, це помилка
Юсеф

Відповіді:


10

TL; DR для цього полягає в тому, що немає можливості надійно перевірити, чи область порожня чи в шаблоні немає.

У Drupal 8 у той момент, коли ми знаходимося на рівні шаблону, ми не можемо сказати, чи є у регіоні вміст чи ні, оскільки вміст відображається ліниво. Для цього є відкритий випуск Drupal 8 .

Для досягнення цього вам, мабуть, доведеться написати CSS, який перевіряє чи порожній регіон. Ви можете спробувати використовувати : порожній псевдоселектор .


Я зробив висновок, що найнадійнішим способом подолати цю проблему є додавання пропозицій щодо шаблону в mock_theme_suggestions_HOOK_alter та видалення регіонів цілком із шаблону, де його не повинно бути видно.
Йоган

10

спробуйте застосувати фільтри після візуалізації, наприклад:

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

це працювало для мене
Андрій Козоріз

Це досить корисно.
ACanadianCoder

3
Цей підхід не працює, оскільки він не враховує, що деякі регіони можуть бути надані в заповнювачі, які згодом будуть замінені фактичною розміткою. Просто не існує жодного способу визначити, чи область порожня у файлі html.html.twig чи ні. Якщо ви хочете ознайомитись з усією основою цієї проблеми, пропоную прочитати цю проблему з Drupal Core
lauriii

Як сказав @lauriii, це не працює з друкарськими заповнювачами (мої погляди в блоках зазвичай фільтруються завдяки strip_tagsфільтру).
Dakwamine

2

У гілочці ви дійсно повинні вміти робити:

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

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

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

Цей фрагмент налагодження нічого не показує (тобто нічого не відображається, змінна порожня).

Коли ти кажеш debug, ти маєш на увазі dump? Що станеться, якщо ти зробиш {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria

Читаючи ваше запитання, я бачу, що page.local_tasksце не пусто. Повний HTML. Я оновлю свою відповідь.
Queenvictoria

Чи ваш фрагмент не видає вміст двічі, якщо є вміст? Або якщо він виведений, він кешований і це не впливає на продуктивність? Також я не розумію, чому мені потрібно робити якісь обхідні шляхи. Це повинно бути відпрацьоване з ящика в основі. @Berdir якийсь коментар до цього?

Біда в тому, що місцеві завдання не порожні. Оскільки гілочка і друпал обидва слідують за 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 %}

Досить просто.


Я не впевнений, але це може зробити ваш бічний рядок два рази (один раз для оцінки, а інший раз для показу).
Jigarius


-1

спробуйте це :

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

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.