Yii создание модуля + создание модуля в пространстве имён = конкретный пример

Русская документация по данной теме находится здесь

Конкретный пример создания модуля

предположим, что мы хотим создать модуль "форум".

Для этого делаем следующее:
в 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')) ?>

снова откроется)