“如何处理选择”;其他";是否以Symfony2形式在EntityChoiceList中?

“如何处理选择”;其他";是否以Symfony2形式在EntityChoiceList中?,symfony,symfony-forms,Symfony,Symfony Forms,我有一个模型,如下所述: 我还有一个表单,可以创建一个新产品,其中包含一个字段entity,用于构建一个包含所有品牌的下拉列表 现在,我想在此列表中添加一个值“Other”,以便允许用户在另一个文本字段中手动指定品牌 问题是:是否有一种干净的方法来管理Symfony2表单的这种情况(例如,在列表中添加值“Other”,它不是一个实体并使表单验证生效)?您可以通过两种方法来实现 您可以订阅FormEvents::BIND_CLIENT_DATAformevent。在事件方法中,您可以从文本中创

我有一个模型,如下所述:

我还有一个表单,可以创建一个新产品,其中包含一个字段
entity
,用于构建一个包含所有品牌的下拉列表

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


问题是:是否有一种干净的方法来管理Symfony2表单的这种情况(例如,在列表中添加值“Other”,它不是一个实体并使表单验证生效)?

您可以通过两种方法来实现

  • 您可以订阅
    FormEvents::BIND_CLIENT_DATA
    formevent。在事件方法中,您可以从文本中创建新的
    品牌
    对象,保存它并通过调用
    $event->setData($data)
    将id设置为表单。参见食谱条目

  • 您可以附加一个数据转换器。在其
    reverseTransform
    方法中,您可以创建并保存对象并返回其id。请参阅cookbook条目

感谢您的回复。我也在搜索表单事件,你的第一个解决方案在理论上看起来很棒。问题是,在这种情况下,我必须为每个表单保留一个新的Brand对象,并最终在以后删除它。最后,我认为这不是更好的解决办法。我来看看数据转换器。:)Well
FormEvents::BIND_CLIENT_DATA
事件侦听器对提交的数据进行操作。在任何数据映射发生之前。您可以只检查字段值是否为数字。如果没有,您可以保存实体并将其id设置为提交的数据。我想您不理解我的问题。我对它进行了编辑,以便更容易理解。我想逐字地将值“Other”添加到列表中,它不是一个实体,我不希望它被持久化。我已经了解了如何使用集合和“允许添加”选项动态添加新品牌(顺便说一句,FormEvents::BIND_CLIENT_DATA从2.1开始就不推荐使用,您应该改用PRE_BIND。请参阅)。我的问题是,我不知道如何处理列表中的“非实体”值,以及当表单返回时如何验证它。不过,感谢您的反馈。:)