我用一定的形式在几个地方。 在其中的一个我需要忽略我验证后编程设置表单元素。
因为它只是一个例外,我不希望创建一个新的形式。 所以我想,我只是删除这个元素,如控制器:
$myForm->remove('myElement');
问题是,现在的形式将不进行验证。 我没有得到任何错误,但$myForm->isValid()
方法会返回一个空值。
任何想法我可能是做错了?
谢谢!
我用一定的形式在几个地方。 在其中的一个我需要忽略我验证后编程设置表单元素。
因为它只是一个例外,我不希望创建一个新的形式。 所以我想,我只是删除这个元素,如控制器:
$myForm->remove('myElement');
问题是,现在的形式将不进行验证。 我没有得到任何错误,但$myForm->isValid()
方法会返回一个空值。
任何想法我可能是做错了?
谢谢!
好吧,我终于找到了解决办法 ! 您可以定义ValidationGroup
它允许你设置你想验证的属性。 其他人不验证:
$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);
if ($form->isValid()) {
...
我想到的第一件事就是从您的myElement的ValidatorChain删除验证。 你可以在控制器内得到它:
$form->getInputFilter()->get( 'myElement' )->getValidatorChain()
好像你不能从ValidatorChain删除,只是增加。 检查这个职位 。 马修·威尔O'Phinney,从Zend的,解释了为什么它不能做,并为您的方案可能的解决方案。
我解决这个问题的方法,当我创建的FormFilter类的验证器检查“删除条件”。 如果您使用注释,我认为它不为你工作,让马修的建议是你应该使用的。
或者你可以尝试的人在这个职位从@Stoyan Dimov拥有:定义了两种形式,一种BasicForm和ExtendedForm的。 第一个具有所有常见的形式的元素,第二个是另一个用其余字段的扩展之一。 根据你的情况,你可以使用一个或另一个。
在class ValidatorChain implements Countable, ValidatorInterface
,添加一个新方法:
public function remove($name){
foreach ($this->validators as $key => $element) {
$validator = $element['instance'];
if($validator instanceof $name){
unset($this->validators[$key]);
break;
}
}
}
使用这样的:
$form->getInputFilter()->get("xxxxx")->getValidatorChain()->remove('xxxxxx');
必须有你试图删除这个特定的元素定义的验证。
在你的控制器在其中添加新的元素形成,必须有addValidator调用,如:
$元素 - > addValidator( 'alnum');
这实际上是导致确认为失败。 所以,你已删除从表单中的元素,但你仍然有一个元素定义的验证进行检查。
如果您无法找到此验证控制器中添加功能,尝试,看它是否已通过配置文件定义。
您可以对表单验证进一步ZF在这里读到: http://framework.zend.com/manual/1.12/en/zend.form.elements.html
我删除与元素:
$form->get('product')->remove('version');
当我张贴的形式我禁用此元素的验证:
$form->getInputFilter()->get('product')->get('version')->setRequired(FALSE);