我正在使用 Zend Framework 2。我在我的Entity 类中定义了一些验证规则。这些按预期工作,没有任何问题。
但是,在“编辑”模式下,我不希望需要两个文件上传字段。我尝试在我的控制器操作setRequired(false)
中为两个文件上传字段执行此操作,但它似乎对验证没有任何影响,它仍然会引发“找不到文件”消息。我需要做什么才能让用户在不上传任何文件的情况下成功提交表单?
感谢任何帮助。
要在控制器中更改表单验证,您必须删除当前验证并设置新验证。我希望这可以帮助你:
$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 ()) {
//...
}
您可以使用验证组
该文档指出:
Zend\Form 为底层 InputFilter 的 setValidationGroup() 方法提供了一个代理方法,允许我们执行这个操作。
您需要做的就是命名您需要验证的字段(省略上传元素名称)
$form->setValidationGroup(array('foo', 'bar'));
if ($form->isValid()) {
// $data contains just 'foo' and 'bar'
$data = $form->getData();
}
我收到“找不到文件”的错误消息让我意识到我遇到的问题比设置验证器/过滤器更深。
表单通过 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 = '';
};
一旦我这样做了,文件验证器就会按预期工作。
我有同样的问题,这就是我解决它的方法:
$form->remove('your_field');
$center->getInputFilter()->remove('your_field');
希望能帮助到你!