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


ZF2 Form: Customizing order of elements

我正在为登录用户创建一个表单来更改他们的密码,所以我创建了一个现有密码重置表单的子类。除了为现有密码添加一个额外字段外,表单将完全相同。到目前为止,它一直有效,只是我无法找到手动设置新字段顺序的方法;我唯一能让它出现的地方是在表单的末尾。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',
            ...

您要查找的影响元素顺序的键被命名为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
        ));
    }
}

我今天遇到了这个问题,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())来获取此标志优先级。