In meinem aktuellen Projekt verwende ich verschachtelte Zend\Form\Fieldset
s und Zend\Form\Collection
s, 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 Fieldset
FooFieldset
ein Element
foo_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.
Ist 'main_fieldset' =' BuzFieldset'? – AlexP
Nein, 'Bar' und' Buz' sind beide Sub-'Fieldsets' des 'MainFieldsets'. Entschuldigung, es war ein Tippfehler. Bitte beachten Sie den korrigierten Code. – automatix