在我目前的项目中,我使用嵌套的Zend\Form\Fieldset
和Zend\Form\Collection
s,它提供了一种非常舒适的方式来将复杂的对象结构映射到表单,以获得完整的对象(从表格输入中准备好保存。
问题:我的Fieldset
FooFieldset
包含Element
foo_element
Label
" foo元素" (代码见下文)并且需要使用两次:1。作为单个Fieldset
; 2.在Collection
中。在表格的第一个位置,我想要显示它的元素;在第二个地方我想禁用标签(或者可能更改它们)。 (我也想在第二种情况下用另一种方式格式化,但现在最重要的是标签。)
如何根据上下文修饰Zend\Form\Element
中Zend\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
元素的数量是可变的,那么还需要进一步的努力。
答案 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
的新字段集工厂,此工厂将返回一个附加了FooCollection
和FooElement
的新字段集。
在main_fieldset
的工厂中,决定是否需要附加FooCollectionAndFooElementFieldsetFactory
或现有的bar
或baz
字段集。< / p>