2014-09-12 2 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

+1

Я на самом деле нашел это (ужасный ужас!), Читая код. Класс 'Form' расширяет класс' Fieldset' и метод 'add()' формы вызывает свой родительский метод.После этого и проверки метода вы найдете эти строки -> https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Fieldset.php#L187-L189 – Crisp

0

У меня есть encouter этот вопрос сегодня, ответ Crisp помог, но я думаю, что было бы неплохо, чтобы уточнить этот:

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

  • <?= $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()), чтобы вернуть этот флаг.

Смежные вопросы