2014-09-12 32 views
3

我正在爲登錄用戶創建一個表單來更改其密碼,所以我創建了一個現有密碼重置表單的子類,這個表單可用。除了現有密碼的附加字段之外,這些表單將是相同的。目前爲止,除了我無法找到手動設置新字段順序的方式外,我得到它的唯一地方是在表格的末尾。看起來,ZF2需要你按照你希望渲染的順序來創建表單元素add()。我會這樣做,除了子類窗體的構造函數必須在父窗體的構造函數添加新字段之前,父窗體已經添加了它的字段。ZF2窗體:自定義元素的順序

我已經嘗試設置屬性order我的新領域,但它沒有工作;我嘗試了幾種不同的組合(經過大量搜索後,我無法在任何地方找到此功能的文檔)。

子類構造函數的代碼片段:

class ChangePassword extends ResetPassword implements InputFilterProviderInterface { 

public function __construct() { 
    parent::__construct(); 

    $this->add(array(
     'type' => 'Zend\Form\Element\Password', 
     'name' => 'existingPassword', 
     'order' => 0, 
     'options' => array(
      'label' => 'Existing Password', 
      'order' => 0, 
     ), 
     'attributes' => array(
      'required' => 'required', 
      'order' => 0, 
     ) 
    )); 
} 

父類的構造片段:

class ResetPassword extends Form implements InputFilterProviderInterface { 

    public function __construct() { 
     parent::__construct('reset-password'); 

     $this->add(array(
      'type' => 'Zend\Form\Element\Password', 
      'name' => 'password', 
      ... 

回答

6

你要找的關鍵的影響因素順序被命名爲優先。

表格add()方法接受包含$flags的第二個數組,並且在此數組中,您必須添加priority鍵/值對。

你的構造應該結束了尋找這樣的事情...

class ChangePassword extends ResetPassword implements InputFilterProviderInterface { 

    public function __construct() { 
     parent::__construct(); 

     $this->add(array(
      'type' => 'Zend\Form\Element\Password', 
      'name' => 'existingPassword', 
      'options' => array(
       'label' => 'Existing Password', 
      ), 
      'attributes' => array(
       'required' => 'required', 
      ) 
     ), // add flags array containing priority key/value 
     array(
      'priority' => 1000, // Increase value to move to top of form 
     )); 
    } 
} 
+0

謝謝,這是訣竅!我不得不將優先級改爲更高的優先級。我編輯了你的答案以反映這一點。如果你發現這在文檔的某個地方,請發佈一個鏈接,如果你不介意:) – AlexMA 2014-09-12 17:01:06

+1

我實際上是通過(驚嚇恐怖!)閱讀代碼找到它的。 Form類擴展了Fieldset類,而add()方法調用了它的父方法。之後,檢查方法,你會發現這些行 - > https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Fieldset.php#L187-L189 – Crisp 2014-09-12 17:20:22

0

我也遇到這種問題的今天,清脆的回答幫助,但我認爲這將是不錯的精確這樣的:

在鑑於我們有很多的選項,以顯示我們的表單:

  • <?= $this->form($form)?>
  • <?= $form->get('{element}') ?>
  • 環比$form->getIterator()
  • 環比$form->getElements()

等等

我不得不說,我用了很多這種結構在我所有的項目:

<?php foreach ($form->get('fieldset')->getElements() as $elementName => $element): ?> 
    <?= $this->partial('partial/formElement', ['element' => $element])?> 
<?php endforeach ?> 

問題是:getElements不使用先驗ty,所以它只是按照實例化的順序給出元素。

在視圖中,我們必須使用迭代方法($form->getIterator())來取回該標誌優先級。