Как установить тип элемента в дочернем классе Fieldset в Zend Framework 2?

У меня два очень похожих Fieldsets MyFooFieldset а также MyBarFieldset, Чтобы избежать дублирования кода, я создал AbstractMyFieldset, переместил весь код туда, и хочу обработать различия в init() методы конкретных классов:

AbstractMyFooFieldset

namespace My\Form\Fieldset;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
abstract class AbstractMyFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function init()
    {
        $this->add(
            [
                'type' => 'multi_checkbox',
                'name' => 'my_field',
                'options' => [
                    'label_attributes' => [
                        'class' => '...'
                    ],
                    'value_options' => $this->getValueOptions()
                ]
            ]);
    }
    public function getInputFilterSpecification()
    {
        return [...];
    }
    protected function getValueOptions()
    {
        ...
        return $valueOptions;
    }
}

MyFooServerFieldset

namespace My\Form\Fieldset;
use Zend\Form\Fieldset;
class MyFooServerFieldset extends AbstractMyFieldset
{
    public function init()
    {
        parent::init();
        $this->get('my_field')->setType('radio'); // There is not method Element#setType(...)! How to do this?
        $this->get('my_field')->setAttribute('required', 'required'); // But this works.
    }
}

Я хочу установитьtypeи некоторые другие конфигурации для элемента, напримерtypeиrequiredприписывать. Настройка атрибутов, кажется, в порядке, по крайней мере, я могу установитьrequiredприписывать. Но я не могу установить тип - Element#setType(...) не там.

Как установить typeизZend\Form\Element после того, как это былоaddред?

1 ответ

Решение

Нет никакого способа установить тип элемента, поскольку каждый элемент имеет свой собственный тип и класс элемента, определенный. В вашем AbstractMyFieldsetсм. ключ "Тип" в вашем init(), Вы говорите форму, чтобы добавить MultiCheckbox элемент класса и хотите изменить класс на другой. Поэтому вам нужно либо удалить значение по умолчанию и скопировать его атрибуты и параметры во вновь добавленный элемент Zend Form.

Другой вариант - использовать базу Zend\Form\Element Класс вы можете перезаписать атрибуты и установить тип атрибута. ->setAttribute('type', 'my_type') но вы упускаете все преимущества стандартных классов форм Zend2. Особенно по умолчанию InArray валидатор для Zend\Form\Element\Radio или Zend\Form\Element\MultiCheckbox,

Или вы должны просто подумать о создании abstractFieldSet для обоих наборов полей и определить, как они получают свои значения и используют их повторно. Подобно:

abstract class AbstractFieldSet extends Fieldset {
    public function addMyField($isRadio = false)
    {
        $this->add([
            'type' => $isRadio ? 'radio' : 'multi_checkbox',
            'name' => 'my_field',
            'options' => [
                'value_options' => $this->getValueOptions()
            ]
        ]);
    }

    protected function getValueOptions()
    {
        // ..
        return $valueOptions
    }
}

class fieldSet1 extends AbstractFieldSet {
    public function init()
    {
        $this->addMyField(false);
    }
}

class fieldSet2 extends AbstractFieldSet {
    public function init()
    {
        $this->addMyField(true);
    }
}
Другие вопросы по тегам