Twig - 迭代表单字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Twig - 迭代表单字段相关的知识,希望对你有一定的参考价值。

我正在尝试迭代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的参数,基本上使用这种方式是不可能迭代表单字段。

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

答案

是的,这是与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 %}

以上是关于Twig - 迭代表单字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Twig 中设置 Symfony 2 表单字段的默认值

Symfony 表单集合 Twig 渲染

在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段

检查实体字段类型是不是在 Twig 中返回值

Twig - 在 Twig 中模拟 PHP 循环功能,迭代次数为 +5(或 +1 以外的任何内容)

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?