具有多个属性的zend \ form \ element \ select:如何覆盖默认的notEmpty验证错误?

时间:2016-01-14 16:36:16

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

我的Zend\Form包含Zend\Form\Element\Select属性'multiple' => 'multiple'NotEmpty验证程序,其中包含自定义isEmpty错误消息。
使用多个属性集,当我提交表单而不选择任何选项时,我得到默认的"值是必需的..." 错误消息而不是我自己的错误消息。
当我删除multiple属性时,我得到了所需的行为,即我的自定义错误消息。

那么,我做错了什么?

这是一个快速而肮脏的测试,为了演示而将所有内容都塞进我的控制器动作中:

public function testAction() {

    $form = new \Zend\Form\Form;
    $factory = new \Zend\InputFilter\Factory;
    $form->add(
        [
            'name' => 'select',
            'type' => 'Zend\Form\Element\Select',
            'attributes' => [
                'multiple' => 'multiple',
            ],
            'options' =>[
                'value_options' => ['' => '', 1 => "one", 2 => "two", 3 => "three"],
            ] 
        ]

    );
    $filter = $factory->createInputFilter([
        'select' => [
            'name' => 'select',
            'required' => true,
            'filters' => [
                ['name' => 'StringTrim',],
            ],
            'validators' => [[
                'name' => 'NotEmpty',
                'options' => ['messages' => ['isEmpty'=> 'all Dharmas are forms of Emptiness']],
            ]],
        ]
    ]);
    $form->setInputFilter($filter);
    $form->add(['name'=> 'submit','type'=> 'submit', 'attributes'=> ['value'=> 'submit']]);
    $form->setAttribute('action','/my-project/index/test')
    $view = new ViewModel();
    $view->setTemplate('my-project/index/test')
        ->setVariables(['form' => $form]);
    if ($this->getRequest()->isPost()) {
        $data = $this->params()->fromPost();
        $form->setData($data);
        print_r($data); // just making sure, for sanity's sake
        if ($form->isValid()) {
            echo "valid!";
        } else {
            echo "validation failed.";
        }
    }
    return $view;
}

只是为了记录,这里是视图,虽然我知道(通过转储错误消息)问题不在这里:

<?php 
$form = $this->form;
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formCollection($form);
echo $this->form()->closeTag();

谢谢!

1 个答案:

答案 0 :(得分:0)

这可能与设置multiple字段会导致Select类更改验证程序这一事实有关。

您可以看到here on line 227 in the getValidator method of the Zend\Form\Element\Select class

$validator = new ExplodeValidator([
    'validator'      => $validator,
    'valueDelimiter' => null, // skip explode if only one value
]);

ExplodeValidator will validate each value independently以及您提供的验证程序,这可能会导致意外的&#34;值是必需的...&#34; 错误消息。最有可能验证者将on line 186设置$values作为包含空字符串的数组。

我认为,如果您想要获取自定义消息,请为验证程序设置required => false'allow_empty' => false。在你的情况下,我认为这应该不是一个问题......