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