Подтвердить что ты не робот

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
            }  

В принципе, я проверяю, действительно ли это, и нет, если пользователь изменил значение первого выбора. Я получаю параметры, которые заполняют второй выбор и заполняют форму. Затем я пытаюсь проверить его снова. Однако это не сработает. Кто-нибудь может объяснить, почему? То же "значение не было найдено в стоге сена".

4b9b3361

Ответ 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

Вы также можете добавить параметры для выбора элемента перед проверкой проверки формы. Таким образом, вы застрахованы, значение выбора находится в диапазоне.