Twig - 迭代表单字段

DrK*_*Key 5 php forms symfony twig

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

{% for child in form.parent.children %}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

但是,如果您尝试访问form.parent.children它内部有children参数的情况,您将不会获得该数组,而是直接获得以下结果"children"

在此输入图像描述

正如您所看到的,在本例中form.parent.children直接引用表单的子元素(相同的标识符#1592)。不过,如果您尝试获取,form.parent.children.parent.children您将再次获得children元素,因此如果表单包含名为 的参数,则基本上使用这种方式不可能迭代表单字段children

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

yce*_*uto 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};
}
Run Code Online (Sandbox Code Playgroud)

因此,当使用此函数时,您可以访问视图的属性而不是表单的字段(如果存在名称冲突):

{% for child in formview_prop(form, 'parent') %}
Run Code Online (Sandbox Code Playgroud)

然后,它将迭代父视图的所有字段元素(子元素)。但是,我更愿意通过创建三个函数来明确formview_parentformview_children而不formview_vars传递第二个参数。


从这个意义上说,您可能还需要验证表单是否有父视图,因此自从Symfony 2.7.39、2.8.32、3.3.14、3.4.1、4.0.1 引入(作为错误修复)一个新的 Twig命名的测试函数rootform可以避免这种冲突,特别是对于parent属性:

{% if form is rootform %}
Run Code Online (Sandbox Code Playgroud)