Я переношу унаследованное приложение Zend Framework 2 на Zend Framework 3 и столкнулся с небольшими трудностями при регистрации моих помощников пользовательских представлений форм. Помощники работали, когда приложение использовало версию 2, и в основном используются для добавления атрибутов тегов для обеспечения доступности. Например, это настраиваемый помощник FormText.php.
<?php
namespace Application\Form\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormInput;
class FormText extends FormInput
{
/**
* Attributes valid for the input tag type = "text"
*
* @var array
*/
protected $validTagAttributes = array(
'name' => true,
'autocomplete' => true,
'autofocus' => true,
'dirname' => true,
'disabled' => true,
'form' => true,
'list' => true,
'maxlength' => true,
'pattern' => true,
'placeholder' => true,
'readonly' => true,
'required' => true,
'size' => true,
'type' => true,
'value' => true,
'aria-hidden' => true,
'aria-invalid' => true,
'aria-describedby' => true,
'aria-label' => true,
);
/**
* Determine input type to use
*
* @param ElementInterface $element
* @return string
*/
protected function getType(ElementInterface $element)
{
return 'text';
}
}
В версии 2 моего приложения помощники были зарегистрированы в Module.php (не знаю, почему не в module.config.php ') с использованием следующего метода (для краткости показан только 1 помощник):
public function getViewHelperConfig()
{
return array(
'invokables' => array(
// Form helpers
'FormText' => 'Application\Form\View\Helper\FormText',
),
);
}
В версии приложения ZF3 я пытаюсь использовать следующий элемент массива в операторе возврата module.config.php:
'view_helpers' => [
'factories' => [
View\Helper\Cdn::class => View\Helper\CdnFactory::class,
Form\View\Helper\FormText::class => InvokableFactory::class,
],
'aliases' => [
'cdn' => View\Helper\Cdn::class,
'FormText' => Form\View\Helper\FormText::class,
],
],
Это не работает для помощника представления формы, хотя помощник 'cdn' регистрируется правильно и работает должным образом. Помощник представления формы не требует какой-либо внедренной зависимости, поэтому я не использую для него настраиваемый фабричный класс.
У меня есть «Zend / Form», указанный как модуль в application.config.php, и я знаю, что стандартные помощники представления форм Zend работают.
Я безуспешно пробовал много вариантов приведенного выше кода для регистрации помощника, используя примеры кода из вопросов SO, хотя все вопросы, похоже, относятся к обычным помощникам представления, а не к помощникам представления формы.
Я был бы очень благодарен за любые предложения о том, как я могу заставить это работать.
Спасибо.
Привет, Долли, путь - '/module/Application/src/Form/View/Helper/FormText.php'. Спасибо.
Удалите ли вы код на Module.php
, а затем просто вызовите FormText
, используя $this->FormText()
в вашем представлении.
@Dolly Да, и он просто использует стандартный помощник просмотра формы.
Возьмем пример из активного проекта в компании, в которой я работаю. У нас также есть некоторые стандартные ZF3 Form ViewHelpers, перезаписанные нашими собственными для взаимодействия с интерфейсной структурой. Название темы - "Альфа" (думаю ;-))
Мы используем следующее:
'view_helpers' => [
// other stuff
'invokables' => [
'Zend\Form\View\Helper\FormCollection' => AlphaCollection::class,
'Zend\Form\View\Helper\Form' => AlphaForm::class,
'Zend\Form\View\Helper\FormRow' => AlphaRow::class,
'Zend\Form\View\Helper\FormSelect' => AlphaSelect::class,
],
],
Просмотр самого помощника:
// Namespace + use statements
class AlphaCollection extends FormCollection
{
public function __construct()
{
parent::setWrapper('<div class = "alpha-form-collection">%2$s%1$s%3$s</div>');
}
/**
* @param \Zend\Form\ElementInterface $element
* @param null $labelPosition
* @return string
*/
public function render(ElementInterface $element, $labelPosition = null)
{
$markup = parent::render($element, $labelPosition);
$classes = 'input-field col s12 alpha-fieldset';
if ($element instanceof Collection)
{
$classes .= ' alpha-fieldset-collection';
}
$prepend = '<div class = "' . $classes . '">';
$append = '</div>';
return $prepend . $markup . $append;
}
}
По сути, мы не столько создаем собственные ViewHelpers, сколько меняем те, которые предоставляются Zend Framework 3. Поскольку мы просто «обновляем» существующие, нам не нужно создавать новые фабрики (никаких дополнительных требований ).
Zend Framework зарегистрировал ViewHelpers с вызываемыми именами (так что вы можете использовать $this->formRow(...)
или $this->formSelect(...)
. Мы просто угнанный их конфигурацию и заменили нужный нам класс нашим собственным. Таким образом, когда у нас будет полностью сгенерированная форма (<?= $this->form($form) ?>
), ZF сделает все работает на нас.
Реализация в .phtml
:
<!-- Internally uses the invokables we've modified, so this is all we need to do :) -->
<?= $this->form($form) ?>
Чтобы сделать конфигурацию более надежной в будущем, я думаю, вы можете заменить вызываемую строку на FQCN в настоящее время (не тестировал это (пока))
Спасибо rkeet, интересный подход. Я попробую.
Ваше решение действительно хорошо работает для меня, rkeet. Большое спасибо.
Пожалуйста. Если в будущем вам понадобится пользовательский ViewHelper (а не модифицированный), посмотрите здесь: zendframework.github.io/zend-view/helpers/advanced-usage - дает несколько примеров для воссоздания, чтобы почувствовать это. Внизу также есть инструкция по внедрению вашего нового ViewHelper в средство визуализации, делая его доступным с помощью специального вызова (например, <?= $this->specialViewHelper($options) ?>
). Но это следующий шаг ;-)
Я посмотрю rkeet. Еще раз спасибо
Где находится путь к пользовательскому помощнику FormText?