2016-05-16 70 views
2

我想顯示事件列表中只有即將發生的事件。以下是我試圖展示的方式。在樹枝模板的Drupal行爲奇怪

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

但輸出渲染是,第二個事件顯示在下面的行div後面。我不明白這是怎麼發生的for循環是行的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> 

回答

0

枝條做很多事情裏面:

  • 加載(打開你的樹枝內容)
  • 解析(從你的樹枝內容創建一個解析樹)
  • 編譯當在檢測到{% for %}(瀏覽該樹來創建一個php文件)
  • 緩存(存儲PHP文件某處,以避免重新編譯它下一次)
  • 執行(執行生成的PHP文件)

解析時,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_get_clean()沒有任何例如,以前已經打開的ob_start())。

我的建議是將你的樹枝文件名存入你的緩存目錄(例如:grep -Ri 'test.twig' cache/),以便將該文件編譯爲PHP,以便準確理解它的功能並對其進行調試。

0

而不是過濾您的內容的樹枝,篩選結果在您的Drupal視圖。

在視圖的「過濾標準」中,選擇field_event_type字段並將其設置爲「等於」並選擇/添加「即將到來」作爲選項。

如果你在視圖中過濾,你不必亂七八糟的模板。