Изменение ZF2 расширяет класс

Ответ на мой вопрос 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,

0

Решение

Решение, которое я могу придумать, — переписать часть автозагрузчика.

В функции автозагрузки вы добавляете дополнительную проверку, чтобы проверить, является ли запрошенный класс \Zend\Form\View\Helper\FormInputи, если это так, вы загружаете свой пользовательский FormInput.

В своем собственном FormInput вы не расширяете Zend FormInput, но создаете его копию и изменяете части, которые необходимо изменить.

Если ZF2 не использует внедрение зависимостей для своих помощников форм, это единственный способ, о котором я могу думать (без изменения кода базовой библиотеки).

0

Другие решения

То, что я использовал, является частичным представлением. С помощью 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');
0

Я использую композитор для установки ZF2. Поскольку composer генерирует мои функции автозагрузки, я могу указать путь автозагрузки в файле composer.json:

"autoload": {
"psr-4": {
"Zend\\Form\\View\\Helper\\": "vendor/rpk/Rpk/Form/View/Helper"}
},

Это будет искать в моей папке продавца для класса, прежде чем искать в папке Zend.

Это не позволяет мне расширять FormInput, но вызывает вместо него мой FormInput. Вызов расширяется в моем FormInput, переводит приложение в бесконечный цикл, поэтому нам нужно скопировать содержимое FormInput в мой класс и внести в него изменения.

0
По вопросам рекламы [email protected]