2010-09-27 49 views
0

我有我創造這樣Zend的形式重新填充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進入多選(Zend的形式多選元素基本上是一個YUI日曆,用戶點擊一個日期並作爲一個選項進入多選)

一切工作正常,如果我給所有需要的值的形式,它通過了isValid測試但是,如果有一個錯誤,其他所有元素都會被重新填充,但是多選則會丟失所有的選項並且必須是由用戶自己重新填充。多選擇似乎是想罰款,因爲這是我所得到的,如果我VAR轉儲$this->getRequest()->getQuery(); 這就是我得到["somedates"]=> array(2) { [0]=> string(10) "2010-09-09" [1]=> string(10) "2010-09-10" }

我只是想知道如果任何人有同樣的經驗,知道是怎麼回事錯在這裏或如果Zend框架能夠重新填充多選。

+0

有人回答,並刪除了答案,但我能夠在平均時間讀它,我需要建立一個新的多選表單元素像以前一樣只是之前的驗證,然後addMultiOptions它通過傳遞關聯數組。 – 2010-09-27 13:11:38

回答

0

問題是ZF希望用戶選擇您填充ZF MultiSelect的選項之一。當您使用Javascript添加選項時,ZF不知道這是一個有效的選項,因此驗證將失敗。爲了解決這個問題,你需要刪除InArray驗證

$this->getElement("somedates")->removeDecorator("InArray"); 

至於再填充數組,你需要一旦用戶增加了他們,所以如果表單未能ZF可以重新添加他們回到地方保存這些。您可以將這些添加到hidden字段,當提交表單時,請檢查此隱藏字段的值並將這些日期添加回MultiSelect輸入。

請確保您驗證來自隱藏字段的輸入,不要認爲它包含正確的日期。

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將知道如何用選項填充它。