0

In meinem aktuellen Projekt verwende ich verschachtelte Zend\Form\Fieldset s und Zend\Form\Collections, die eine äußerst komfortable Möglichkeit bieten, komplexe Objektstrukturen dem Formular zuzuordnen, um ein vollständiges Objekt (bereit zum Speichern) aus der Formulareingabe zu erhalten.Wie dekorieren Elemente eines Fieldsets in einer Sammlung in ZF2?

Zum Problem: Ich habe ein FieldsetFooFieldset ein Elementfoo_element mit einem Label „foo Elemente“ (Code siehe unten) und muß mit diesem zweimal verwenden: 1. als eine einzigen Fieldset; 2. in einem Collection. An erster Stelle im Formular möchte ich, dass seine Elemente angezeigt werden; an der zweiten Stelle möchte ich die Etiketten deaktivieren (oder vielleicht ändern). (Ich will es auch eine anderen Weg im zweiten Fall zu formatieren, aber das Wichtigste ist jetzt das Etikett.)

Wie Zend\Form\Element s ein Zend\Form\Fieldset in einem Zend\Form\Element\Collection je nach Kontext dekorieren?


-Code

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'); 

Problemumgehung 1

wäre es möglich, eine andere Fieldset zu verwenden, z.B. eine Unterklasse von FooFieldst (etwas wie FooFieldsetForUsingInCollection extends FooFieldst) und die Label (und andere Einstellungen) dort anpassen.

Problemumgehung 2

Es wäre auch möglich, die Collection ‚s Element s im View Skript zuzugreifen und sie dort zu manipulieren (wie here gezeigt). Aber ich mag diese Lösung nicht wirklich, da dann die Fieldset an mehreren Stellen definiert ist. Und es bedarf auch weiterer Anstrengungen, wenn die Anzahl der Collection Elemente variabel ist.

+0

Ist 'main_fieldset' =' BuzFieldset'? – AlexP

+0

Nein, 'Bar' und' Buz' sind beide Sub-'Fieldsets' des 'MainFieldsets'. Entschuldigung, es war ein Tippfehler. Bitte beachten Sie den korrigierten Code. – automatix

Antwort

0

Es scheint, als ob Sie die 'foos' Sammlung und das 'bar' Element zusammen in ihrem eigenen fieldset wiederverwenden müssen, während Sie behalten, wie es gerade erstellt wird.

Ich würde

  • Bewegen Sie das Sammelelement foo aus den BuzFieldset::init und in seine eigene Fabrik (das Element erstellen und all seine Möglichkeiten in der Fabrik).

  • Registrieren Sie es mit dem Formularelement-Manager als und neuen Service, rufen Sie es FooCollection. Dieses Element ist jetzt wiederverwendbar und kann aus dem Formularelement-Manager als $fem->get('FooCollection') aufgerufen werden.

  • Ersetzen entfernt $fieldset->add('type' => 'Zend\Form\Element\Collection') mit $fieldset->add('type' => 'FooCollection') in BuzFieldset.

  • Wiederholen Sie dies für foo_element mit einem neuen Servicenamen FooElement.

  • Dann benötigen Sie eine neue Fieldset Fabrik FooCollectionAndFooElementFieldsetFactory diese Fabrik eine neue Fieldset kehrt genannt zu schaffen, mit sowohl der FooCollection und FooElement angebracht.

  • Im Fabrik von main_fieldset entscheiden, ob Sie FooCollectionAndFooElementFieldsetFactory oder die vorhandenen bar oder baz Fieldset anbringen müssen.

+0

Vielen Dank für Ihre Antwort! Allerdings scheint es ein bisschen zu kompliziert. Ich denke, derzeit gibt es keine Zend-Lösung für dieses Problem. Aber wenn ich es umgehen muss, würde ich folgendermaßen vorgehen: 1. Erstelle eine 'FooForCollectionFieldsetFactory'; 2. manipuliere dort das 'FooFieldset'; 3. füge '' My \ Form \ Fieldset \ FooForCollection '=>' Mein \ Formular \ Fieldset \ Factory \ FooForCollectionFieldsetFactory' zu den 'form_elements.factories' in' module.config.php' hinzu; 4. Setzen Sie den 'target_element.type' für die' Collection' auf '' My \ Form \ Fieldset \ FooForCollection''. – automatix