如何为Model属性的子集创建\ Zend \ Form \ Form对象?

时间:2016-06-15 17:28:15

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

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

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

  1. 编写我自己的\Zend\Form\FormInterface实现,以防止“复制”inputfilter。
  2. 拥有一个仅包含此特定表单字段的模型。
  3. 重新考虑我的数据库设计,以便在我的所有模型和表单之间建立直接的字段到字段关系是有意义的。
  4. 非常感谢!

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

1 个答案:

答案 0 :(得分:1)

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

来自文档:

  

有时您只想验证表单元素的子集。例如,假设我们通过Web服务重新使用我们的联系表单;在这种情况下,Csrf,Captcha和submit按钮元素不感兴趣,不应该被验证。

     

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();
}