外国实体在形式上分为不同类型的输入

时间:2013-07-03 10:02:44

标签: forms symfony entities

我有两个实体:产品和类别(Symfony 2.3)。

我想创建一个表单,用户可以通过首先选择类别来选择产品。用户通过单击图像选择类别,然后我想将图像的值设置为隐藏输入,但我不知道如何将外部实体选择列表更改为隐藏输入(http://symfony.com/doc/current/reference/forms/types/entity.html)。

  1. 我怎样才能做到这一点? (如何将表单输入更改为隐藏)
  2. 如果我将级联验证设置为true,那么它是否会检查某个类别是否确实存在。 (为了防止恶意用户使用不存在类别的产品)?

1 个答案:

答案 0 :(得分:2)

第1部分

要做到这一点,您需要使用data transformer做两件事:

  • 将实体转换为字符串或整数的标识符,以便表单可以将其呈现为隐藏字段。
  • 在提交表单时将字符串或整数标识符转换为实体,以便可以使用正确的关系保存父实体

我上面链接的symfony文档(here too)实际上是在使用带有表单的数据转换器的完整示例。

作为一个无耻的插件(因为我认为它很有帮助)我已经编写了一个关于使用数据转换器来实现具有实体ID的隐藏字段的小教程:http://lrotherfield.com/blog/symfony2-forms-entity-as-hidden-field/

第2部分

如果您使用的是数据转换器,则无需担心恶意用户。数据转换器将失败,因为它无法从伪id中反转转换类别。在我的教程中,变换器将抛出Symfony\Component\Form\Exception\TransformationFailedException异常。

如果您希望检查提交的类别是否真实,如果您希望在表单中显示错误,也可以编写验证程序(potentially using a call back)。由于外键约束将失败,因此Doctrine不允许您保留伪类别关系。