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

Php Zend Framework 2-删除的表单元素导致验证失败,php,validation,zend-framework2,zend-form,zend-form-element,Php,Validation,Zend Framework2,Zend Form,Zend Form Element,我在几个地方使用某种形式。在其中一个示例中,我需要忽略一个表单元素,该元素是在验证之后以编程方式设置的 因为这只是个例外,我不想创建一个新表单。所以我想,我只是删除了控制器中的这个元素,比如: $myForm->remove('myElement'); 问题是表单现在无法验证。我没有收到任何错误,但是$myForm->isValid()只返回一个空值 你知道我做错了什么吗 谢谢 必须为要删除的特定元素定义一个验证器 在向窗体添加新元素的控制器中,必须有addValidator调用,如:

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

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

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

你知道我做错了什么吗


谢谢

必须为要删除的特定元素定义一个验证器

在向窗体添加新元素的控制器中,必须有addValidator调用,如:

$element->addValidator('alnum')

这实际上导致验证失败。因此,您已经从表单中删除了该元素,但仍在要检查的元素上定义了验证

如果您无法在控制器中找到此验证添加函数,请尝试查看它是否已通过配置文件定义


您可以在这里进一步了解zf中的表单验证:

我想到的第一件事是从myElement的validator链中删除validator。您可以通过以下方式在控制器中获取它:

$form->getInputFilter()->get( 'myElement' )->getValidatorChain()
似乎您无法从验证链中删除,只需添加。看看这个。来自Zend的Matthew Weier O'Phinney解释了为什么不能做到这一点,并为您的场景提供了一个可能的解决方案

解决此问题的方法是在FormFilter类中创建验证器时检查“移除条件”。如果你使用注释,我认为它不适合你,所以Matthew建议是你应该使用的

或者你也可以试试@Stoyan Dimov的例子:定义两种形式,一种是BasicForm,另一种是ExtendedForm。第一个包含所有公共表单元素,第二个包含其他字段的扩展表单元素。根据您的情况,您可以使用一种或另一种。

好的,最后我!您可以定义一个
ValidationGroup
,它允许您设置要验证的属性。其他未验证:

$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);
if ($form->isValid()) {
    ...

在类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');

我使用以下命令删除元素:

$form->get('product')->remove('version');
当我发布表单时,我使用以下命令禁用此元素上的验证程序:

$form->getInputFilter()->get('product')->get('version')->setRequired(FALSE);

您确定使用的是ZF2吗?我在Zend\Form组件中找不到任何具有“remove”和“isValid”方法的类。调用isValid之前hasValidated的返回值是多少?有一个bug,让我们通过注释添加验证程序。。。如何在
ZF2
中删除它们?感谢您的总结!不幸的是,我使用的是
AnnotationForms
,在创建第二个表单时,我几乎完全冗余了……太棒了!这就是解决办法。从现在起我要用它!祝贺罗恩。我认为这是最可接受的方法,因为在
ValidatorChain
上没有
detach()
方法。正确答案。这里由@weierophinney解释:ValidatorChain是ZF2的核心类之一。如何向validationChain实例添加新方法呢?