2012-04-17 50 views
0

在向我的表單添加元素後,我按照奇怪的順序渲染它們,在一個複選框之前獲取提交按鈕。將欣賞提示在哪裏檢查快速修復。Zend_Form元素呈現錯誤順序

class SomeForm extends My_Form { 
    public function init() { 
     $this->addElements(); 
     //add a few elements (#1) 

     $this->addElements($otherForm->getElements()); 
     //borrow some elements from another form (#2) 

     if ($trueCondition=true) { 
      $this->addElements(); 
      //add one more element which will render at end of form (#3) 
     } 

     $this->addElements(); 
     //some more, including submit button (#4) 

     parent::init(); 
     //call My_Form to register custom decorator; culprit? 
    } 
} 

輸出:

<inputs from addElements() #1 /> 
<inputs from addElements() #2 /> 
<inputs from addElements() #4 /> <- 
<inputs from addElements() #3 /> <- mixed up order 

所有其他形式使用定製的裝飾呈現在他們的添加順序的元素。我沒有發佈裝飾器,因爲它很雜亂。希望這個錯誤在別處。

+0

元素應該根據何時將它們添加到表單來排序。也許你在某處使用'setOrder()'? – Liyali 2012-04-17 09:12:20

+0

沒有。檢查窗體,控制器和視圖代碼,不匹配'setOrder' – bububaba 2012-04-17 09:14:18

+0

您使用ZS/Eclipse嗎?如果我是你,我會運行表單(幾個斷點),並檢查在調試透視模式下發生了什麼。這通常是一種很好(快速)的方式來查看代碼的執行情況。 – Liyali 2012-04-17 09:21:56

回答

1

我嘗試使用此代碼來重現您的問題: -

$formA = new Zend_Form(); 
$formB = new Zend_Form(); 
$formA->addElement(new Zend_Form_Element_Text('formA_text1')); 
$formA->addElement(new Zend_Form_Element_Text('formA_text2')); 
$formB->addElement(new Zend_Form_Element_Text('formB_text1')); 
$formB->addElement(new Zend_Form_Element_Text('formB_text2')); 

$formA->addElements($formB->getElements()); 
$formA->addElement(new Zend_Form_Element_Text('formA_text3')); 
$formA->addElement(new Zend_Form_Element_Submit('submit')); 
echo $formA->render(); 

這給了我這個輸出(裝飾刪除)

<input type="text" name="formA_text1" id="formA_text1" value=""> 
<input type="text" name="formA_text2" id="formA_text2" value=""> 
<input type="text" name="formB_text1" id="formB_text1" value=""> 
<input type="text" name="formB_text2" id="formB_text2" value=""> 
<input type="text" name="formA_text3" id="formA_text3" value=""> 
<input type="submit" name="submit" id="submit" value="submit"> 

這是你期待什麼。重現你的問題的唯一途徑是通過設置元素的順序$formB

$formA = new Zend_Form(); 
$formB = new Zend_Form(); 
$formA->addElement(new Zend_Form_Element_Text('formA_text1')); 
$formA->addElement(new Zend_Form_Element_Text('formA_text2')); 
$formB->addElement(new Zend_Form_Element_Text('formB_text1')); 
$formB->addElement(new Zend_Form_Element_Text('formB_text2')); 
$formB->getElement('formB_text2')->setOrder(10); 
$formA->addElements($formB->getElements()); 
$formA->addElement(new Zend_Form_Element_Text('formA_text3')); 
$formA->addElement(new Zend_Form_Element_Submit('submit')); 
echo $formA->render(); 

這給了我這個輸出

<input type="text" name="formA_text1" id="formA_text1" value=""> 
<input type="text" name="formA_text2" id="formA_text2" value=""> 
<input type="text" name="formB_text1" id="formB_text1" value=""> 
<input type="text" name="formA_text3" id="formA_text3" value=""> 
<input type="submit" name="submit" id="submit" value="submit"> 
<input type="text" name="formB_text2" id="formB_text2" value=""> 

這是你做了什麼。所以,在我看來,你必須設置$otherForm中元素的順序。

+1

非常感謝您的努力!你的結論是,訂單必須在'$ otherForm'的某個地方指定,與我的發現一致,如果我刪除借來的元素,那麼順序是正確的。我的hacky解決方案是在每個元素上分別設置'setOrder()'(我必須轉儲'addElements($ otherForm-> getElements())'並使用'foreach()')。爲什麼要使用hacky解決方案?因爲我無法在我的生活中找到任何'setOrder()'調用或'order'=> X'屬性。我接受你的答案,因爲它似乎是最好的,沒有真正坐在我的開發機前;) – bububaba 2012-04-17 12:53:30