我有一个Zend形式的多选元素,我正在创建这样的
$this->addElement('multiselect','somedates',array(
'filters'=>array('StringTrim'),
'required'=>true,
'label'=>'Dates',
'style' => 'width:14em',
'size'=>'4',
'RegisterInArrayValidator' => false, //otherwise it gives an error
));
然后我通过JavaScript将多选项添加到多选中进入多选(基本上是一个YUI日历,用户点击日期并进入多选作为选项)
如果我将所有必需的值提供给表单并且它通过了isValid测试,那么一切正常。但是,如果有错误,则每个其他元素都会被提交的任何内容重新填充但多选择会丢失所有选项并且必须由用户自己重新填充。多选似乎很顺利,因为这是我得到的转储$this->getRequest()->getQuery();
这就是我得到的["somedates"]=> array(2) { [0]=> string(10) "2010-09-09" [1]=> string(10) "2010-09-10" }
我只是想知道是否有其他人有相同的经验,知道这里出了什么问题,或者Zend Framework是重新填充多选的基础。
答案 0 :(得分:0)
问题是ZF希望用户选择您填充ZF MultiSelect
的其中一个选项。当您使用Javascript添加选项时,ZF不知道这现在是一个有效选项,因此验证将失败。要解决此问题,您需要删除InArray
验证程序
$this->getElement("somedates")->removeDecorator("InArray");
至于再次填充数组,一旦用户添加它们,您需要将它们保存在某处,因此如果表单失败,ZF可以再次将它们重新添加。您可以将这些附加到hidden
字段,在提交表单时,请检查此隐藏字段中的值,并将这些日期添加回MultiSelect
输入。
确保验证隐藏字段的输入,不要认为确实包含正确的日期。
答案 1 :(得分:0)
您知道在调用
时填充表单 $form->isValid($this->getRequest()->getPost()/getQuery
但是除非您执行以下操作,否则您的多选不会被填充:
$form->getElement('somedates')
->addMultiOptions($datesToGetItRepopulated);
我相信你在Post参数中发送多选项的选项(也增加了)的表格没问题,对吗?
为了使addMultiOptions()有效,请记住您的数组应具有以下格式:
$datesToGetItRepopulated = array(
array('key'=>heresGoesWhatYouwantAsTheValueForYourOption,
'value'=>hereGoesWhatYouWantAsTextForYourOption),
array('key'=>balbla, 'value'=>blabla)
....
);
正如您所看到的,在调用addMultiOptions(...)方法之前,您将不得不从服务器处理您为“somedates”收到的信息,因此它代表这种数组。这样,Zend_Form_Element_MultiSelect将知道如何使用选项填充它。