Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

понедельник, 19 августа 2013 г.

ZendFramework2. Использование собственных модулей на примере расширения возможностей ZfcUser.

Изменение маршрутов

По умолчанию модуль использует маршрут user. Мы хотим поменять на account.
Важно!!! Наш модуль регистрируется после стандартного модуля.
В таком случае настройки подхватываются последовательно и мы можем перекрыть стандартные настройки модуля ZfcUser в файле настроек нашего модуля.
return array(

    ...

    // Перекрываем маршрут zfcuser
    'router' => array(
        'routes' => array(
            'zfcuser' => array(
                'options' => array(
                    'route' => '/account',
                ),
            ),
        ),
    ),
);

Изменение скриптов вида

Каталог скриптов вида стандартного модуля называется 'zfc-user'.
Например, шаблон с формой регистрации будет 'view/zfc-user/user/register.phtml'.
Все что нам нужно, это просто создать альтернативный шаблон в нашем модуле с аналогичным путем и убедится, что шаблоны нашего модуля подхватываются уровнем вида приложения.
Для этого в настройках модуля должно быть следующее:
return array(
    ...

    // Указываем менеджеру вида путь к шаблонам в нашем модуле
    'view_manager' => array(
        'template_path_stack' => array(
            'application' => __DIR__ . '/../view',
        ),
    ),
);

Изменение формы

ZfcUser генерирует событие после выполнения метода init, то есть после создания формы со всеми элементами. Событие так и называется 'init' а идентификатор 'ZfcUser\Form\Register'.Таким образом, если мы хотим, например, добавить чекбокс в форму, то у нас есть такая возможность. Мы должны использовать слушатель события 'init'. Нам нужно создать слушатель в классе нашего модуля. Класс модуля должен реализовавать интерфейс 'Zend\ModuleManager\Feature\BootstrapListenerInterface'
в котором есть метод onBootstrap.
...
use Zend\ModuleManager\Feature\BootstrapListenerInterface;
...

class Module implements BootstrapListenerInterface {

...

    public function onBootstrap(Event $e){
        $app = $e->getParam('application');
        // $em объект Zend\EventManager\SharedEventManager
        $em  = $app->getEventManager()->getSharedManager();

        $em->attach('ZfcUser\Form\Register', 'init', function($e) {
            // $form объект ZfcUser\Form\Register
            $form = $e->getTarget();

            $form->add(array(
                'name' => 'accept',
                'options' => array(
                     'label' => 'Accept Terms of Use',
                ),
                'attributes' => array(
                    'type' => 'checkbox'
                ),
            ));
        });
    }

...

}
Похожий вариант с ZfcUser\Form\RegisterFilter, котoрый тоже генерирует событие init:
public function onBootstrap(Event $e){
    $app = $e->getParam('application');
    // $em объект Zend\EventManager\SharedEventManager
    $em  = $app->getEventManager()->getSharedManager();

    $em->attach('ZfcUser\Form\Register', 'init', function($e) {
        // $form объект ZfcUser\Form\Register
        $form = $e->getTarget();

        $form->add(array(
            'name' => 'accept',
            'options' => array(
                'label' => 'Accept Terms of Use',
            ),
            'attributes' => array(
                'type' => 'checkbox'
            ),
        ));
    });
}
К сожалению, далеко не все модули используют EventManager для оповещения о событиях ;-(
В таком случае этот подход не будет работать.

Комментариев нет:

Отправить комментарий