2012-05-29 26 views
4

我有一个模型,如下所述:如何处理Symfony2表单EntityChoiceList中的“其他”选项?

http://yuml.me/diagram/class/[Product]0..*-1[Brand]

我也得到了一个表单创建一个新的产品,建立一个包含所有品牌的下拉列表字段entity

现在我想在此列表中添加一个“Other”值,以便用户在另一个文本字段中手动指定品牌。

问题是:是否有一种干净的方式来管理这种情况(例如,添加值“Other”在列表中,这不是一个实体,并得到表单验证工作)与Symfony2形式?

回答

2

你可以做到这一点有两种方式,

  • 可以认购FormEvents::BIND_CLIENT_DATA形式事件。在事件方法中,您可以从文本中创建新的对象,将其保存并通过调用$event->setData($data)将该ID设置为表单。参见this食谱条目。

OR

  • 您可以将数据转换。在其reverseTransform方法中,您可以创建+保存对象并返回其ID。参见this食谱条目。
+0

感谢您的回复。我也在寻找表单事件,你的第一个解决方案在理论上看起来很棒。问题是,在这种情况下,我必须为每个表单坚持一个新的Brand对象,并最终在以后删除它。最后,我不认为这是更好的解决方案。我将看看Data Transformer。 :) –

+2

那么'FormEvents :: BIND_CLIENT_DATA'事件监听器对提交的数据进行操作。在任何数据映射发生之前。您可以检查字段值是否为数字。如果没有,那么你可以保存实体并将其ID设置为提交的数据。 –

+0

我想你不明白我的问题。我编辑它更容易理解。我想从字面上将值“Other”添加到列表中,这不是一个实体,我不希望它被持久化。我已经想出了如何动态地添加一个新的品牌与集合和“allow_add”选项(顺便说一句,FormEvents :: BIND_CLIENT_DATA已弃用2.1以来,你应该使用PRE_BIND代替。请参阅http://bit.ly/JMYXih )。我的问题是我不知道如何处理列表中的“非实体”值,以及在表单返回时如何验证它。尽管如此,感谢您的反馈。 :) –

相关问题