如何在Zend Framework 2中修改控制器中的表单验证器?

时间:2013-11-11 15:53:33

标签: php validation zend-framework zend-framework2

我正在使用Zend Framework 2.我在Entity class中定义了一些验证规则。这些工作没有任何问题。

但是,当处于“编辑”模式时,我不希望需要两个文件上载字段。我尝试对controller action中的两个文件上传字段执行setRequired(false),但它似乎对验证没有任何影响,但仍然会抛出'找不到文件'消息。我需要什么才能让用户成功提交表单而无需上传任何文件?

感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

要在控制器中进行更改表单验证,您必须删除当前验证并设置新验证。我希望这可以帮到你:

$form = new YourForm();
$form->setData ( $yourPostedData () );
$formInputFilter = $form->getInputFilter ();

// change filter
$formInputFilter->remove ( 'your_field' );
$inputFactory = new \Zend\InputFilter\Factory();
$formInputFilter->add ( $inputFactory->createInput ( array (
    'name' => 'your_field',
    'required' => false
) ) );

if ($form->isValid ()) {
    //...   
}

答案 1 :(得分:1)

您可以使用validation groups

文档说明:

  

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

您需要做的就是命名您需要验证的字段(省略上传元素名称)

$form->setValidationGroup(array('foo', 'bar'));
if ($form->isValid()) {
   // $data contains just 'foo' and 'bar'
   $data = $form->getData();
}

答案 2 :(得分:0)

我收到'找不到文件'的错误消息让我意识到我遇到的问题比设置验证器/过滤器更深。

使用FormData对象通过AJAX脚本处理表单。我使用以下方法将文件添加到对象中:

oAgencyFormData.append("cssFilename", document.getElementById('logoName').files[0]);

然后将对象传递给AJAX调用。我意识到,在没有上传文件的情况下,'undefined'被传递给脚本。所以我将它分成一个变量,如果没有指定文件,则将其分配给“

    var oLogoFile   =   document.getElementById('logoName').files[0];   
    var oCssFile    =   document.getElementById('cssFilename').files[0];

    // define defaults for file upload fields (used if nothing is uploaded)
    if(typeof oLogoFile === 'undefined'){
        oLogoFile = '';
    };

    if(typeof oCssFile === 'undefined'){
        oCssFile = '';
    };

一旦我这样做,文件验证器就按预期工作了。

答案 3 :(得分:0)

我遇到了同样的问题,这就是我解决它的方法:

$form->remove('your_field');
$center->getInputFilter()->remove('your_field');

希望它有所帮助!