2

我正在使用 Zend Framework 2。我在我的Entity 类中定义了一些验证规则。这些按预期工作,没有任何问题。

但是,在“编辑”模式下,我不希望需要两个文件上传字段。我尝试在我的控制器操作setRequired(false)中为两个文件上传字段执行此操作,但它似乎对验证没有任何影响,它仍然会引发“找不到文件”消息。我需要做什么才能让用户在不上传任何文件的情况下成功提交表单?

感谢任何帮助。

4

4 回答 4

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 ()) {
    //...   
}
于 2013-11-12T06:17:10.760 回答
1

您可以使用验证组

该文档指出:

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

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

$form->setValidationGroup(array('foo', 'bar'));
if ($form->isValid()) {
   // $data contains just 'foo' and 'bar'
   $data = $form->getData();
}
于 2013-11-12T09:36:31.383 回答
0

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

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

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

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

    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 = '';
    };

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

于 2013-11-12T10:14:47.093 回答
0

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

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

希望能帮助到你!

于 2015-03-06T11:44:52.513 回答