2012-12-08 72 views
35

想象我有這樣的事情在我的樹枝模板如何檢查是否在樹枝模板存在塊 - Symfony2的

{% block posLeft %} 
    ----- 
{%endblock%} 

有沒有什麼辦法來檢查posLeft塊的所有腦幹沒有打電話來:

block("posLeft") 

然後檢查posBlock的返回值以改變存在。我是Symfony2 + Twig的新手。

+3

你爲什麼要這麼做?在我看來,你在你的視圖中添加邏輯可能屬於你的控制器。如果你想顯示基於某個變量的某些內容,只需將該變量插入到視圖中,然後根據需要顯示不同的塊。 – lifo

回答

69

如果您想僅在某個塊有內容時才顯示某個塊,則可以這樣解決。希望,這是你正在尋找的。

例index.html.twig

{% set _block = block('dynamic') %} 
{% if _block is not empty %} 
    {{ _block|raw }} 
{% endif %} 

例part.html.twig

{% extends "index.html.twig" %} 

{% block dynamic %} 
    Block content goes here. 
{% endblock %} 
+1

這裏沒有內置標籤嗎?獲取塊值並再次檢查一個空字符串需要很多代碼。它看起來非常醜陋。 –

+3

我不認爲有另一種方式。正如@lifo所說,你可能會在你的模板中加入很多邏輯。請注意,不要將此2行語句放入單行檢查中,因爲這可能導致新的子請求。以下是關於Twig Google Group的類似討論:https://groups.google.com/forum/?fromgroups=#!topic/twig-users/FHDTknu5n2M – insertusernamehere

16

你可以這樣說:

{% if block('posLeft') %} 
    ... 
{% endif %} 

但它爲N如果您需要渲染塊的輸出,則不需要高效的。 所以,如果你需要,你應該把它分配給變量在首位 然後做斷言

+1

我認爲這是最乾淨的方式! – Dandy

+2

Downvoted。請參閱鏈接評論http://stackoverflow.com/questions/13774384/how-to-check-if-a-block-exist-in-twig-template-symfony2#comment19015938_13806784 – Im0rtality

+0

對於我來說那裏有空格在「空「塊(因爲格式化)。所以我解決了它的使用:if block('posLeft')| trim'='' –

0

只是想提供工作對我來說另一個例子塊輸出。

<body 
{% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %} 
> 

這允許我在子模板中聲明{% block ngapp 'myApp' %},並讓它在父類中顯示。

這是需要的,因爲在一些頁面上,我通過手動方式手動引導Angular(angular.bootstrap('moduleName', rootElement)),而Angular不喜歡空的ng-app=''指令並以奇怪的方式打破。

2

第一張支票,您使用的是symfony項目內其中枝條版本,因爲這裏的答案是隻爲桂枝加1.

如果您正在使用的樹枝2你是幸運的。根據Twig文檔,您可以使用定義的測試來檢查塊是否存在於當前模板上下文中。

{% if block("dynamic") is defined %} 
    ... 
{% endif %} 

我已經寫了一個小TwigExtension檢查,如果該塊被調用的if語句中,它好像如果塊exsists枝條真的只檢查,不調用它。

的鏈接文檔:http://twig.sensiolabs.org/doc/2.x/functions/block.html

如果您使用的是枝條1,老答案在https://stackoverflow.com/a/13806784/6458657仍然是正確的。

5

其他答案這裏不適用於樹枝2.1(我沒有測試~2。0),所以這裏是一個小更新:

{% if block('dynamic') is defined %} 
    {{ block('dynamic')|raw }} 
{% endif %} 

注意,線呈現塊

{% block dynamic %} 
    {# this wont work #} 
{% endblock %} 

這不會工作,因爲該塊將編譯過程中被渲染,等等該測試將返回它存在的狀態(如在運行時測試)。所以你需要用{{ block('dynamic')|raw }}來渲染塊,因爲這實際上並沒有在模板中定義塊。

+0

'| raw'在這裏是多餘的,因爲使用'block'('dynamic')'已經處理了轉義,並且它在顯示之前不會被首先設置爲變量。 – lookbadgers

5

嫩枝2.x的

{{ (block("posLeft")) ?? '' }} 

如果想讓它在一行中所定義或不顯示塊。可能是一個小問題,但滿足我的需要,沒有一堆如果..然後邏輯。