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
。
这是一个错误还是我错过了什么?也许还有另一种方式来实现我想要的?
是的,这是一个与 Twig 为方便起见而访问每个属性的方式相关的名称冲突,因为它FormView
被声明为\ArrayAccess
优先于对象的属性。顺便说一句,同样的情况也会发生在parent
和vars
属性上,但是让我们现在关注解决方案而不是问题。
由于这是一个 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_parent
,formview_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)