2015-12-08 99 views
0

我有一个奇怪的问题,与我的一个实体。symfony隐藏字段,但验证它们

我的车实体具有以下数据库表字段:

  • 订单(PK)
  • licenseplate(PK)
  • 使
  • 模型
  • 变种

在唯一可见的字段形式是牌照。

该字段后面有一个按钮,访问者通过ajax调用将数据添加到数据库的AjaxController来获取make/model/variant数据。 (有一个$ session'orderId'来设置'orders'字段)。

我需要绝对确定访问者已经获取了make/model/variant,并且访问者不能更改make/model/variant数据。

如何检查表单上是否填写了车辆表?我可以做一个学说检查并将表格设置为“无效”吗?

谢谢你的时间。

问候,拉斯

+0

为什么不提取ajax数据并填充表单的隐藏字段并在提交时包含该数据?这样你就可以制作需要使用标准验证的字段(但隐藏)。 此外,如果用户必须选择制造商/型号/变体,为什么这些字段是隐藏的?他们不想看看他们选择了什么吗? – Richard

+0

嗨@Richard - 这些字段不在

中,因为用户可能无法更改这些值。 我的ajax调用返回make/model/variant作为一个字符串,以便用户可以看到它是正确的汽车。 但我想确保用户不会更改make/model/variant值,因此我将它们保存在ajax调用中。 但同时我想确认在表单提交用户已经提取了汽车数据。 它有道理吗? –

+0

这很有道理,有很多方法可以做到这一点,我已经添加了一个作为我头顶的答案。 – Richard

回答

0

一种方法是:

  1. 卸妆,从表单模型和变型。如果你不希望用户潜在地改变它们,并且你将它们保存在其他地方,那么让它们毫无意义。
  2. 向表单中添加隐藏的非映射字段,如'dataFetched'。
  3. 当通过ajax成功获取/保存汽车数据时,将此字段设置为选中/ true
  4. 通过javascript,直到dataFetched字段被选中才允许表单提交。
  5. 在PRE_SUBMIT侦听器中,检查dataFetched是否为true,如果不是,则使表单失效(因为JS检查本身是不够的)。有关侦听器示例,请参阅symfony标准包中的CsrfValidationListener。 (我使用2.3,但我认为它仍然在更新版本中)。
  6. (可选)如果您想在表单中保留make/model/variant。在收听者中,您还可以检查制作/型号/变体 是否符合您的预期(在用户更改 的情况下)&将使表单在此时无效。
+0

如何查看Listener中的make/model/variant? 据我所知“Docity”在“EntityType”中不可用?它可以注射吗? –

+0

是的,你可以注入doctrine/entitymanager到一个表单类型(以及扩展的监听器)没有问题。您可以直接作为构造函数参数来完成,或者将表单类型定义为服务并以此方式注入实体管理器。听众本身也可以访问表单中的底层实体对象。 – Richard

+0

嗨@Richard - 我接受了你的回答 - 你有没有注射工程的例子?我昨天没有任何运气搜索谷歌。感谢您的时间! –