我在几个地方使用某种形式。在其中一个中,我需要忽略在验证后以编程方式设置的表单元素。
因为它只是一个例外,我不想创建新表单。所以我想,我只是在控制器中删除这个元素,如:
$myForm->remove('myElement');
问题是表单现在不会验证。我没有收到任何错误,但$myForm->isValid()
只返回一个空值。
任何想法我可能做错了什么?
谢谢!
答案 0 :(得分:10)
好的,最后我found a solution!您可以定义ValidationGroup
,它允许您设置要验证的属性。其他人没有经过验证:
$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);
if ($form->isValid()) {
...
答案 1 :(得分:2)
我想到的第一件事是从你的myElement的ValidatorChain中删除验证器。您可以通过以下方式在控制器中获取它:
$form->getInputFilter()->get( 'myElement' )->getValidatorChain()
好像你无法从ValidatorChain中删除,只需添加即可。检查此post。来自Zend的Matthew Weier O'Phinney解释了为什么无法完成它并为您的场景提供可能的解决方案。
我解决这个问题的方法是在FormFilter类中创建验证器时检查'删除条件'。如果你使用注释我认为它不适合你,所以马修的建议是你应该使用的。
或者你可以尝试@Stoyan Dimov的post中的那个:定义两种形式,一种BasicForm和ExtendedForm。第一个具有所有常见的表单元素,第二个是另一个具有其余字段的扩展的元素。根据您的情况,您可以使用其中一种。
答案 2 :(得分:1)
在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');
答案 3 :(得分:0)
必须为您尝试删除的此特定元素定义验证器。
在你要向表单添加新元素的控制器中,必须有addValidator调用,如:
$元素 - > addValidator( 'alnum');
这实际上导致验证失败。因此,您已从表单中删除了元素,但仍然要对要检查的元素进行定义验证。
如果您无法在控制器中找到此验证添加功能,请尝试查看是否已通过配置文件定义。
您可以在此处阅读有关zf表单验证的更多信息:http://framework.zend.com/manual/1.12/en/zend.form.elements.html
答案 4 :(得分:0)
我删除元素:
$form->get('product')->remove('version');
当我发布表单时,我使用以下命令禁用此元素上的验证器:
$form->getInputFilter()->get('product')->get('version')->setRequired(FALSE);