如何在ZF2中装饰集合中Fieldset的元素?

时间:2016-04-23 11:11:08

标签: zend-framework2 zend-form zend-form-element zend-form-collection zend-form-fieldset

在我目前的项目中,我使用嵌套的Zend\Form\FieldsetZend\Form\Collections,它提供了一种非常舒适的方式来将复杂的对象结构映射到表单,以获得完整的对象(从表格输入中准备好保存。

问题:我的Fieldset FooFieldset包含Element foo_element Label" foo元素" (代码见下文)并且需要使用两次:1。作为单个Fieldset; 2.在Collection中。在表格的第一个位置,我想要显示它的元素;在第二个地方我想禁用标签(或者可能更改它们)。 (我也想在第二种情况下用另一种方式格式化,但现在最重要的是标签。)

如何根据上下文修饰Zend\Form\ElementZend\Form\Fieldset的{​​{1}}个?

代码

Zend\Form\Element\Collection

解决方法1

可以使用其他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'); ,例如一个Fieldset的子类(像FooFieldst这样的某个部分)并在那里调整FooFieldsetForUsingInCollection extends FooFieldst(以及其他设置)。

解决方法2

也可以在视图脚本中访问Label的{​​{1}}并在那里操作它们(如here所示)。但我并不喜欢这个解决方案,因为Collection是在多个地方定义的。如果Element元素的数量是可变的,那么还需要进一步的努力。

1 个答案:

答案 0 :(得分:0)

您似乎需要在自己的字段集中重复使用'foos'集合和'bar'元素,同时保持其当前创建方式。

我会

  • 将集合元素foo移出BuzFieldset::init并进入其自己的工厂(在工厂中创建元素及其所有选项)。

  • 将表单元素管理器注册为新服务​​,并将其称为FooCollection。此元素现在可以重复使用,可以从表单元素管理器中调用$fem->get('FooCollection')

  • 将已移除的$fieldset->add('type' => 'Zend\Form\Element\Collection')替换为$fieldset->add('type' => 'FooCollection')中的BuzFieldset

  • 重复foo_element,新服务名称为FooElement

  • 然后,您需要创建一个名为FooCollectionAndFooElementFieldsetFactory的新字段集工厂,此工厂将返回一个附加了FooCollectionFooElement的新字段集。

  • main_fieldset工厂中,决定是否需要附加FooCollectionAndFooElementFieldsetFactory或现有的barbaz字段集。< / p>