我在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指令传递的变量是否应该在模板中继承?
非常感谢任何帮助。在此先感谢:)
答案 0 :(得分:6)
来自Twig文档:
如果值未定义或为空,则默认过滤器返回传递的默认值,否则返回变量的值
因此,如果传递false,twig将采用默认值。
有两个修复:
将“not”与负值一起使用
{% if not skipOptions %}
...
'skipInsurances': true
使用“已定义”测试: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中引入。