Twig - 迭代表单字段

问题描述 投票:4回答:1

我正在尝试迭代Twig表单主题中的所有表单元素时遇到问题。实际上我用它来迭代它们:

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

我没有在文档中找到它,我只是转储表单变量并找到该路径上的字段。这实际上适用于所有表单,除非表单本身有一个名为children的参数。我不知道它是不是一个bug,因为如果你只是转储form对象,结构在两种情况下是相同的:

enter image description here

但是如果你尝试访问form.parent.children,当它里面有一个children参数时,你将不会直接得到"children"的结果:

enter image description here

正如您在这种情况下所看到的,form.parent.children直接引用了form的子元素(相同的标识符#1592)。仍然如果你试图获得form.parent.children.parent.children你将再次获得children元素所以如果form包含一个名为children的参数,基本上使用这种方式是不可能迭代表单字段。

这是一个错误还是我错过了什么?也许有另一种方法来实现我想要的东西?

php forms symfony twig
1个回答
2
投票

是的,这是与the way Twig accesses each attribute for convenience相关的名称冲突,因为FormView被宣布为\ArrayAccess it has priority over object's properties。顺便说一句,parentvars属性也会发生同样的事情,但现在让我们关注解决方案,而不是问题。

由于这是一个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_parentformview_childrenformview_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 %}
© www.soinside.com 2019 - 2024. All rights reserved.