zend\form\element\select с несколькими атрибутами: как переопределить ошибку проверки notEmpty по умолчанию?

Мой 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 ответ

Это, вероятно, связано с тем, что установка multiple поле вызовет Select класс для изменения валидатора.

Вы можете видеть это здесь на линии 227 в getValidator метод Zend\Form\Element\Select класс

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

ExplodeValidator будет проверять каждое значение независимо с помощью предоставленного вами валидатора, что, вероятно, приведет к неожиданному сообщению об ошибке "Требуется значение...". Скорее всего, валидатор окажется в строке 186 настройки $values как массив, содержащий пустую строку.

Я думаю, что если вы хотите получить ваше собственное сообщение, чтобы установить required => false а также 'allow_empty' => false для вашего валидатора. В вашем случае я думаю, что это не должно быть проблемой...

Другие вопросы по тегам