Как зарегистрировать помощник по просмотру настраиваемой формы в Zend Framework 3

Я переношу унаследованное приложение 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, хотя все вопросы, похоже, относятся к обычным помощникам представления, а не к помощникам представления формы.

Я был бы очень благодарен за любые предложения о том, как я могу заставить это работать.

Спасибо.

Где находится путь к пользовательскому помощнику FormText?

Dolly Aswin 11.08.2018 04:11

Привет, Долли, путь - '/module/Application/src/Form/View/Helper/FormText.php'. Спасибо.

Fergal Andrews 11.08.2018 09:05

Удалите ли вы код на Module.php, а затем просто вызовите FormText, используя $this->FormText() в вашем представлении.

Dolly Aswin 11.08.2018 10:13

@Dolly Да, и он просто использует стандартный помощник просмотра формы.

Fergal Andrews 11.08.2018 12:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
4
575
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возьмем пример из активного проекта в компании, в которой я работаю. У нас также есть некоторые стандартные 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, интересный подход. Я попробую.

Fergal Andrews 13.08.2018 17:41

Ваше решение действительно хорошо работает для меня, rkeet. Большое спасибо.

Fergal Andrews 14.08.2018 11:00

Пожалуйста. Если в будущем вам понадобится пользовательский ViewHelper (а не модифицированный), посмотрите здесь: zendframework.github.io/zend-view/helpers/advanced-usage - дает несколько примеров для воссоздания, чтобы почувствовать это. Внизу также есть инструкция по внедрению вашего нового ViewHelper в средство визуализации, делая его доступным с помощью специального вызова (например, <?= $this->specialViewHelper($options) ?>). Но это следующий шаг ;-)

rkeet 14.08.2018 11:49

Я посмотрю rkeet. Еще раз спасибо

Fergal Andrews 14.08.2018 11:57

Другие вопросы по теме