5

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

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

$myForm->remove('myElement');

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

有什么想法我可能做错了吗?

谢谢!

4

5 回答 5

10

好的,我终于找到了解决方案!您可以定义一个ValidationGroup允许您设置要验证的属性。其他未验证:

$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);
if ($form->isValid()) {
    ...
于 2013-04-09T13:57:45.183 回答
2

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

$form->getInputFilter()->get( 'myElement' )->getValidatorChain()

似乎您无法从 ValidatorChain 中删除,只需添加即可。检查这篇文章。来自 Zend 的 Matthew Weier O'Phinney 解释了为什么它不能完成以及针对您的场景的可能解决方案。

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

或者您可以尝试@Stoyan Dimov 的这篇文章中的那个:定义两种形式,一种 BasicForm 和 ExtendedForm。第一个具有所有常见的表单元素,第二个是另一个与其余字段的扩展。根据您的情况,您可以使用一种或另一种。

于 2013-04-03T20:19:28.260 回答
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');
于 2013-05-17T14:03:19.673 回答
0

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

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

$element->addValidator('alnum');

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

如果您在控制器中找不到这个验证添加功能,请尝试查看它是否已通过配置文件定义。

您可以在此处进一步了解 zf 中的表单验证:http: //framework.zend.com/manual/1.12/en/zend.form.elements.html

于 2013-04-03T08:22:32.157 回答
0

我删除元素:

$form->get('product')->remove('version');

当我发布表单时,我禁用了此元素上的验证器:

$form->getInputFilter()->get('product')->get('version')->setRequired(FALSE);
于 2018-01-30T13:13:03.663 回答