2012-05-31 46 views
1

我在樹枝模板下面的結構創建XML:Twig默認過濾器重寫定義的模板變量?

{# insuranceNode.xml.twig #} 
<insurance> 
    <description></description> 
    ... 

    {% if dOptions|default(true) %} 
    <options> 
     {% for option in insurance.options %} 
     {% include 'optionNode.xml.twig' with { 
      'option': option, 
      'dInsurances': false 
     }%} 
     {% endfor %} 
    </options> 
    {% endif %} 

</insurance> 

{# optionNode.xml.twig #} 
<option> 
    <description></description> 
    ... 

    {% if dInsurances|default(true) %} 
    <insurances> 
     {% for insurance in option.insurances %} 
     {% include 'insuranceNode.xml.twig' with { 
      'insurance': insurance, 
      'dOptions': false 
     }%} 
     {% endfor %} 
    </insurances> 
    {% endif %} 

</options> 

正如你可以看到兩個模板諧音包括對方默認({% if dOptions|default(true) %}{% if dInsurances|default(true) %})。如果沒有正確停止,它將導致無限循環,並且應用程序中斷最大嵌套級別致命錯誤。

當insuranceNode中包含partial optionNode時,模板var dInsurances設置爲false,應將optionNode中的var dInsurances設置爲false。然而,由於某些原因,optionNode仍然優先於dInsurances的默認值(true),而不是由insuranceNode設置的模板變量。

如果從optionNode中的dInsurances中刪除了默認()過濾器,它將按預期工作。同樣當dInsurances設置爲true時,它會按預期崩潰。

我誤解了default()過濾器的機制嗎?還是應該通過include指令傳遞的變量在模板中被繼承?

任何幫助,非常感謝。感謝提前:)

回答

5

從細枝文檔:

默認的過濾器,如果值是不確定的或空返回傳入默認值,變量

否則價值

所以,如果你通過假,樹枝將採取默認值。

有2個解決方法: 「中定義的」 測試

  1. 使用 「非」 帶有負號的

    {% if not skipOptions %} 
    ... 
    'skipInsurances': true 
    
  2. 使用:http://twig.sensiolabs.org/doc/tests/defined.html

    {% if dOptions is not defined or dOptions %} 
    
+0

儘管對於我來說,以「false」形式傳遞的變量被認爲是空的或未定義的,所以是這樣。我會利用你的第二個建議,因爲可能傳遞的變量是未定義的:)一個接受並讚揚你的先生。 –

+2

默認過濾器歸結爲這個代碼:'$ passed_value? $ passed_value:$ default_value',這就是爲什麼當傳遞false時,它使用默認值而不是傳入的值。 – Maerlyn

0

的第三解決方法是使用空合併操作erator:

{% if dOptions ?? true %} 

在版本1.24.0中引入。

相關問題