【问题标题】:How to remove a validator from a Form Element / Form Element ValidatorChain in Zend Framework 2?如何从 Zend Framework 2 中的表单元素/表单元素验证器链中删除验证器?
【发布时间】:2013-04-27 13:09:50
【问题描述】:

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

我可以得到验证器:

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

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

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

【问题讨论】:

  • 你试过 $inputFilter = new InputFilter(); $inputFilter->remove($name);例如,您是否使用 $factory = new InputFactory();
  • 谢谢!是的,它有效:$formInputFilter = $form->getInputFilter(); $formInputFilter->remove('city'); $formInputFilter->add((new Zend\InputFilter\Factory())->createInput(array( 'name' => 'city', 'required' => true, ))); 但是我必须在视图脚本中创建一个Input。脏。
  • 在你看来只需 $newInputFilter = new InputFilter(); //.. 你的东西.. $inputFilter = new InputFilter(); $inputFilter->add($newInputFilter, "yourElement"); $form->setInputFilter($inputFilter);但在你的控制器中会更好!
  • 是的,唯一干净(-er)的方法似乎扩展了InputFilter和/或Input类,也许还有Element

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


【解决方案1】:

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

  • Zend\Validator\NotEmpty
  • Zend\Validator\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);

简单;)

【讨论】:

  • 让我试一试,如果可行,它将有很大帮助,因为目前“disable_inarray_validator”只是禁用错误消息,没有其他验证。
  • 感谢您的努力,它暂时起作用了,但是在我创建了新的验证器链之后,我后来像这样检查了它 print_r($Form->getInputFilter()->get('account') ->getValidatorChain()->getValidators());。最后我得到的是一个空数组();现在我想知道这个算法是否会删除链中的所有验证器。
  • 这是 ValidatorChain 的转储。 Zend\Validator\ValidatorChain 对象 ( [plugins:protected] => [validators:protected] => Array ( ) [messages:protected] => Array ( ) )
  • 从 Zend 2.1 开始(我相信) addValidator() 已被弃用,而应使用 attach() 。将其留在这里以供将来参考。
【解决方案2】:

我发现这适用于 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 并定义了验证器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多