ZF2表单:自定义元素的顺序

时间:2014-09-12 15:37:06

标签: php forms zend-framework2

我正在为登录用户创建一个表单以更改其密码,因此我创建了一个现有密码重置表单的子类。除了现有密码的附加字段外,表单将完全相同。它到目前为止工作,除了我无法想出一种方法来手动设置新字段的顺序;我得到它的唯一地方是在表格的最后。似乎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',
            ...

2 个答案:

答案 0 :(得分:6)

您正在寻找影响元素顺序的键被命名为priority。

表单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
        ));
    }
}

答案 1 :(得分:0)

我今天已经解决了这个问题,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不使用优先级,因此它只是按照实例化的顺序给出元素。

在视图中,我们必须使用迭代方法($form->getIterator())来获取此标志优先级。