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();

Спасибо!


person David    schedule 14.01.2016    source источник
comment
Я только что попытался запустить ваш код (удалив вызов метода setAttribute, который вызывал 500), и я вижу правильное сообщение об ошибке...   -  person marcosh    schedule 14.01.2016
comment
В самом деле?! Очаровательный. Я только что вернулся сюда, чтобы добавить, что я использую ZF 2.5.1. А вы? Кстати, я обновлю код, чтобы исправить -›setAttribute(), который я хотел вызвать в $form, а не в $view   -  person David    schedule 14.01.2016
comment
Я тоже использую версию 2.5.1... очень странно...   -  person marcosh    schedule 15.01.2016


Ответы (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 для своего валидатора. В вашем случае, я думаю, это не должно быть проблемой...

person Wilt    schedule 15.01.2016
comment
Что ж, установка required => false и allow_empty => false приводит к тому, что ввод проходит проверку, как и следовало ожидать, но это не так. Я постараюсь выяснить, что вы говорите о ExplodeValidator. Спасибо. - person David; 19.01.2016
comment
так что это не так @David Почему это не так? Я не понимаю проблемы. Он по-прежнему будет проверять и не будет разрешать пустые массивы для вашего списка множественного выбора... - person Wilt; 20.01.2016
comment
Нет, я говорю о переопределении сообщения об ошибке валидатора NotEmpty по умолчанию моим собственным - это то, что я не смог сделать (кроме грубых хаков на уровне представления). - person David; 20.01.2016