Zend Framework 2 - 删除的表单元素导致验证失败

时间:2013-04-03 08:13:29

标签: php validation zend-framework2 zend-form zend-form-element

我在几个地方使用某种形式。在其中一个中,我需要忽略在验证后以编程方式设置的表单元素。

因为它只是一个例外,我不想创建新表单。所以我想,我只是在控制器中删除这个元素,如:

$myForm->remove('myElement');

问题是表单现在不会验证。我没有收到任何错误,但$myForm->isValid()只返回一个空值。

任何想法我可能做错了什么?

谢谢!

5 个答案:

答案 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);