0 follower

Модуль

Примечание: Поддержка модулей доступна, начиная с версии 1.0.3.

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

Модули могут быть полезными в нескольких ситуациях. Если приложение очень объемное, мы можем разделить его на несколько модулей, разрабатываемых и поддерживаемых по отдельности. Кроме того, некоторый часто используемый функционал, например, управление пользователями, комментариями и пр., может разрабатываться как модули, чтобы впоследствии можно было с легкостью воспользоваться им вновь.

1. Создание модуля

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

forum/
   ForumModule.php            файл класса модуля
   components/                содержит компоненты пользователя
      views/                  содержит файлы представлений для виджетов
   controllers/               содержит файлы классов контроллеров
      DefaultController.php   файл класса контроллеру по умолчанию
   extensions/                содержит сторонние расширения
   models/                    содержит файлы классов моделей
   views/                     содержит файлы представлений контроллера и макетов
      layouts/                содержит файлы макетов
      default/                содержит файлы представлений для контроллера по умолчанию
         index.php            файл представления 'index'

Модуль должен иметь класс модуля, унаследованный от класса CWebModule. Имя класса определяется с использованием выражения ucfirst($id).'Module', где $id соответствует идентификатору модуля (или названию директории модуля). Класс модуля выполняет роль центрального места для хранения совместно используемой информации. Например, мы можем использовать CWebModule::params для хранения параметров модуля, а также CWebModule::components для совместного использования компонентов приложения на уровне модуля.

Подсказка: Для создания каркаса модуля можно воспользоваться утилитой yiic. Например, чтобы создать модуль forum, нужно выполнить следующую последовательность команд в командной строке:

% cd WebRoot/testdrive
% protected/yiic shell
Yii Interactive Tool v1.0
Please type 'help' for help. Type 'exit' to quit.
>> module forum

2. Использование модуля

Для использования модуля необходимо поместить папку модуля в директорию modules базовой директории приложения. Далее необходимо объявить идентификатор модуля в свойстве приложения modules. Например, чтобы воспользоваться модулем forum, приведенным выше, можно использовать следующую конфигурацию приложения:

return array(
    ......
    'modules'=>array('forum',...),
    ......
);

Кроме того, модуль можно сконфигурировать с начальными значениями свойств. Порядок использования аналогичен порядку с компонентами приложения. Например, модуль forum может иметь в своем классе свойство с именем postPerPage, которое может быть установлено в конфигурации приложения следующим образом:

return array(
    ......
    'modules'=>array(
        'forum'=>array(
            'postPerPage'=>20,
        ),
    ),
    ......
);

К экземпляру модуля можно обращаться посредством свойства module активного в настоящий момент контроллера. Через экземпляр модуля можно получить доступ к совместно используемой информации на уровне модуля. Например, для того, чтобы обратиться к упомянутому выше свойству postPerPage, мы можем воспользоваться следующим выражением:

$postPerPage=Yii::app()->controller->module->postPerPage;
// или таким, если $this ссылается на экземпляр контроллера
// $postPerPage=$this->module->postPerPage;

Обратиться к действию контроллера в модуле можно, используя маршрут moduleID/controllerID/actionID. Например, предположим, что все тот же модуль forum имеет контроллер с именем PostController, тогда мы можем использовать маршрут forum/post/create для того, чтобы обратиться к действию create этого контроллера. Адрес URL, соответствующий этому маршруту, будет таким: http://www.example.com/index.php?r=forum/post/create.

Подсказка: Если контроллер находится в подпапке папки controllers, мы также можем использовать формат маршрута, приведенный выше. Например, предположим, что контроллер PostController находится в папке forum/controllers/admin, тогда мы можем обратиться к действию create через forum/admin/post/create.

3. Вложенные модули

Модули могут быть вложенными, т.е. один модуль может содержать в себе другой. Первый мы будем называть модуль-родитель, второй - модуль-потомок. Модули-потомки должны быть помещены в папку modules модуля-родителя. Для обращения к действию контроллера в модуле-потомке, необходимо использовать маршрут parentModuleID/childModuleID/controllerID/actionID.