Как установить тип элемента в дочернем классе Fieldset в Zend Framework 2?
У меня два очень похожих Fieldset
s 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);
}
}