ZF2, как лучше всего работать с классами форм Vendor Module?

Как мне применить пользовательские стили к форме модуля поставщика или встроить их в свой собственный сценарий просмотра? В частности, я хочу работать с формами, предоставляемыми модулем EdpUser (https://github.com/EvanDotPro/EdpUser).

Кажется, самый простой способ - напрямую изменить сценарий поставщика. Но, очевидно, это будет противоречить будущим обновлениям поставщика.

Другим способом, по-видимому, является копирование контроллера поставщика в мой собственный модуль, а затем предоставление моих собственных представлений. Однако при этом возникает аналогичная проблема рассинхронизации с будущими обновлениями поставщика. И мне придется быть осторожным с пространством имен.

Может быть, мне следует расширить Контроллер поставщика, а не копировать его. Это должно хорошо работать с пространствами имен, и я смогу легко получить доступ к формам в моем контроллере. При использовании моих собственных сценариев просмотра. Это правильный путь или есть лучший?

Спасибо


person Jaepil    schedule 09.01.2012    source источник
comment
Я решил продолжить расширение Vendor's Controller. Но я быстро обнаружил, что это не сработает, как я ожидал. Не удалось загрузить подключаемый модуль контроллера поставщика «EdpUserAuthentication».   -  person Jaepil    schedule 09.01.2012


Ответы (1)


Не рекомендуется изменять что-либо в каталоге модуля, особенно те модули, которые помещены в /vendor/. Это также причина, по которой шаблоны конфигурации должны быть скопированы в ваш собственный каталог /config/autoload/.

Модуль должен предоставлять достаточно точек расширения, чтобы сделать его достаточно гибким для вашего использования. Среди этих возможностей следующие варианты:

Изменить маршрут

Модуль ZfcUser регистрируется под URL-адресом /user. Если вы хотите изменить это, например, на /account, вы можете просто добавить это в свою конфигурацию:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

Сменить контроллер

Если вас не устраивает использование ZfcUser\Controller\UserController и вы хотите переопределить какое-либо действие в этом контроллере, вы можете создать собственный контроллер, например MyUser\Controller\UserController. Если вы расширите ZfcUser\Controller\UserController и предоставите эту конфигурацию, вы готовы к работе:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'defaults' => array(
                                    'controller' => 'MyUser\Controller\UserController'
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

Вы также можете использовать псевдоним DI, чтобы переопределить псевдоним zfcuser в вашей конфигурации DI:

<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);

Изменить экземпляр формы

Например, модуль ZfcUser запускает несколько событий, чтобы помочь другим модулям подключиться к процессу создания формы. И ZfcUser\Form\Login, и ZfcUser\Form\Register вызывают событие init после настройки всех элементов формы. Это дает вам возможность добавлять или удалять элементы.

use Zend\EventManager\StaticEventManager;

$events = StaticEventManager::getInstance();
$events->attach('ZfcUser\Form\Login', 'init', function ($e) {
  $form = $e->getTarget();
  $form->addElement('text', 'something-new');
});

Здесь я должен сделать два замечания:

  1. Каждый модуль должен предоставлять свои собственные триггеры. Этот ZfcUser имеет init в обеих формах, но это не для каждого модуля. Вы должны изучить документацию или исходный код, чтобы узнать об этом.
  2. В настоящее время Zend\EventManager находится в стадии рефакторинга, чтобы заменить одиночный элемент StaticEventManager экземпляром SharedEventManager, экземпляр которого можно создать с помощью локатора Zend\Di. Вы можете наблюдать за ходом рефакторинга в этом запросе на включение.

Изменение отображения представления или формы

В соответствии с этим документом RFC компонент Zend\Form может измениться. Специально для рендеринга декораторы будут удалены, и вместо них будут рендерить форму «просто» обычные помощники представления. Учитывая это, а также возможность переопределения представлений, очень легко изменить рендеринг действия, просто используя другой модуль только с некоторыми сценариями представления.

Если вы создаете свой собственный модуль и предоставляете эту конфигурацию, вы добавляете новое местоположение в стек путей шаблона:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\View\Resolver\TemplatePathStack' => array(
                'parameters' => array(
                    'paths' => array(
                        'myuser' => __DIR__ . '/../view',
                    ),
                ),
            ),
        ),
    ),
);

Теперь вы можете создавать сценарии представления в каталоге view вашего модуля. Если у вас есть модуль с именем «MyUser» и расположенный в /modules/MyUser, и вы хотите переопределить сценарий входа в систему из ZfcUser (находится в /vendor/ZfcUser/view/zfcuser/login.phtml, создайте свой сценарий просмотра в /modules/MyUser/view/zfcuser/login.phtml.

person Jurian Sluiman    schedule 21.03.2012
comment
Спасибо за подробный ответ. - person Jaepil; 18.04.2012
comment
Юриан, твой ответ только что помог мне - спасибо. Просто быстрое дополнение для других: переопределение сценариев просмотра, похоже, зависит от порядка ваших модулей в application.config.php. Модуль, который вы хотите переопределить, должен быть размещен перед модулем, который его переопределит. Я думаю, это действительно имеет смысл, но мне потребовалась минута или две, чтобы понять, почему мое переопределение представления не работает... - person Mark T; 11.05.2012
comment
Обратите внимание, что на момент написания этой статьи многое из этого устарело. См. raw.github.com/ZF-Commons/ZfcUser. /master/config/ — чтобы переопределить UserController, например, вам нужно создать новый псевдоним для вашего расширения zfcuser и поместить его в файл конфигурации. Все еще быстро меняется в модулях zf2 - person Stephen Fuhry; 10.06.2012
comment
Я написал статью в блоге на эту тему, чтобы иметь возможность обновлять ее в соответствии с изменениями в фреймворке. Да, я бы ответил выше, вы можете найти мою статью в блоге по адресу juriansluiman.nl/en/article/117/ - person Jurian Sluiman; 26.06.2012
comment
@JurianSluiman Знаете ли вы, как сохранить данные формы после добавления в поля ввода ZfcUser? Я задал этот вопрос здесь stackoverflow. com/questions/13630526/ и мне было интересно, не могли бы вы мне помочь - person Theo Kouzelis; 29.11.2012