【问题标题】:How to create a \Zend\Form\Form object for a subset of Model properties?如何为模型属性的子集创建 \Zend\Form\Form 对象?
【发布时间】:2016-06-15 17:28:14
【问题描述】:

我有一个模型,其中包含 10 个属性,我为每个属性指定输入过滤规则。我想创建一个 \Zend\Form\Form 对象,它应该只用于这 10 个字段的子集(比如其中的 5 个)。我遇到的问题是,当我执行\Zend\Form\Form::bind() 时,所有 10 个字段的输入过滤器规则都被拉入,并且由于表单没有 5 个字段,因此验证出现错误(尽管由于表单没有出现零错误消息没有它们)。

我知道有几个选项可以解决这个问题,但我想为模型中的每个字段维护过滤器和验证规则,因此无论我使用的表单是什么,都将使用相同的过滤和验证规则自动被采纳。我对 ZF2 还是比较陌生,所以我真的在问除了我将在下面列出的选项之外是否还有其他方法可以做到这一点。

  1. 编写我自己的\Zend\Form\FormInterface 实现,以防止输入过滤器的“复制”。
  2. 拥有一个仅包含此特定表单字段的模型。
  3. 重新思考我的数据库设计,以便在我的所有模型和表单之间建立直接的字段到字段关系。

非常感谢!

注意:我尝试使用表单工厂中的模型对象中的\Zend\Input\InputFilter::get('FieldNameHere') 仅拉入我需要的InputInterface,但\Zend\Form\Form::bind() 只是覆盖它.

【问题讨论】:

  • 你应该看看validation groups
  • @AlexP 这正是我所需要的,谢谢。如果您发布答案,我会接受。

标签: php forms validation zend-framework2 zend-form


【解决方案1】:

您可以使用validation groups 选择应在表单验证中包含哪些元素。

来自文档:

有时您只想验证表单元素的子集。例如,假设我们通过 Web 服务重复使用我们的联系表;在这种情况下,Csrf、Captcha 和提交按钮元素不重要,不应进行验证。

Zend\Form 为底层 InputFilter 的 setValidationGroup() 方法提供了一个代理方法,允许我们执行此操作。

$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);

if ($form->isValid()) {
    // Contains only the "name", "email", "subject", and "message" values
    $data = $form->getData();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 2013-01-22
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多