【问题标题】:ZF2 remove isEmpty validation for form elementZF2 删除表单元素的 isEmpty 验证
【发布时间】:2015-01-24 13:00:22
【问题描述】:

我需要使用没有 isEmpty 验证的表单元素。这是我的代码。

$this->add(array(
    'name' => 'test',
    'type' => 'Zend\Form\Element\Number',
    'attributes' => array(
        'class' => 'form-control',           
    )        
));

但是给出了以下验证消息。

[test] => Array
        (
            [isEmpty] => Value is required and can't be empty
        )

我怎样才能删除它?

【问题讨论】:

  • 您的代码未显示所需的元素。您是否在输入过滤器中将其设置为必需?
  • 我没有在我的输入过滤器中为这个元素添加任何代码
  • 数字字段有要求 => 默认为真

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


【解决方案1】:

看这里: https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Element/Number.php#L95

你可以扩展这个类并重载getInputSpecification函数并返回没有'required'的数组=> true

像这样:

namespace Your\Form\Elements;
use Zend\Form\Element\Number;
class NumberWithoutRequired extends Number{
    public function getInputSpecification()
    {
        return array(
            'name' => $this->getName(),
            'required' => false,
            'filters' => array(
                array('name' => 'Zend\Filter\StringTrim')
            ),
            'validators' => $this->getValidators(),
        );
    }
}

然后在你的表单中使用这个类而不是原来的Zend\Form\Element\Number类输入

【讨论】:

    【解决方案2】:

    如果您有特定的表单类,请添加带有验证规则的getInputFilterSpecification 方法:

    class MyForm extends \Zend\Form\Form
    {
        public function init() // or __construct() if not using element manager
        {
            $this->add(array(
                'name' => 'test',
                'type' => 'Zend\Form\Element\Number',
                'attributes' => array(
                    'class' => 'form-control',
                )
            ));
        }
    
        public function getInputFilterSpecification()
        {
            return [
                'test' => [
                    'required' => false,
                ]
            ];
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以通过创建新的ValidatorChain 来做到这一点,然后遍历附加到您的元素的验证器并分离Zend\Validator\NotEmpty 验证器。就像这样:

      $newValidatorChain = new \Zend\Validator\ValidatorChain;
      
      foreach ($form->getInputFilter()->get('test')->getValidatorChain()->getValidators() 
                as $validator) 
      {
      //Attach all validators except the \Zend\Validator\NotEmpty one
      
      if (!($validator['instance'] instanceof \Zend\Validator\NotEmpty)) {
          $newValidatorChain->addValidator($validator['instance'],
                                           $validator['breakChainOnFailure']);
      }
      }
      $form->getInputFilter()->get('test')->setValidatorChain($newValidatorChain);
            
      

      【讨论】:

      • 感谢回复。但是这么大的东西对于那个小东西? ZF2为什么这么复杂?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多