Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2表单:自定义元素顺序_Php_Forms_Zend Framework2 - Fatal编程技术网

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

Php ZF2表单:自定义元素顺序,php,forms,zend-framework2,Php,Forms,Zend Framework2,我正在为登录用户创建一个表单来更改其密码,因此我创建了一个现有密码重置表单的子类。除了现有密码的附加字段外,表单将完全相同。到目前为止,它是有效的,除了我无法找到一种方法来手动设置新字段的顺序;我唯一能看到的地方就是表格的末尾。似乎ZF2要求您按照希望呈现元素的顺序add()形成元素。我会这样做,除了子类窗体的构造函数必须在父窗体的构造函数之后才能添加新字段,此时父窗体已经添加了它的字段 我已经尝试设置新字段的属性顺序,但没有成功;我尝试了几种不同的组合(经过大量搜索,我在任何地方都找不到该功能

我正在为登录用户创建一个表单来更改其密码,因此我创建了一个现有密码重置表单的子类。除了现有密码的附加字段外,表单将完全相同。到目前为止,它是有效的,除了我无法找到一种方法来手动设置新字段的顺序;我唯一能看到的地方就是表格的末尾。似乎ZF2要求您按照希望呈现元素的顺序
add()
形成元素。我会这样做,除了子类窗体的构造函数必须在父窗体的构造函数之后才能添加新字段,此时父窗体已经添加了它的字段

我已经尝试设置新字段的属性
顺序
,但没有成功;我尝试了几种不同的组合(经过大量搜索,我在任何地方都找不到该功能的文档)

子类构造函数片段:

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',
            ...
父构造函数片段:

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
的第二个数组,您必须在该数组中添加
优先级
键/值对

你的构造函数应该看起来像这样

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的回答很有帮助,但我认为最好能准确地指出这一点:

在视图中,我们有很多选项来显示我们的表单:

  • 循环
    $form->getIterator()
  • 循环
    $form->getElements()
等等

我必须说,我在我的所有项目中都大量使用了这种结构:

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

问题是:getElements不使用优先级,所以它只是按照元素实例化的时间顺序给出元素


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

谢谢,这就成功了!但我不得不把优先权换成更高的东西;我编辑了你的答案以反映这一点。如果你在文档的某个地方发现了这一点,请发布一个链接,如果你不介意的话:)我实际上是通过(震惊恐怖!)阅读代码找到的。
Form
类扩展了
Fieldset
类,forms
add()
方法调用其父方法。然后返回并检查方法,您会发现这些行->