Как украсить элементы набора полей в коллекции в ZF2?

В моем текущем проекте я использую вложенный Zend\Form\Fieldsetс и Zend\Form\Collection s, которые обеспечивают чрезвычайно удобный способ сопоставления сложных структур объектов с формой, чтобы получить полный объект (готовый для сохранения) из формы ввода.

К проблеме: у меня есть FieldsetFooFieldset содержащий Elementfoo_element с Label "элемент foo" (см. код ниже) и нужно использовать это дважды: 1. как один Fieldset; 2. в Collection, На первом месте в форме я хочу, чтобы его элементы отображались; во-вторых, я хочу отключить метки (или, возможно, изменить их). (Я также хочу отформатировать его другим способом во втором случае, но сейчас важнее всего метка.)

Как украсить Zend\Form\Elementс Zend\Form\Fieldset в Zend\Form\Element\Collection в зависимости от контекста?


Код

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"s Elements в сценарии просмотра и манипулировать ими там (как здесь показано). Но мне не очень нравится это решение, с тех пор Fieldset определяется в нескольких местах. И это также потребует дальнейших усилий, если число Collection элементы являются переменными.

1 ответ

Похоже, вам нужно повторно использовать коллекцию 'foos' и элемент 'bar' вместе в их собственном наборе полей, сохраняя при этом, как он создается в данный момент.

я мог бы

  • Переместить элемент коллекции foo вне BuzFieldset::init и в свою собственную фабрику (создайте элемент и все его опции на фабрике).

  • Зарегистрируйте его в диспетчере элементов формы, как и новый сервис, давайте назовем его FooCollection, Этот элемент теперь можно использовать повторно, и его можно вызвать из диспетчера элементов формы как $fem->get('FooCollection'),

  • Заменить удалено $fieldset->add('type' => 'Zend\Form\Element\Collection') с $fieldset->add('type' => 'FooCollection') в BuzFieldset,

  • Повторите для foo_element с новым именем службы FooElement,

  • Затем вам нужно создать новую фабрику fieldset под названием FooCollectionAndFooElementFieldsetFactory этот завод вернет новый набор полей с обоими FooCollection а также FooElement прилагается.

  • На фабрике main_fieldset решить, если вам нужно приложить FooCollectionAndFooElementFieldsetFactory или существующий bar или же baz fieldsets.