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

时间:2012-05-31 14:25:10

标签: php xml symfony twig

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

当insuranceNode中包含部分optionNode时,模板var dInsurances设置为false,应将optionNode中的var dInsurances设置为false。但由于某种原因,optionNode仍然优先于dInsurances的默认值(true)而不是由insuranceNode设置的模板变量。

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

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

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

2 个答案:

答案 0 :(得分:6)

来自Twig文档:

  

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

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

有两个修复:

  1. 将“not”与负值一起使用

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

    {% if dOptions is not defined or dOptions %}
    

答案 1 :(得分:0)

第3个修复是使用null-coalescing运算符:

document.querySelector("form").addEventListener("submit", function(ev){

  var points = $("#points").val();

  if(points > 200) {
    // prevent form submission
    // will be submitted if the user clicks ok
    ev.preventDefault();

    sweetAlert({
      title: "Number is over 200",
      text: "Are you sure?",
      type: "warning",
      showCancelButton: true,
      confirmButtonColor: "#DD6B55",
      confirmButtonText: "OK",
      closeOnConfirm: false
    }, function checkInp(){
      //ev.target is the form submitted
      ev.target.submit();
    });
  }
})

在版本1.24.0中引入。