Symfony2 表单 - 如何使用动态选择选项

5
我正在制作一个用于发送通知的表单。在这个表单中,除了其他字段之外,我还有一个文件输入字段。在这个字段中,我加载了一个CSV文件。从CSV中(含有一列电子邮件),我使用https://code.google.com/p/jquery-csv/提取数据,并将其添加到一个具有所有选项选择的select readonly多字段中。
注意:我使用Symfony2书中的Form Types创建了表单 - class NotificationType extends AbstractType;表单通过AJAX提交; 第一次尝试(Strike one) 考虑到选择字段是动态填充的,我决定将其添加到表单构建器中,而是使用JavaScript注入它。
这是一个糟糕的举动,因为在提交表单时,Symfony2验证添加到表单构建器中的字段必须与提交的字段完全相同。返回的错误是:此表单不应包含额外的字段第二次尝试(Strike two) 从第一次尝试中继续前进,我想看看是否可以解决这个问题,因此我在表单构建器中添加了选择字段,但不带选项,同时还使用JavaScript注入选项。
仍然没有运气。Symfony2也确保您不能提交未添加到表单构建器的选项。返回的错误是:此值无效第三次尝试(Strike three) 从第1和第2次尝试中,我猜想使其工作的唯一方法是在添加字段时将所有可能的选项添加到表单构建器中的选择数组中。这样,字段和选项将有效地提交。
但是,这不是我考虑的可行选择,特别是因为在选择字段中,我预计有可能出现10,000个结果,而我直到加载CSV文件时才知道它们。
您能提供其他解决方案吗?
谢谢!

使用这个文档将是最好的选择。但是你的第三个实现已经接近成功了。不要添加所有可能的选项,为什么不在选项数组中只添加所选的值呢? - xiidea
1个回答

4
请看如何动态修改表单(示例#3)。
您需要这样做,因为表单将根据构建器选项进行验证,因此如果在呈现时添加新字段或更改其选项,则不会知道它。
或者您可以不将表单映射到模型/实体并自行处理。

我的字段是选择而不是实体,我没有任何定义的实体类可以使用,感谢您指向文档。您还能提出其他建议吗? - Radu
@Radu,如果字段不是实体,您仍然可以使用该原则。不要检查实体,而是检查字段一的值并相应地设置选项。根据示例行$positions = null === $sport ? array() : $sport->getAvailablePositions();,您可以执行以下操作:if ($field1value == 'foo') { $choices = array('alice', 'bob', 'malfoy'); } - Rooneyl
需求略有变化。我已更新初始细节。 - Radu
有没有任何示例或教程?我认为你的方法是正确的,肯定有一个博客或教程可以给出完整的示例。如果没有,我会尝试制作一个,以便其他人可以使用(并改进!)。 - Stephan Vierkant
@StephanVierkant 如果您有示例,请随意编辑此答案,使其成为更完整的可能解决方案。 - Rooneyl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接