如何从Zend Framework 2中的表单元素/表单元素ValidatorChain中删除验证器?

时间:2013-04-27 13:09:51

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

我在SO上阅读了这个问题:“how to disable inArray validator forms in zend framework2”并试图找到它,但找不到任何方法来分离/删除InArray验证器。但InArray只是 验证程序。那么如何从表单元素的验证器列表中删除验证器呢?

我可以获得验证器:

$myElement = $form->getInputFilter()->get('city');
$validatorChain = $cityElement->getValidatorChain();
$validators = $validatorChain->getValidators();

然后可能可以使用验证器取消设置数组元素,我想删除,然后将结果数组传递回Input对象和表单元素。但它真的很脏,肯定不是推荐的方式。

那么如何从表单元素中删除验证器?

2 个答案:

答案 0 :(得分:6)

好吧,你可以用新的验证器替换验证器链。假设我有一个带有两个验证器的元素:

  • 的Zend \验证\ NotEmpty
  • 的Zend \验证\ EmailAddress的

我想从中删除EmailAddress验证器。你可以这样做:

// create new validator chain
$newValidatorChain = new \Zend\Validator\ValidatorChain;
// loop through all validators of the validator chained currently attached to the element
foreach ($form->getInputFilter()->get('myElement')->getValidatorChain()->getValidators() as $validator) {
    // attach validator unless it's instance of Zend\Validator\EmailAddress
    if (!($validator['instance'] instanceof \Zend\Validator\EmailAddress)) {
        $newValidatorChain->addValidator($validator['instance'], $validator['breakChainOnFailure']);
    }
}
// replace the old validator chain on the element
$form->getInputFilter()->get('myElement')->setValidatorChain($newValidatorChain);

容易;)

答案 1 :(得分:3)

我发现这适用于1.12.3

在我的更新表格中

$element = new My_Form_Element_Username('username');
$element->setValue('some-value');
$element->removeValidator('Db_NoRecordExists');
$this->addElement($element);

$this->addElement(new My_Form_Element_Username('username')
  ->setValue('some-value')
  ->removeValidator('Db_NoRecordExists');

My_Form_Element_Username只是扩展了一些Zend_Form_Element并定义了验证器。