Как украсить элементы набора полей в коллекции в ZF2?
В моем текущем проекте я использую вложенный Zend\Form\Fieldset
с и Zend\Form\Collection
s, которые обеспечивают чрезвычайно удобный способ сопоставления сложных структур объектов с формой, чтобы получить полный объект (готовый для сохранения) из формы ввода.
К проблеме: у меня есть Fieldset
FooFieldset
содержащий Element
foo_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 Element
s в сценарии просмотра и манипулировать ими там (как здесь показано). Но мне не очень нравится это решение, с тех пор 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.