我正在使用Zend Framework 2.我在Entity class中定义了一些验证规则。这些工作没有任何问题。
但是,当处于“编辑”模式时,我不希望需要两个文件上载字段。我尝试对controller action中的两个文件上传字段执行setRequired(false)
,但它似乎对验证没有任何影响,但仍然会抛出'找不到文件'消息。我需要什么才能让用户成功提交表单而无需上传任何文件?
感谢任何帮助。
答案 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');
希望它有所帮助!