Как зарегистрировать помощник по просмотру настраиваемой формы в 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
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

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