ZF2 форма проверяет значение из выбора даже при отправке недопустимых значений
У меня есть форма в моем приложении ZF2 с элементом выбора. В ZF1 он автоматически добавляет валидатор, чтобы проверить, что пользователь не пытается публиковать в нем недопустимые значения.
Так что просто для удовольствия я решил посмотреть, что произойдет, если я использую Firebug, чтобы изменить значение одного из параметров, а затем отправить его. Результат: это прошло с летающими цветами. Излишне говорить, что это не хорошо.
Вот соответствующий код для опции выбора:
$this->add(array (
'name' => 'role',
'type' => 'Select',
'attributes' => array (
'id' => 'role'
),
'options' => array (
'label' => 'Role:',
'value_options' => $roleOptions,
'column-size' => 'sm-6',
'label_attributes' => array('class' => 'col-sm-2'),
)
));
(Примечание: $roleOptions передается в виде параметра в форму)
Вот соответствующая часть кода валидатора:
$inputFilter->add($factory->createInput(array (
'name' => 'role',
'filters' => array(),
'validators' => array(
$notEmpty
),
)));
(Очевидно, $notEmpty является экземпляром валидатора NotEmpty)
Что тут происходит? Разве ZF2 больше не добавляет валидатор, чтобы убедиться, что полученное значение является тем, которое изначально было частью списка опций? Нужно ли вручную добавлять валидатор, чтобы выбрать параметры сейчас?
РЕДАКТИРОВАТЬ: я проверил документацию, и он говорит, что элемент выбора автоматически добавляет в массив валидатор. Это должно работать, но это не так. Я даже пытался изменить значение на стороне сервера, с теми же результатами - валидатор не получает неверное значение.
И да, я проверяю, является ли форма действительной.
РЕДАКТИРОВАНИЕ № 2: Для ясности, вот код для формы в полном объеме
1 ответ
Я преодолел эту проблему, установив значение параметров выбора в числах:
В конструкторе формы:
// Gender field
$this->add
(
array
(
'type' => 'Zend\Form\Element\Select',
'name' => 'gender',
'attributes' => array
(
'id' => 'GenderField',
'class' => 'form-control',
),
'options' => array
(
'label' => 'Gender',
'empty_option' => 'Please choose...',
'value_options' => array
(
'1' => 'Female',
'2' => 'Male',
'3' => 'Other',
),
)
)
);
а затем в свой InputFilter я добавил валидатор Between к моему валидатору NotEmpty следующим образом:
'validators' => array
(
array(...NotEmpty Validator...),
array
(
'name' => 'Between',
'options' => array
(
'min' => 1,
'max' => 3,
'messages' => array
(...)
),
'break_chain_on_failure' => true,
),
)
Я также рекомендую использовать пустой параметр из-за всей проблемы 0|NULL|'':
'empty_option' => 'Please choose...',
Существует также InArray Validator, который так же полезен для непоследовательных модулей... как ID:
$validator = new Zend\Validator\InArray(array('haystack' => array('value1', 'value2',...'valueN')));
if ($validator->isValid('value')) {
// value found
} else {
// no value found
}