在我当前的项目中,我使用嵌套Zend\Form\Fieldset
的 s 和Zend\Form\Collection
s,它们提供了一种非常舒适的方式来将复杂的对象结构映射到表单,以便从表单输入中获取完整的对象(准备保存)。
问题:我有一个Fieldset
FooFieldset
包含Element
foo_element
一个Label
“foo元素”(代码见下文)并且需要使用它两次:1。作为一个单一的Fieldset
;2. 在一个Collection
。首先,我希望显示它的元素;其次,我想禁用标签(或者可能更改它们)。(我也想在第二种情况下用另一种方式格式化,但现在最重要的是标签。)
如何根据上下文装饰Zend\Form\Element
aZend\Form\Fieldset
中的s?Zend\Form\Element\Collection
代码
class FooFieldset extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
$this->add([
'type' => 'text',
'name' => foo_element',
'options' => ['label' => _('foo element')]
]);
}
public function getInputFilterSpecification() { ... }
}
class BarFieldset extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
$this->add([
'name' => 'foo',
'type' => 'My\Form\Fieldset\Foo',
'options' => []
]);
}
public function getInputFilterSpecification() { ... }
}
class BuzFieldset extends Fieldset implements InputFilterProviderInterface
{
$this->add(
[
'name' => 'foos',
'type' => 'Zend\Form\Element\Collection',
'options' => [
'label' => _('multiple foos'),
'count' => 5,
'should_create_template' => true,
'template_placeholder' => '__placeholder__',
'allow_add' => true,
'target_element' => [
'type' => 'Order\Form\Fieldset\Foo',
],
'label_attributes' => [
'class' => 'col-md-12'
]
]
]);
public function getInputFilterSpecification() { ... }
}
echo $this->formRow($myForm->get('main_fieldset')->get('bar')->get('foo')->get('foo_element');
echo $this->formRow($myForm->get('main_fieldset')->get('buz')->get('foos');
解决方法 1
可以使用另一个,例如(sometnig like )Fieldset
的子类并在那里调整(和其他设置)。FooFieldst
FooFieldsetForUsingInCollection extends FooFieldst
Label
解决方法 2
也可以访问视图脚本中Collection
的Element
s 并在那里操作它们(如这里所示)。但我真的不喜欢这个解决方案,因为那时Fieldset
它在多个地方定义。如果Collection
元素的数量是可变的,它还需要进一步的努力。