Я создаю форму для зарегистрированного пользователя, чтобы изменить свой пароль, поэтому я создал подкласс существующей формы сброса пароля, который у меня есть. Формы будут идентичны, за исключением дополнительного поля для существующего пароля. До сих пор он работал, но я не могу понять, как вручную установить порядок в новом поле; единственное место, которое я получил, это конец формы. Кажется, что 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()
), чтобы вернуть этот приоритет.