【问题标题】:symfony hide fields but validate on themsymfony 隐藏字段但验证它们
【发布时间】:2015-12-08 21:04:31
【问题描述】:

我的一个实体有一个奇怪的问题。

我的 Vehicle 实体具有以下 db 表字段:

  • 订单(PK)
  • 牌照(PK)
  • 制作
  • 型号
  • 变体

在表单上唯一可见的字段是车牌。

在该字段之后有一个按钮,访问者可以在其中从 ajax 调用中获取 make/model/variant 数据,然后将数据添加到数据库中的 AjaxController。 (有一个 $session 'orderId' 设置了 'orders' 字段)。

我需要绝对确定访问者已获取品牌/型号/变体,并且访问者无法更改品牌/模型/变体数据。

如何检查表单提交是否已填写车辆表?我可以进行 Doctrine 检查并将表单设置为“无效”吗?

感谢您的宝贵时间。

问候,拉尔斯·汉森

【问题讨论】:

  • 为什么不获取 ajax 数据并填充表单的隐藏字段并在提交时包含该数据?这样,您就可以使用标准验证将字段设为必填(但隐藏)。另外,如果用户必须选择品牌/型号/变体,为什么这些字段会被隐藏?他们不想看看他们选择了什么吗?
  • 嗨@Richard -
    中不存在这些字段,因为用户可能无法更改值。我的 ajax 调用将 make/model/variant 作为字符串返回,因此用户可以看到它是正确的汽车。但我想确保用户不会更改 make/model/variant 值,因此我将它们保存在 ajax 调用中。但同时我想确保在表单中提交用户已经获取了汽车数据。有意义吗?
  • 有道理,有很多方法可以做到这一点,我已经添加了一个作为答案。

标签: php forms symfony entity


【解决方案1】:

一种方法是:

  1. 从您的表单中删除品牌、型号和变体。如果您不希望用户可能更改它们并且您将它们保存在其他地方,那么拥有它们是没有意义的。
  2. 向表单添加一个隐藏的非映射字段,例如“dataFetched”。
  3. 当通过 ajax 成功获取/保存汽车数据时,将此字段设置为选中/true
  4. 通过 javascript,在检查 dataFetched 字段之前不允许提交表单。
  5. 在 PRE_SUBMIT 监听器中,检查 dataFetched 是否为真,如果不是,则使表单无效(因为 JS 检查本身是不够的)。监听器示例见 symfony 标准包中的 CsrfValidationListener。 (我使用的是 2.3,但我认为它仍然存在于较新的版本中)。
  6. 可选如果您想在表单中保留品牌/型号/变体。在侦听器中,您还可以检查 make/model/variant 对应于您的期望(如果用户更改 它)并在那时使表单无效。

【讨论】:

  • 如何检查监听器中的品牌/型号/变体?据我所知,“EntityType”中没有 Doctrine?可以注射吗?
  • 是的,您可以将教义/实体管理器注入表单类型(以及扩展的侦听器)没有问题。您可以直接将其作为构造函数参数执行,也可以将表单类型定义为服务并以这种方式注入实体管理器。侦听器本身也可以访问表单中的底层实体对象。
  • 嗨@Richard - 我已经接受了你的回答 - 你有注射工作的例子吗?我昨天搜索了谷歌,没有任何运气。感谢您的宝贵时间!
  • 您好!表单即服务(允许 DI):symfony.com/doc/current/book/… - 表单的实体侦听器:symfony.com/doc/current/cookbook/form/… - 应该是您需要的一切。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多