2

我在树枝模板中有以下构造来创建 XML:

{# 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) %})。如果没有正确停止,它将导致无限循环,并且应用程序会因最大嵌套级别的致命错误而中断。

当部分 optionNode 包含在 insuranceNode 中时,模板 vardInsurances设置为 false,这应该将dInsurancesoptionNode 中的 var 设置为 false。然而,由于某种原因,optionNode 仍然更喜欢 default(true),dInsurances而不是由 insuranceNode 设置的模板变量。

如果从dInsurancesoptionNode 中删除 default() 过滤器,它会按预期工作。此外,当dInsurances设置为 true 时,它​​会按预期崩溃。

我是否误解了 default() 过滤器的机制?还是应该在模板中继承通过 include 指令传递的变量?

任何帮助深表感谢。提前致谢 :)

4

2 回答 2

7

从树枝文档:

如果值未定义或为空,则默认过滤器返回传递的默认值,否则返回变量的值

因此,如果您传递 false,twig 将采用默认值。

有2个修复:

  1. 使用带有负值的“not”

    {% if not skipOptions %}
    ...
    'skipInsurances': true
    
  2. 使用“定义”测试:http ://twig.sensiolabs.org/doc/tests/defined.html

    {% if dOptions is not defined or dOptions %}
    
于 2012-05-31T18:11:05.067 回答
0

第三个修复是使用空合并运算符:

{% if dOptions ?? true %}

在1.24.0版本中引入。

于 2016-06-06T07:48:40.780 回答