ZF2 删除表单元素的空验证


ZF2 remove isEmpty validation for form element

我需要使用表单元素而不进行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
        )

如何删除它?

看这里: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

如果您有特定的表单类,请使用验证规则添加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,
            ]
        ];
    }
}
你可以通过

创建新的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);