2011-03-24 59 views
4

在Zend的形式,如果兩個元件具有相同的順序,然後將Zend的完全忽略第二個元件(而不是第一顯示下它)。以下面的代碼爲例。注意,CityZip Code元件具有如何設置的Zend表單元素的順序和避免重複

$address = new Zend_Form_Element_Textarea('address'); 
    $address->setLabel('Address') 
      ->setAttrib('cols', 20) 
      ->setAttrib('rows', 2) 
      ->setOrder(3) 
      ; 

    $city = new Zend_Form_Element_Text('city'); 
    $city->setLabel('City') 
     ->setOrder(4) 
      ; 

    $postal = new Zend_Form_Element_Text('postal'); 
    $postal->setLabel('Zip Code') 
      ->setOrder(4); 

當這種形式呈現相同的順序,所述元件Zip Code是無處找到。

如果我想動態設置像一個按鈕元素,但告訴它的形式結束渲染,我將如何做到這一點,沒有碰到具有相同的順序兩種元素的問題?

public function addSubmitButton($label = "Submit", $order = null) 
{ 
    $form_name = $this->getName(); 

    // Convert Label to a lowercase no spaces handle 
    $handle = strtolower(str_replace(" ","_",$label)); 

    $submit = new Zend_Form_Element_Submit($handle); 
    $submit->setLabel($label) 
      ->setAttrib('id', $form_name . "_" . $handle) 
      ; 

    ///////// Set the button order to be at the end of the form ///////// 
    $submit->setOrder(??????); 


    $this->addElement($submit); 

} 
+0

爲什麼這些元素具有相同的順序?如果您將郵政編碼元素訂購爲5,會發生什麼情況? – markus 2011-03-24 21:13:11

+0

如果郵政編碼有「5」,它工作得很好......我想說明的是,當兩個元素具有相同的順序,第二個完全被忽略。這提出了我必須知道順序的問題,所以我不會意外覆蓋以前設置的元素。 – 2011-03-24 21:14:44

+0

我明白了,但是我在使用Zend Form時從未設置過順序,並且從來沒有遇到過這樣的問題。你不能也得到訂單,看看是否已經設置了某個訂單號嗎? – markus 2011-03-24 21:49:18

回答

6

如果你真的需要使用setOrder()方法的順序,我會使用訂單號10,20,30,40 ......這種方式很容易在已設置的元素之間添加元素。另外,爲了避免使用兩次訂單號,您可以使用一個數組,您可以在其中存儲從1到X的所有數字。每當您設置訂單號時,都可以通過名爲getOrderNumberFromArray()的方法進行設置,它返回數組中仍然可用的下一個更高或更低的數字,並取消設置該數組元素。

或者,甚至更好,您可以在新元素之前的元素上執行getOrder(),然後通過X遞增此訂單號,然後遍歷現有表單元素並檢查訂單號尚不存在。

或者你可以只使用getOrder()你想之前和新元素後,展現元素,並確保你沒有使用相同的訂單號碼,新的元素。

0

試試這個代碼:

$elements = array(); 
$elements[] = new Zend_Form_Element_Textarea('address'); 
...... 
$elements[] = new Zend_Form_Element_Text('city'); 
....... 
$elements[] = new Zend_Form_Element_Submit($handle); 
..... 
$this->addElements($elements); 

所有你需要做的就是添加他們想要他們出示

+0

但是,由於我構造表單的方式,按照我想要顯示的順序添加它們並不合理。此外,這完全否定了「setOrder」方法,並且違背了可以操作的對象的想法。 (還是)感謝你的建議。 – 2011-03-24 21:30:43

0

什麼,我會做的是 - 使用一個臨時陣列 - 在保持元素名稱中所需的順序(不介意鍵)。然後使用的foreach這樣的:

foreach(array_values($tempArray) as $order => $name) { 
    $form->$name->setOrder($order+1); 
} 

注array_values - 它會返回值編號的陣列;)不知道是否setOrder(0)的作品 - 這就是爲什麼有+1

3

對不起,遲到這個問題。我所做的是延伸Zend_Form和覆蓋_sort()方法,如下所示:

/** 
* Sort items according to their order 
* 
* @return void 
*/ 
protected function _sort() 
{ 
    if ($this->_orderUpdated) { 
     $items = array(); 
     $index = 0; 
     foreach ($this->_order as $key => $order) { 
      if (null === $order) { 
       if (null === ($order = $this->{$key}->getOrder())) { 
        while (array_search($index, $this->_order, true)) { 
         ++$index; 
        } 
        $items[$index][]= $key; 
        ++$index; 
       } else { 
        $items[$order][]= $key; 
       } 
      } else { 
       $items[$order][]= $key; 
      } 
     } 
     ksort($items); 
     $index = 0; 
     foreach($items as $i=>$item){ 
      foreach($item as $subItem){ 
       $newItems[$index++]=$subItem; 
      } 
     } 
     $items = array_flip($newItems); 
     asort($items); 
     $this->_order = $items; 
     $this->_orderUpdated = false; 
    } 
} 

這通過將基於關閉它們的索引的陣列中的項目,然後做一個深度優先遍歷不同於原始排序方法壓扁陣列。