ZF2, как лучше всего работать с классами Form модуля Vendor? - PullRequest
11 голосов
/ 09 января 2012

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

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

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

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

Спасибо

1 Ответ

36 голосов
/ 21 марта 2012

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

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

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

Модуль ZfcUser регистрируется под / user url. Если вы хотите изменить это, например, на / 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 as 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.

...