Zend: проверка формы: значение не было найдено в ошибке haystack
У меня есть форма с двумя выборами. Основываясь на значении первого выбора, он обновляет значения второго выбора с помощью AJAX. Это делает форму недействительной. Итак, я сделал следующее изменение:
$form=$this->getAddTaskForm(); //the form
if(!$form->isValid($_POST)) {
$values=$form->getValues();
//get the options and put them in $options
$assignMilestone=$form->getElement('assignedMilestone');
$assignMilestone->addMultiOptions($options);
}
if($form->isValid($_POST)) {
//save in the database
}else {
//redisplay the form
}
В принципе, я проверяю, действительно ли это, и нет, если пользователь изменил значение первого выбора. Я получаю параметры, которые заполняют второй выбор и заполняют форму. Затем я пытаюсь проверить его снова. Однако это не сработает. Кто-нибудь может объяснить, почему? То же "значение не было найдено в стоге сена".
Ответы
Ответ 1
Вы можете попробовать деактивировать валидатор:
в вашем Form.php
$field = $this->createElement('select', 'fieldname');
$field->setLabel('Second SELECT');
$field->setRegisterInArrayValidator(false);
$this->addElement($field);
Третья строка деактивирует валидатор, и она должна работать.
Ответ 2
Вы также можете отключить валидатор InArray, используя параметр "disable_inarray_validator" = > true:
Например:
$this->add( array(
'name' => 'progressStatus',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'disable_inarray_validator' => true,
),
));
Ответ 3
Дополнительно вы должны добавить свой собственный InArray Validator, чтобы защитить ваш db и т.д.
В Zend Framework 1 это выглядит так:
$this->addElement('select', $name, array(
'required' => true,
'label' => 'Choose sth:',
'filters' => array('StringTrim', 'StripTags'),
'multiOptions' => $nestedArrayOptions,
'validators' => array(
array(
'InArray', true, array(
'haystack' => $flatArrayOptionsKeys,
'messages' => array(
Zend_Validate_InArray::NOT_IN_ARRAY => "Value not found"
)
)
)
)
));
Где $nestedArrayOptions - это multiOptions, а $flatArrayOptionsKeys содержит все ключи.
Ответ 4
Вы также можете добавить параметры для выбора элемента перед проверкой проверки формы. Таким образом, вы застрахованы, значение выбора находится в диапазоне.