15

我有一个有 2 个选择的表格。根据第一个选择的值,它使用 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
            }  

基本上,我检查它是否有效,如果用户更改了第一个选择的值,则不是。我得到填充第二个选择的选项并用它们填充表单。然后我尝试再次验证它。但是,这不起作用。任何人都可以解释为什么?存在相同的“在大海捞针中找不到值”。

4

4 回答 4

32

您可以尝试停用验证器:

在你的 Form.php

$field = $this->createElement('select', 'fieldname');
$field->setLabel('Second SELECT');
$field->setRegisterInArrayValidator(false);
$this->addElement($field);

第三行将停用验证器,它应该可以工作。

于 2012-06-28T12:37:25.977 回答
13

您还可以使用 'disable_inarray_validator' => true 禁用 InArray 验证器:

例如:

    $this->add( array(
        'name'     => 'progressStatus',
        'type'     => 'DoctrineModule\Form\Element\ObjectSelect',
        'options' => array(
            'disable_inarray_validator' => true,
        ),

    )); 
于 2014-11-07T19:09:04.310 回答
3

另外,您应该添加自己的 InArray Validator 以保护您的数据库等。

在 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 包含你所有的键。

于 2014-12-17T15:47:36.003 回答
2

您还可以在检查表单验证之前添加选项以选择元素。这样您就可以确保选择值在范围内。

于 2014-08-01T01:06:32.477 回答