Плюсы:
1) Физическое разделение приложения на уровне каталогов, файлов и настроек
2) Минимум повторяемости кода. в back-end помещается только те файлы, которые нужны, все остальное используется из основного приложения.(modules,models, view и т.д...)
3) Нет свистопляски с .htaccess и rules(urlManager в config), Минимальная настройка
4) Возможность использовать любые модули в обоих частях тоесть создать полностью подульное приложение, причем что бы разделить сторонний модуль на front-end and back-end части достаточно скопировать контроллеры и виды, используемые в админке модуля, в каталог и точно так же подключить в конфигурационном фале. (что касается лишних телодвижений, конечно придется дописать две лишних строчки в config, но дальнейшая работа с модулем доставляет одно удовольствие)
5) Использование общих правил доступа к back-end части сайта, на основе ролей (приписывается в protected/backend/components/controller.php)
Не смотря на все плюсы столкнулся с рядом сложностей(на момент написания статьи не исправлены)
Недостатки/Сложности:
1)При авторизации в front-end части, back-end видит пользователя как не авторизованным, приходится авторизоваться повторно(соответственно и наоборот). Причину пока не выявил, если кто может, помогите исправить. Конечно это не критично, но все же не очень удобно.
2)[s]Не смог настроить роутинг, что бы в браузерной строке убрать расширение входного скрипта, т.е. вместо красивого http://mysite.ru/backend/{ссылки}получается http://mysite.ru/backend.php/{ссылки} .(просто не красиво) Ситуация аналогична, буду рад любой помощи.[/s] (Решено)
А теперь собственно реализация. Начну с самого начала, что бы не было путаницы, при желании можно сравнить с http://www.yiiframework.com/wiki/33/org ... d-back-end.
1) В базовой директории должно лежать два файла: index.php и backend.php(соответственно создаем) и редактируем их сл. образом:
index.php:
Код: Выделить всё
<?php
$yii='Z:/home/192.168.0.100/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/frontend.php';
require_once($yii);
Yii::createWebApplication($config)->run();
?>
Код: Выделить всё
<?php
$yii='Z:/home/192.168.0.100/framework/yii.php';
$config=dirname(__FILE__).'/protected/backend/config/backend.php';
require_once($yii);
Yii::createWebApplication($config)->run();
?>
2) Редактируем файлы конфигурации. Но для начала в '/protected' нашего приложения необходимо создать необходимые директории для back-end части:
Как видно у нас появились следующий конфигурационные фалы: frontend.php; main.php; backend.php. Поясню почему так- в main.php мы будем хранить настройки общие для обоих частей, такие как, к примеру, подключение к базе данных, а файлы frontend.php и backend.php будут наследовать основной файл настроек. :wwwroot/
-index.php
-backend.php
-assets/
-images/
-js/
-protected/
--config/
----frontend.php
----main.php
--components/
--controllers/
--models/
--views/
--runtime/
--backend/
----config/
----backend.php
----components/
----controllers/
----modules/
----models/
----views/
----runtime/
main.php:
Код: Выделить всё
<?php
return array(
// preloading 'log' component
'preload'=>array('log'),
// application components
'components'=>array(
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=yii_hom',
'emulatePrepare' => true,
'username' => 'admin',
'password' => '***',
'charset' => 'utf8',
'tablePrefix'=>'tbl_',
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
/*
array(
'class'=>'CWebLogRoute',
),
*/
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>require(dirname(__FILE__).'/params.php'),
);
Код: Выделить всё
<?php
$backend=dirname(dirname(__FILE__));
$frontend=dirname($backend);
Yii::setPathOfAlias('backend', $backend);
return CMap::mergeArray(
// наследуемся от main.php
require($frontend.'/config/main.php'),
array(
'basePath'=>$frontend,
'name'=>'Админка',
// Настраиваем пути до основных компонентов нашего backend
'controllerPath' => $backend.'/controllers',
'viewPath' => $backend.'/views',
'runtimePath' => $backend.'/runtime',
'modulePath'=>$backend.'/modules',
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'backend.models.*',
'backend.components.*',
'application.modules.user.models.*',
'application.modules.user.components.*',
),
'sourceLanguage' => 'en',
'language' => 'ru',
'modules'=>array(
'user',
),
'defaultController'=>'post',
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
'loginUrl' => array('/user/login'),
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
// Убираем расширение .php из заголовка.(настройка файла .htaccess далее)
'backend'=>'post/index',
'backend/<_c>'=>'<_c>',
'backend/<_c>/<_a>'=>'<_c>/<_a>',
),
),
),
)
);
Код: Выделить всё
<?php
return CMap::mergeArray(
// наследуемся от main.php
require(dirname(__FILE__).'/main.php'),
array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'MySite - Мой замечательный сайт',
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.modules.user.models.*',
'application.modules.user.components.*',
),
'defaultController'=>'post',
'modules'=>array(
'user',
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
),
),
),
)
);
3) Разделение модуля yii-user.
Скачиваем модуль -> http://www.yiiframework.com/extension/y ... 3-r107.zip
Сначала помещаем все содержимое архива в каталог 'modules' основного сайта. Настраиваем его в соответствии с документацией http://www.yiiframework.com/extension/yii-user/ в нашем случае настройки уже содержаться в ранее созданных файлах.
После чего смотрим какие контроллеры модуля необходимо ограничить от пользователей, в нашем случае это : AdminController.php; RecoveryController.php; ProfileFieldController.php; и в нашем случае(так как проблема с авторизацией в разных частях сайта пока не решена, прийдется скопировать контроллеры авторизации/выхода с сайта) LoginController.php; LogoutController.php. Копируем эти файлы в ' protected/backend/modules/user/controller', удалив из основной части AdminController.php; RecoveryController.php; ProfileFieldController.php (т.к. они там не нужны, мы их уже перенесли и они работают только в админке(backend)). И следует провести аналогичные операции с файлами видов(описывать не буду).
Теперь можно работать с приложением, переделывать вид сайта и модулей под себя, исправлять ссылки, и т.д. Но когда мы откроем ссылку http://mysite/user , к примеру, то модуль отобразиться на белом фоне, что бы этого избежать необходимо отредактировать лишь один файл(в обоих частях): ' protected/components /controller.php' и ' protected/backend/components/controller.php' в нем следует прописать
Код: Выделить всё
public $layout='//layouts/main';
Код: Выделить всё
public function filters()
{
return array(
'accessControl',
);
}
// Роли, права доступа к сайту
public function accessRules()
{
return array(
array('allow',
'roles'=>array('moderator'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
Код: Выделить всё
IndexIgnore */*
RewriteEngine on
RewriteRule ^backend backend.php
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
AddDefaultCharset utf-8