2012-05-31 47 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中引入。

相关问题