現在のプロジェクトでは、複雑なオブジェクト構造をフォームにマップする非常に快適な方法を提供するネストされたZend\Form\Fieldset
とZend\Form\Collection
sを使用しています。フォーム入力から完全なオブジェクト(保存する準備ができています)を取得します。問題の ZF2のコレクションでフィールドセットの要素を飾る方法は?
Label
「foo要素」と
Element
foo_element
を含む
Fieldset
FooFieldset
:1.単一
Fieldset
として、 2.
Collection
。フォームの最初の部分では、その要素を表示する必要があります。 2番目の場所では、ラベルを無効にしたい(または変更する)可能性があります。 (私はまた、後者の場合にはそれを別の方法をフォーマットしたいのですが、最も重要なことは、今のラベルです。)
コンテキストに応じZend\Form\Element\Collection
にZend\Form\Fieldset
のZend\Form\Element
Sを飾るためにどのように?
コード
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
例えば、別のFieldset
を使用することも可能ですFooFieldst
のサブクラス(FooFieldsetForUsingInCollection extends FooFieldst
のようなもの)を入力し、そこでLabel
(およびその他の設定)を調整します。
策2
また、ビュースクリプトにCollection
のElement
Sにアクセスし(hereが示されているように)は、それらを操作することも可能です。しかし、私はこの解決策が本当に好きではありません。それ以来、Fieldset
は複数の場所で定義されています。また、Collection
要素の数が可変であれば、さらに努力が必要です。
'main_fieldset' =' BuzFieldset'ですか? – AlexP
いいえ、 'Bar'と' Buz'は両方とも 'MainFieldset'のSub-Fieldsetです。申し訳ありません、それはタイプミスでした。修正されたコードを見てください。 – automatix