如何正确检测区域是否为空?[关闭]


11

我有条件在页面模板中打印区域,因为它不是empty,但是无论如何,它将始终打印空白区域。检测空区域的正确方法是什么?

例如,{% 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)

那是本地任务块的区域。

是的,但是对象包含什么?它不是空的,因此请看一下它还有其他哪些属性,可能会提示您没有内容(它实际上包含字符串还是未渲染的数组?)
Clive

我有同样的问题,看来这是个错误
Yusef

Answers:


10

TL; DR的原因是无法可靠地检查模板中的区域是否为空。

在Drupal 8中,当我们处于模板级别时,由于内容呈惰性呈现,因此我们无法判断该区域是否包含内容。有一个开放的Drupal 8问题

要实现此目的,您可能要做的就是编写CSS,以测试该区域是否为空。您可以尝试使用:empty伪选择器


我已经得出结论,解决此问题的最可靠方法是在hook_theme_suggestions_HOOK_alter中添加模板建议,并从模板中完全删除不应显示的区域。
约翰·约翰(Johan)

10

尝试在渲染后应用过滤器,如下所示:

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

这对我
有用

这是非常有用的。
ACanadianCoder

2
这种方法行不通,因为它没有考虑到某些区域可能会呈现为占位符,然后将其替换为实际的标记。html.html.twig文件中根本没有任何方法可以确定区域是否为空。如果您想阅读此问题的完整背景,我建议阅读此Drupal Core问题
lauriii,

正如@lauriii所说,这不适用于drupal占位符(我的块视图通常由于strip_tags过滤器而被过滤掉)。
Dakwamine19年

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对此有何评论?

问题在于本地任务不是空的。由于树枝和drupal都遵循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>etc。


-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

要检测区域是否为空,代码如下:

{%如果page.local_tasks%}
   {{page.local_tasks}}
{% 万一 %}

在上面的代码中,它检查local_tasks区域是否为空,如果为空,则不会打印该区域


1
不起作用,这始终是正确的
Yusef

块的延迟渲染是导致此片段无法正常工作的原因。因为数组不是空的,但是渲染它不会返回任何内容。
Renrhaf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.