2012-04-17 12 views
0

要素をフォームに追加した後、1つのチェックボックスの前に送信ボタンが表示されるように、要素を奇妙な順序でレンダリングします。 速いを確認するためのヒントをご存知でしょうか。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

+0

Nope。チェックされたフォーム、コントローラ、ビューコード、 'setOrder'には一致しません – bububaba

+0

ZS/Eclipseを使用していますか?私があなただったら私はフォームを実行し(いくつかのブレークポイントで)、デバッグパースペクティブモードで何が起きているか確認します。これは通常、コードがどのように実行されているかを確認するための良い(そして速い)方法です。 – Liyali

答えて

1

私はこのコードを使用して、問題を再現してみました: - 私はあなたが期待しているものである。この出力(デコレータを削除)

<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"> 

を与えた

$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="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=""> 

を与えた$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(); 

の要素の順序を設定することによってでした。ですから、要素の順序を$otherFormに設定する必要があると私には思われます。

+1

あなたの努力に感謝します! '$ otherForm'のどこかで指図を指定しなければならないというあなたの結論は、私が借用した要素を取り除くと注文が適切であるという私の発見と一致しています。私のハックな解決策は、個々の要素に対して 'setOrder()'を行うことです( 'addElements($ otherForm-> getElements())'をダンプして 'foreach()'と一緒に行かなければなりません)。そして、なぜハッキーな解決策と一緒に行くのですか?なぜなら私の人生は 'setOrder()'呼び出しや 'order '=> X'プロパティを見つけることができなかったからです。実際に私の開発マシンの前に座っていなくても可能な限り最高のようにあなたの答えを受け入れています;) – bububaba

関連する問題