Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend form multiselect验证错误后重新填充_Php_Zend Framework - Fatal编程技术网

Php Zend form multiselect验证错误后重新填充

Php Zend form multiselect验证错误后重新填充,php,zend-framework,Php,Zend Framework,我有一个Zend form multiselect元素,我正在这样创建 $this->addElement('multiselect','somedates',array( 'filters'=>array('StringTrim'), 'required'=>true, 'label'=>'Dates', 'style' => 'width:14em', 'size'=>'4', 'RegisterInArra

我有一个Zend form multiselect元素,我正在这样创建

$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将一些multi-options动态添加到multi-select中,multi-select基本上是一个YUI日历,用户在其中单击日期,然后作为选项进入multi-select

如果我为表单提供了所有必需的值,并且表单通过了isValid测试,那么一切都正常。但是,如果出现错误,其他每个元素都会重新填充提交的内容,但是multi-select会丢失所有选项,并且必须由用户自己重新填充。Multi-select似乎进展顺利,因为这是我在var dump$this->getRequest->getQuery时得到的结果; 这就是我得到的[somedates]=>array2{[0]=>string10 2010-09-09[1]=>string10 2010-09-10}


我只是想知道是否有其他人也有同样的经验,知道这里出了什么问题,或者Zend框架是否能够重新填充multi-select。

问题是ZF希望用户选择您填充ZF multi-select的选项之一。当您使用Javascript添加选项时,ZF不知道这现在是一个有效选项,因此验证将失败。要解决此问题,您需要删除InArray验证程序

$this->getElement("somedates")->removeDecorator("InArray");
至于再次填充数组,一旦用户添加了它们,您需要将它们保存在某个地方,因此如果表单失败,ZF可以再次添加它们。提交表单时,您可以将这些日期附加到隐藏字段,检查此隐藏字段的值,并将这些日期添加回MultiSelect输入


确保验证隐藏字段中的输入,不要假设is包含正确的日期。

您知道在调用

 $form->isValid($this->getRequest()->getPost()/getQuery
但除非您执行以下操作,否则您的multi-select将无法填充:

$form->getElement('somedates')
     ->addMultiOptions($datesToGetItRepopulated);
我相信你对表单发送选项没有问题,在Post参数中也添加了multiselect的选项,对吗

要使addMultiOptions正常工作,请记住数组应具有以下格式:

$datesToGetItRepopulated = array(
      array('key'=>heresGoesWhatYouwantAsTheValueForYourOption, 
             'value'=>hereGoesWhatYouWantAsTextForYourOption),
      array('key'=>balbla, 'value'=>blabla)
          ....
);

如您所见,在调用addMultiOptions之前。。。方法,您将不得不从服务器处理您收到的“somedates”信息,以便它代表这种数组。这样,Zend_Form_Element_MultiSelect将知道如何使用选项填充它。

有人回答并删除了答案,但我能够同时读取它,我需要在验证之前创建一个新的multi-select Form元素,然后通过传递关联数组向其添加MultiOptions。