我有一个包含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
}
基本上,我检查它是否有效,如果用户更改了第一个选择的值,则不是。我得到填充第二个选择的选项,并用它们填充表单。然后我尝试再次验证它。但是这不起作用。任何人都可以解释为什么?存在相同的“在大海捞针中找不到的价值”。
答案 0 :(得分:31)
您可以尝试停用验证器:
在您的Form.php中
$field = $this->createElement('select', 'fieldname');
$field->setLabel('Second SELECT');
$field->setRegisterInArrayValidator(false);
$this->addElement($field);
第三行将停用验证器,它应该可以工作。
答案 1 :(得分:9)
您还可以使用'disable_inarray_validator'=>停用InArray验证器。真:
例如:
$this->add( array(
'name' => 'progressStatus',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'disable_inarray_validator' => true,
),
));
答案 2 :(得分: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包含所有键。
答案 3 :(得分:2)
在检查表单验证之前,您还可以添加选项以选择元素。通过这种方式,您可以确保选择值在范围内。