0

現在のプロジェクトでは、複雑なオブジェクト構造をフォームにマップする非常に快適な方法を提供するネストされたZend\Form\FieldsetZend\Form\Collectionsを使用しています。フォーム入力から完全なオブジェクト(保存する準備ができています)を取得します。問題の ZF2のコレクションでフィールドセットの要素を飾る方法は?

は:私が持っている(コードは下記参照)、これを2回使用する必要が Label「foo要素」と Element foo_elementを含む Fieldset FooFieldset:1.単一 Fieldsetとして、 2. Collection。フォームの最初の部分では、その要素を表示する必要があります。 2番目の場所では、ラベルを無効にしたい(または変更する)可能性があります。 (私はまた、後者の場合にはそれを別の方法をフォーマットしたいのですが、最も重要なことは、今のラベルです。)

コンテキストに応じZend\Form\Element\CollectionZend\Form\FieldsetZend\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

また、ビュースクリプトにCollectionElement Sにアクセスし(hereが示されているように)は、それらを操作することも可能です。しかし、私はこの解決策が本当に好きではありません。それ以来、Fieldsetは複数の場所で定義されています。また、Collection要素の数が可変であれば、さらに努力が必要です。

+0

'main_fieldset' =' BuzFieldset'ですか? – AlexP

+0

いいえ、 'Bar'と' Buz'は両方とも 'MainFieldset'のSub-Fieldsetです。申し訳ありません、それはタイプミスでした。修正されたコードを見てください。 – automatix

答えて

0

'foos'コレクションと 'bar'要素をそれぞれのフィールドセットで再利用する必要があるようですが、現在どのように作成されているかを維持しています。

IだろうBuzFieldset::initのうち、それ自身の工場(工場内の要素とそのすべてのオプションを作成)に

  • 移動コレクション要素foo

  • これをフォーム要素マネージャーと新規サービスとして登録します。FooCollectionとしてください。この要素は再利用可能になり、フォーム要素マネージャーから$fem->get('FooCollection')と呼び出すことができます。

  • $fieldset->add('type' => 'Zend\Form\Element\Collection')$fieldset->add('type' => 'FooCollection')と置き換えてBuzFieldsetに置き換えます。

  • foo_elementに対して、新しいサービス名FooElementを繰り返します。

  • FooCollectionAndFooElementFieldsetFactoryという新しいフィールドセットファクトリを作成する必要があります。このファクトリは、FooCollectionFooElementの両方が添付された新しいフィールドセットを返します。あなたがFooCollectionAndFooElementFieldsetFactoryまたは既存のbarまたはbazフィールドセットを添付する必要がある場合main_fieldset工場

  • が決めます。

+0

ありがとうございました!しかし、それは少し複雑すぎるようです。私は、現在のところ、この問題に対するZendの解決策はないと考えています。しかし、私はそれを回避する必要がある場合、私はこの方法を使用します:1. 'FooForCollectionFieldsetFactory'を作成します。 2.そこに 'FooFieldset'を操作します。 3. 'My \ Form \ Fieldset \ FooForCollection '=>' My \ Form \ Fieldset \ Factory \ FooForCollectionFieldsetFactory''を' module.config.php'の 'form_elements.factories'に追加します。 4. 'Collection'の' target_element.type'を 'My \ Form \ Fieldset \ FooForCollection''に設定します。 – automatix

関連する問題