Форма ZF2: порядок упорядочения элементов

Я создаю форму для зарегистрированного пользователя, чтобы изменить свой пароль, поэтому я создал подкласс существующей формы сброса пароля, который у меня есть. Формы будут идентичны, за исключением дополнительного поля для существующего пароля. До сих пор он работал, но я не могу понять, как вручную установить порядок в новом поле; единственное место, которое я получил, это конец формы. Кажется, что ZF2 требует, чтобы вы add() элементы формы в том порядке, в котором вы хотите их визуализировать. Я бы сделал это, за исключением того, что конструктор формы подкласса должен иметь конструктор родительской формы, прежде чем он сможет добавить новые поля, и в этот момент родительская форма уже добавила свои поля.

Я уже пытался установить 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', ... 

Ключ, который вы ищете, который влияет на порядок элементов, называется приоритетом.

Метод 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 )); } } 

Сегодня я столкнулся с этой проблемой, ответ Крисп помог, но я думаю, было бы неплохо уточнить это:

В представлении у нас есть много вариантов, чтобы показать нашу форму:

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

и т.д…

Должен сказать, что я использовал эту структуру во всех своих проектах:

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

Проблема в том, что getElements не использует приоритет, поэтому он просто дает элемент в порядке, когда он был создан.

В представлении мы должны использовать метод итерации ( $form->getIterator() ), чтобы вернуть этот приоритет.