Twig - 遍历表单字段

5

我在尝试遍历Twig表单主题中的所有表单元素时遇到了问题。实际上,我使用以下代码来对它们进行迭代:

{% for child in form.parent.children %}

我在文档中没有找到它,只是转储了表单变量并找到了该路径上的字段。这实际上适用于所有表单,但当表单本身有一个名为children的参数时,就会出现问题。我不知道这是否是一个错误,因为如果只转储form对象,则两种情况下的结构相同:

enter image description here

但是,如果您尝试在具有children参数的情况下访问form.parent.children,您将不会得到该数组,而是直接得到"children"的结果:

enter image description here

如您所见,在这种情况下,form.parent.children 直接引用表单的子元素(相同标识符#1592)。但是,如果您尝试获取form.parent.children.parent.children,您将再次获得children元素,因此基本上使用这种方式无法迭代表单字段,如果表单包含名为children的参数。

这是一个错误还是我遗漏了什么?也许有另一种方法可以实现我想要的结果吗?

1个回答

3
是的,这与Twig用于方便访问每个属性的方式存在名称冲突有关,因为FormView被声明为\ArrayAccess,它优先于对象的属性。顺便说一下,parentvars属性也会发生相同的情况,但现在我们应该专注于解决方案而不是问题。
由于这是Twig的问题,因此解决方案应针对这个方向进行。一个解决方法是创建一个自定义函数以正确获取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_parentformview_childrenformview_vars来明确表示,而不传递第二个参数。
在这种情况下,您可能需要验证表单是否有父视图,因此自从Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1被引入(作为bugfix)以来,一个名为rootform的新Twig测试函数避免了这种冲突,特别是对于parent属性。
{% if form is rootform %}

感谢您的解释和提供的参考链接。 - DrKey
我真的很喜欢它,我需要这个函数。我正在处理一个任务,动态创建了表单,但不知道如何从表单子元素中检索每个表单字段。 - krachleur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接