0

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

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

如何根据上下文装饰Zend\Form\ElementaZend\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的子类并在那里调整(和其他设置)。FooFieldstFooFieldsetForUsingInCollection extends FooFieldstLabel

解决方法 2

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

4

1 回答 1

0

似乎您需要在它们自己的字段集中一起重用“foos”集合和“bar”元素,同时保持它当前的创建方式。

我会

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

  • 将其注册为表单元素管理器和新服务,让我们调用它FooCollection。这个元素现在是可重用的,并且可以从表单元素管理器中调用为$fem->get('FooCollection').

  • 将删除替换$fieldset->add('type' => 'Zend\Form\Element\Collection')$fieldset->add('type' => 'FooCollection')in BuzFieldset

  • foo_element使用新的服务名称重复FooElement.

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

  • 工厂main_fieldset决定是否需要附加FooCollectionAndFooElementFieldsetFactory或现有barbaz字段集。

于 2016-04-23T11:50:53.347 回答