【问题标题】:Twig default filter overrides defined template variables?Twig 默认过滤器覆盖定义的模板变量?
【发布时间】:2012-05-31 14:25:10
【问题描述】:

我在树枝模板中有以下构造来创建 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 中时,模板 var dInsurances 设置为 false,这应该将 optionNode 中的 var dInsurances 设置为 false。然而由于某种原因 optionNode 仍然更喜欢 dInsurances 的默认值(true),而不是由 insuranceNode 设置的模板变量。

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

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

非常感谢任何帮助。在此先感谢:)

【问题讨论】:

    标签: php xml symfony twig


    【解决方案1】:

    来自 Twig 文档:

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

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

    有 2 个修复:

    1. 用负值表示“不”

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

      {% if dOptions is not defined or dOptions %}
      

    【讨论】:

    • 尽管以false 形式传递的变量被认为是空的或未定义的对我来说似乎不合逻辑,但就这样吧。我将利用您的第二个建议,因为传递的变量可能是未定义的:) 先生,接受并投票给您。
    • 默认过滤器归结为以下代码:$passed_value ? $passed_value : $default_value,这就是为什么在传递 false 时它使用默认值而不是传递的值。
    【解决方案2】:

    第三个解决方法是使用空合并运算符:

    {% if dOptions ?? true %}
    

    在版本1.24.0中引入。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      相关资源
      最近更新 更多