gpt4 book ai didi

php - Twig 默认过滤器会覆盖定义的模板变量吗?

转载 作者:数据小太阳 更新时间:2023-10-29 02:51:50 24 4
gpt4 key购买 nike

我在 Twig 模板中有以下构造来创建 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) %} )。如果没有正确停止,它将导致无限循环,并且应用程序会因最大嵌套级别 fatal error 而中断。

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

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

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

非常感谢任何帮助。提前致谢:)

最佳答案

来自 Twig 文档:

The default filter returns the passed default value if the value is undefined or empty, otherwise the value of the variable

因此,如果您传递 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 %}

关于php - Twig 默认过滤器会覆盖定义的模板变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com