мой 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();
Спасибо!
Это, вероятно, связано с тем, что установка 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
для вашего валидатора. В вашем случае я думаю, что это не должно быть проблемой …
Других решений пока нет …