2017-12-18 438 views
4

我面临一个问题,试图遍历树枝表单主题中的所有表单元素。其实我用这个来遍历他们:树枝 - 遍历表单域

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

我没有发现它在文档,我只是把表单变量,发现道路上的字段。这实际上适用于所有表单,除非表单本身有一个名为的子项。我不知道这是否是一个错误,因为如果你只是转储form对象的结构是在两种情况下是相同的:

enter image description here

但是,如果您尝试访问form.parent.children当它有一个children参数里面你赢了“T获得该数组的"children",而直接结果:

enter image description here

正如你在这种情况下看到form.parent.children直接指形式的儿童元素(同已识别r#1592)。如果您尝试获得form.parent.children.parent.children,您将再次获得children元素,因此如果表单包含名为children的参数,则基本上使用此方法不可能遍历表单字段。

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

回答

3

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

由于这是一个树枝的问题,解决方案应针对这个方向。一种解决方法可能是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_parent,formview_childrenformview_vars来代替,并且不要传递第二个参数。


在这个意义上,你可能也需要验证表单是否具有父视图与否,这样以来Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1 was introduced(如bug修正)的新枝条的测试功能命名为rootform是避免这种冲突,尤其是对parent物业:

{% if form is rootform %} 
+0

谢谢您的解释和参考链接。 – DrKey