Yii создание модуля + создание модуля в пространстве имён = конкретный пример
Primary tabs
Русская документация по данной теме находится здесь
Конкретный пример создания модуля
предположим, что мы хотим создать модуль "форум".
Для этого делаем следующее:
в protected/ директории (стандартная в yii ) создаём папку modules - в ней мы будем хранить вообще все модули, а уже /modules в создаём папку forum
Далее создаём файл /modules/forum/ForumModule.php и набрасываем скрипт - главный файл модуляй:
<?php class ForumModule extends CWebModule { }
при этом именование файла и класса имеют значение (далее цитата из документации):
Имя класса определяется, используя выражение ucfirst($id).'Module', где $id соответствует идентификатору модуля (или названию директории модуля)
далее - в папке /modules/forum рядом с ForumModule.php мы создаём ряд папок, совокупность которых очень напоминает аналогичный набор директорий в базовой директории приложения /protected, в данном примере нам понадобятся папки для скриптов контроллеров и представлений
/modules/forum/controllers /modules/forum/views
В /modules/forum/controllers кидаем скрипт контроллера SiteController.php, например:
class SiteController extends \Controller { public $breadcrumbs = array(); // это необходимо (как стимул__) public function actionIndex() { $this->render('index'); } }
а в папку /modules/forum/views кидаем скрипт представления выше описанного действия index (SiteController):
<?php echo ('это главная страница форума'); echo CHtml::link('Форум', array('forum/site/index')) // выведем ссылку на эту же страницу (например)
Выше мы выводим ссылку - эта ссылка, вообще говоря, будет соответствовать формату:
имясайта/index.php?r=forum/post/create
Чтобы Yii распознал адрес forum/site/index , который мы запрашиваем через функцию:
CHtml::link('Форум', array('forum/site/index'))
Нам следует поправить основной файл конфигурации приложения protected/config/main.php , а именно - вносим туда строки:
'modules'=>array( 'forum'=>array( 'class' => 'application.modules.forum.ForumModule', ), ),
здесь путь к файлу класса определяется средствами псевдонима путей в yii
После внесения изменений protected/config/main.php должен выглядеть как-то так (примерно - т.к. я привожу это только чтобы вы поняли где именно в возвращаемом массиве размещать сведения о нашем модуле "Форум"):
<?php $localConfig = require dirname(__FILE__) . '/local.php'; // добавляем пространство имён "mynamespace" //Yii::setPathOfAlias('modules', '/modules/forum/'); return array( //путь к корню нашего сайта 'basePath' => realpath(dirname(__FILE__) . '/..'), 'preload'=>array('log'), // необходимо для журналирования //пути к директориям,скрипты из которых //следует подключить 'import' => array( 'application.models.*', 'application.components.*', 'application.controllers.*' // Чтобы автоматически подгружать классы контроллеров ), // подключаем модули(в том числе и самописные) 'modules'=>array( // ЗДЕСЬ НАСТРОЙКИ НАШЕГО МОДУЛЯ 'forum'=>array( 'class' => 'application.modules.forum.ForumModule', ), ), // НАСТРОЙКИ МОДУЛЯ ЗАКОНЧИЛИСЬ - дальше остальные настройки // прописываем конфигурацию для компонентов приложения 'components' => array( 'user'=>array( 'allowAutoLogin'=>true, ), 'webuser' => array( 'class' => 'CWebUser', 'allowAutoLogin' => true ), ................ .......... ......
Всё - после произведённых действий ссылка
имясайта/index.php?r=forum/site/index
должна открыться))
теперь чтобы вывести ссылку на действие index контроллера site модуля forum мы можем использовать такой код:
<?php echo CHtml::link('Форум', array('forum/site/index')) ?>
Создание модуля в пространстве имён
А теперь перепишем выше сделанное так, чтобы модуль оказался в собственном пространстве имён, поехали -
сначала добавим информацию о пространстве имён в основной файл модуля ForumModule.php =
<?php // задаём пространство имён для модуля : namespace modules\forum; // так как класс находится в пространстве имён, обращаться к глобальному // пространству следует явно при помощи "\": class ForumModule extends \CWebModule { // задаём пространство имён для контроллеров (это же можно сделать через // файл конфигурации) public $controllerNamespace = 'modules\forum\controllers'; }
Далее в SiteController - контроллере нашего модуля тоже указываем пространство имён - такое которые мы указали выше в свойстве $controllerNames нашего модуля
namespace modules\forum\controllers; /** * SiteController - это контроллер оп умолчанию * для обработки запросов пользователей */ class SiteController extends \ParentController { public $breadcrumbs = array(); // это необходимо (как стимул__) public function actionIndex() { $this->render('index'); //обращение к представлению для действия index // (должно быть в папке views/site нашего модуля ) } }
и конечно же изменяем файл конфигурации приложения подобным образом (придётся связать имя пространства имён с путём к директории модуля):
// объявляем псевдоним пространства имён указывая на путь Yii::setPathOfAlias('modules', realpath(dirname(__FILE__) . '/..') . '/modules/'); return array( //путь к корню нашего сайта 'basePath' => realpath(dirname(__FILE__) . '/..'), 'preload'=>array('log'), // необходимо для журналирования //пути к директориям,скрипты из которых //следует подключить 'import' => array( 'application.models.*', 'application.components.*', 'application.controllers.*' // Чтобы автоматически подгружать классы контроллеров (приложения) ), // подключаем модули(в том числе и самописные) 'modules'=>array( 'forum'=>array( //'class' => 'application.modules.forum.ForumModule', // без использования пространства имён 'class' => 'modules\forum\ForumModule', ), ),
Вот - теперь ссылка:
<?php echo CHtml::link('Форум', array('forum/site/index')) ?>
снова откроется)
- Log in to post comments
- 15296 reads