如何使用Doctrine在Symfony2中创建复杂的表单

时间:2013-11-16 19:21:07

标签: forms symfony doctrine-orm

对于通用标题感到抱歉,但没有找到更好的描述我的情况,我接下来会介绍。

我正在开发一个项目,该项目需要创建一个项目,该项目包含各种子项目。我创建了一个Project实体和一个Subproject。现在,有多种子项目,但它们共享大部分属性,所以我创建了子项目实体,使差异存储在Options字段中。因此,每个项目将在选项字段中具有公共字段+一组选项。

在创建输入数据的表单时,我想渲染用户可以为每个子项目填写的独立字段(它只是一个大表单,主项目和子项目字段要填写)。

然后,当用户提交数据时,我想在每个子项目中取出“不同”的字段并将它们放在选项字段中。

[编辑]为了更清楚,我有一个项目,然后是一个平台1子项目,一个平台2子项目,等等。平台1子项目可以有公共子项目字段+ my_custom字段1;平台2子项目将有公共字段+ my_custom字段2.现在,当我将存储子项目时,我将它们放在子项目表中,在那里我填写公共字段,然后填写不同的字段(在概念,数量或其他)我存储在选项字段中。然后,每个子项目都有一个选项字段,其中包含特定的格式化数据。话虽如此,每个子项目的每个表格与其他表格略有不同。[编辑]

这是一个问题:如何创建包含特定子项目表单的表单,然后将这些“不同”字段转换为仅一个选项字段。我是否需要为每个子项目类型创建FormType?如果是,那么我是否需要为每个子项目类型创建一个实体(不可持久)?

如果您不明白,请问我,我会尽力回答任何问题以澄清这一点。不要包含代码,因为我认为没有必要,但如果您认为是,请告诉我。我已经阅读了Symfony一书中的DataTransformers部分和嵌入式表格,因此指向这个方向对我没那么大帮助。尽管如此,如果您对如何使用这些东西实现我想要的东西有实际的见解,那么您的建议非常受欢迎。

SO中的一些问题针对简单字段解决了这个主题,但没有提供我正在寻找的答案。

任何线索都表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用表单构建器中的集合类型直接从Project表单添加新的“子实体”,您需要一些javascript来附加新的“子实体”表单,但原型使它非常轻松。 / p>

        ->add('sub_projects', 'collection', array('type' => new SubProjectType(),
                                          'allow_add'    => true,
                                          'allow_delete' => true,
                                          'prototype' => true))

我会让你查看实际的代码,这里有很好的解释http://symfony.com/doc/current/reference/forms/types/collection.html#basic-usage

要填充数组,最好的选择是使用doctrine的prePersist事件 - 特别是如果您使用的是2.4 - 但您也可以在$form->isValid$em->persist之前的创建/更新方法中添加逻辑。你的控制器类。或者也可以使用JS来动态更改隐藏输入的值,但我真的不建议这样做。

答案 1 :(得分:1)

首先创建一个ProjectFormType以及一个SubProjectFormType。确保您了解如何使用集合字段类型以允许一个项目包含多个子项目。

http://symfony.com/doc/current/cookbook/form/form_collections.html

如果掌握了基础知识,请阅读并了解如何动态地向表单添加字段。

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

您基本上将创建一个监听preSetData事件的SubProjectSubscriber。在您的SubProjectFormType中,您将添加订阅者。

订阅者get已经传递了subProject的实际实例。然后,订户可以检查选项并根据需要添加自定义表单字段。

但同样,在进入动态内容之前,请确保掌握基础知识。