Php 如何使用symfony2和doctrine2在表单中动态创建多个表单元素

Php 如何使用symfony2和doctrine2在表单中动态创建多个表单元素,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我有一个表单,它链接到数据库中的3个表 第一个表的窗体可以访问第二个表的窗体,第二个表的窗体可以访问第三个窗体的类型 其工作方式如下: firstType具有以下结构 $builder->add('second', new secondType()) secondType具有以下功能 $builder->add('third', 'collection', array( 'type', new thirdType(), 'allow_add' => true,

我有一个表单,它链接到数据库中的3个表

第一个表的窗体可以访问第二个表的窗体,第二个表的窗体可以访问第三个窗体的类型

其工作方式如下:

firstType具有以下结构

$builder->add('second', new secondType())
secondType具有以下功能

$builder->add('third', 'collection', array(
    'type', new thirdType(),
    'allow_add' => true,
    'by_reference' => false,
))
第三种类型:

$builder->add('a')->add('b')
当然,firstType和secondType有更多的元素,firstType通过onetoone映射与secondType链接,secondType通过onetomany映射与thirdtype链接

上面的结构使我可以将第三个表的多个实例映射为第二个表的一个实例。现在我遇到的问题是,我无法以细枝形式访问第三个表。我得到的错误是

第120行的x.html.twig中不存在对象“Symfony\Component\Form\FormView”的方法“a”

我尝试这样访问它:

{{ form_label(form.second.third.a) }}
同样的格式适用于second的元素。e、 g

{{ form_label(form.second.a_2) }}
我试着遵循:


没有成功。

这里的问题似乎是second有一个third的集合,因此您需要迭代form.second.third,然后对于每个元素,您可以得到“a”元素。我从未以这种方式展示过嵌入表单,但您可以尝试以下方式:

{% for element in form.second.third %}
   {{ form_label(element.a) }}
{% endfor %}

希望这对你有所帮助

在twig中,你可以随时使用
{{dump(variable)}
函数来查看当你被卡住时发生了什么▼ +变量:数组:30[▶] +父对象:FormView{#962▶} +子项:[]-呈现:false}它没有显示子元素。这是wierd,但它仍然不能解决我的问题。当我不使用集合表单类型时,我可以访问第三个表单的元素,但这无助于我创建表单动态。如果我们不知道用户希望动态生成多少元素,for循环会起作用吗?这就是为什么我说从不使用你需要做的是在创建所有类型之前,在第二个元素中添加一个第三个元素,并按照cookbook的说法,通过添加更多元素的选项向用户显示。在twig中,只需打印表单行(form.second.third)和一个“third”同时,foor循环不需要知道有多少个元素,只需打印所有元素即可。