Я создал новый класс элемента формы для специальной сложной цели (поле ввода текста с дополнительной кнопкой для открытия всплывающего окна «мастер поиска»).
Чтобы правильно отобразить этот элемент, я также создал помощник вида формы. Все работает и пока нормально.
Однако, если я попытаюсь отобразить форму с помощью помощника представления FormCollection, элемент отобразится как базовый элемент ввода. Это связано с тем, что вспомогательная функция представления FormElement, на которую опирается вспомогательная функция FormCollection, использует жестко закодированную последовательность предложений if для сопоставления типа элемента с конкретной вспомогательной функцией представления формы. Он не может сопоставить класс моего элемента и поэтому возвращается к FormInput
.
т.е. (взято из Zend/Form/View/Helper/FormElement.php, строки 41-49):
if ($element instanceof Element\Button) {
$helper = $renderer->plugin('form_button');
return $helper($element);
}
if ($element instanceof Element\Captcha) {
$helper = $renderer->plugin('form_captcha');
return $helper($element);
}
...
$helper = $renderer->plugin('form_input');
return $helper($element);
и так далее.
Я немного застрял здесь, потому что эта архитектура на самом деле не способствует расширяемости.
Единственное решение, которое пришло мне в голову (кроме рендеринга формы вручную), — это расширить вспомогательный класс представления FormElement и, таким образом, создать собственный вспомогательный класс представления CustomFormElement. Однако из-за его сложности я поместил пользовательский элемент в собственный модуль. Поэтому мне пришлось бы динамически писать этот помощник CustomFormElement, чтобы добавлять пользовательские элементы из любого модуля. Я не думаю, что это рекомендуемая процедура.
Есть ли другое решение или, может быть, даже мой полный подход не рекомендуется? Заранее спасибо!