Twig - 迭代表单字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Twig - 迭代表单字段相关的知识,希望对你有一定的参考价值。
我正在尝试迭代Twig表单主题中的所有表单元素时遇到问题。实际上我用它来迭代它们:
{% for child in form.parent.children %}
我没有在文档中找到它,我只是转储表单变量并找到该路径上的字段。这实际上适用于所有表单,除非表单本身有一个名为children的参数。我不知道它是不是一个bug,因为如果你只是转储form
对象,结构在两种情况下是相同的:
但是如果你尝试访问form.parent.children
,当它里面有一个children
参数时,你将不会直接得到"children"
的结果:
正如您在这种情况下所看到的,form.parent.children
直接引用了form的子元素(相同的标识符#1592)。仍然如果你试图获得form.parent.children.parent.children
你将再次获得children
元素所以如果form包含一个名为children
的参数,基本上使用这种方式是不可能迭代表单字段。
这是一个错误还是我错过了什么?也许有另一种方法来实现我想要的东西?
是的,这是与the way Twig accesses each attribute for convenience相关的名称冲突,因为FormView
被宣布为ArrayAccess
it has priority over object's properties。顺便说一句,parent
和vars
属性也会发生同样的事情,但现在让我们关注解决方案,而不是问题。
由于这是一个Twig的问题,解决方案应该针对这个方向。一个解决方法可能是create a custom function正确获得FormView
的属性:
public function getFunctions()
{
return array(
new TwigFunction('formview_prop', array($this, 'getFormViewProperty')),
);
}
public function getFormViewProperty(FormView $formView, string $prop)
{
// parent, children or vars
return $formView->{$prop};
}
因此,使用此函数时,您可以访问视图的属性而不是表单的字段(如果存在名称冲突):
{% for child in formview_prop(form, 'parent') %}
然后,它将迭代父视图的所有字段元素(子元素)。但是,我更喜欢明确地创建三个函数formview_parent
,formview_children
和formview_vars
而不传递第二个参数。
从这个意义上讲,您可能还需要验证表单是否具有父视图,因此自Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1 was introduced(作为bugfix)新的Twig测试函数名为rootform
以避免此类冲突,尤其是对于parent
属性:
{% if form is rootform %}
以上是关于Twig - 迭代表单字段的主要内容,如果未能解决你的问题,请参考以下文章
在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段