Ответ на мой вопрос ZF2 FormInput для отображения класса ошибок при сбое проверки это создать свой собственный помощник вида формы, переопределяя render
функция. Хотя это прекрасно работает для элементов, отображаемых с использованием forminput
, это не помогает на элементах, которые наследуются от forminput
, Например, FormCheckbox
наследуется от forminput
но не МОЙ forminput
:
<?php
namespace Zend\Form\View\Helper;
//...
class FormCheckbox extends FormInput {
//...
}
В этом случае мне нужно создать ДРУГОЙ помощник вида formcheckbox
исключительно продлить МОЙ forminput
, И снова для любых других помощников представления, которые я хочу включить (formdate
, formemail
, formpassword
, так далее).
Вместо того, чтобы создавать несколько помощников вида, возможно ли создать один помощник вида и сказать ZF2 использовать это во всех вызовах исходного помощника вида, когда он сделан помощником вида ZF2?
то есть \Zend\Form\View\Helper\FormCheckbox
будет продлен \RPK\Form\View\Helper\FormInput
, который бы продлил \Zend\Form\View\Helper\FormInput
,
Решение, которое я могу придумать, — переписать часть автозагрузчика.
В функции автозагрузки вы добавляете дополнительную проверку, чтобы проверить, является ли запрошенный класс \Zend\Form\View\Helper\FormInput
и, если это так, вы загружаете свой пользовательский FormInput.
В своем собственном FormInput вы не расширяете Zend FormInput, но создаете его копию и изменяете части, которые необходимо изменить.
Если ZF2 не использует внедрение зависимостей для своих помощников форм, это единственный способ, о котором я могу думать (без изменения кода базовой библиотеки).
То, что я использовал, является частичным представлением. С помощью partials вы можете определить свой собственный html для каждого элемента ввода, и у вас есть доступ ко всем атрибутам и сообщениям (например, сообщениям об ошибках) элемента input:
в вашем частичном phtml:
<?php
$options = $element->getOptions();
$t = $this->t();
$value = $element->getValue();
$messages = $element->getMessages();
$attr = $element->getAttributes();
Вы можете использовать частичное, как это:
$this->formRow($form->get('myelement'), null, null, 'mypartial');
Я использую композитор для установки ZF2. Поскольку composer генерирует мои функции автозагрузки, я могу указать путь автозагрузки в файле composer.json:
"autoload": {
"psr-4": {
"Zend\\Form\\View\\Helper\\": "vendor/rpk/Rpk/Form/View/Helper"}
},
Это будет искать в моей папке продавца для класса, прежде чем искать в папке Zend.
Это не позволяет мне расширять FormInput, но вызывает вместо него мой FormInput. Вызов расширяется в моем FormInput, переводит приложение в бесконечный цикл, поэтому нам нужно скопировать содержимое FormInput в мой класс и внести в него изменения.