Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
因为drupal的树枝模板表现得很奇怪_Drupal_Twig_Drupal 8 - Fatal编程技术网

因为drupal的树枝模板表现得很奇怪

因为drupal的树枝模板表现得很奇怪,drupal,twig,drupal-8,Drupal,Twig,Drupal 8,我试图从事件列表中只显示即将发生的事件。下面是我试图展示的方式 <div class="row"> {% for item in items %} {% if item.content['#node'].field_event_type.getValue()|first.value == 'upcoming' %} <div class="col">{{item.content}}</div> {

我试图从事件列表中只显示即将发生的事件。下面是我试图展示的方式

<div class="row">
    {% for item in items %}
        {% if item.content['#node'].field_event_type.getValue()|first.value == 'upcoming' %}
            <div class="col">{{item.content}}</div>
        {% endif %}
    {% endfor %}
</div>

{items%%中的项的%s}
{%if item.content['#node'].field_event_type.getValue()| first.value=='即将到来的'%}
{{item.content}
{%endif%}
{%endfor%}
但是输出渲染是,第二个事件显示在row div之后,如下所示。我不明白这是怎么发生的,因为for循环在row div中

<div class="row"> 
  <div class="col"> content </div>
</div><div class="col"> content </div>

内容
内容
预期产量

<div class="row"> 
  <div class="col"> content </div>
  <div class="col"> content </div>
</div>

内容
内容

Twig做了很多事情:

  • 加载(打开你的小枝内容)
  • 解析(从细枝内容创建解析树)
  • 编译(浏览该树以创建php文件)
  • 缓存(将php文件存储在某个位置,以避免下次重新编译)
  • 执行(执行生成的php文件)
当解析过程中检测到
{%for%}
时,Twig递归调用令牌解析器,直到找到
{%endfor%}
并构建令牌树。在您的情况下,它看起来像:

root
 |
 --- string
 |
 --- for
 |   |
 |    --- if
 |        |
 |        --- string
 |
 --- string
然后,Twig编译器递归地遍历该树并生成相应的php代码。这样,以下细枝循环:

{% for i in 1..5 %}
Value = {{ i }}
{% endfor %}
在PHP中编译为:

// line 1
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable(range(1, 5));
foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
    // line 2
    echo "Value = ";
    echo twig_escape_filter($this->env, $context["i"], "html", null, true);
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['i'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
如您所见,
{%for%}
只不过是一个简单的
foreach
,由于树枝标记存储在树中,因此设计上不可能显示位于一对打开/关闭标记下方的内容

我能看到的唯一可能性是,您在Twig中使用的一个标记正在使用输出缓冲,而您在循环中使用的一个方法会破坏ob堆栈(例如,没有任何先前打开的
ob\u start()


我的建议是将您的twig文件名grep到缓存目录中(例如:
grep-Ri'test.twig'cache/
),以便查看编译为PHP的文件,准确了解它的功能,并对其进行调试。

在Drupal视图中过滤结果,而不是过滤twig中的内容

在视图的“筛选条件”中,选择字段\事件\类型字段并将其设置为“等于”,然后选择/添加“即将到来”作为选项

如果在视图中进行过滤,则不必弄乱细枝模板