我在几个地方使用了某种形式。在其中一个中,我需要忽略我在验证后以编程方式设置的表单元素。
因为这只是一个例外,我不想创建一个新表单。所以我想,我只是在控制器中删除这个元素,比如:
$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 中删除,只需添加即可。检查这篇文章。来自 Zend 的 Matthew Weier O'Phinney 解释了为什么它不能完成以及针对您的场景的可能解决方案。
我解决这个问题的方法是在 FormFilter 类中创建验证器时检查“删除条件”。如果您使用注释,我认为它不适合您,因此您应该使用 Matthew 建议。
或者您可以尝试@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 调用,例如:
$element->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);