比较合理的做法其实是分成两个框架来布署;然而这样说法也太绝对。
事实上是针对不同系统,应采用不同的方法。如为CMS系统,则不需很复杂的权限管理,但如果有管理员与会员之分,系统又有很多设置操作,则需要前后台分离,并设置相应的权限管理。
大型的系统或是为安全因素考虑,则是布署成两个目录。
但一般的小型应用则不需要这样。
按照官方的cookebook有两种方法可选:一是modules,二是两个config。
modules的方法可参照boylee的教程,google yiigo即可。
这里是参照第二种方法来做的。
论坛上有人建议做一个主config.php然后使用CMap::mergeArray()将两个配置文件合并,好处是省事,配置方便。
但通常,前后台各有其配置。我这里采用了官方的方法,即前后台各使一个config,并不合并。便宜之处是前后台皆可使用gii(gii是yii的一大特色,工欲善其事,必先利其器,如果丢掉这么好的工具不用,有些可惜),另外便于操作,即便是新手也很容易配置。
现在将实现方法向大家汇报如下:
具体实现步骤:
一,建立入口
首先使用yiic 建立项目;其次,修改webroot 下的index-test.php,将其命名为admin.php(根据项目改名,此处只举例而已,不要认真,认真你就输了)。
修改admin.php
[php] view plaincopyprint?
/**
* This is the bootstrap file for test application.
* This file should be removed when the application is deployed for production.
*/
// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/admin/config/main.php';
// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
require_once($yii);
Yii::createWebApplication($config)->run();
ps:因为我将yii移到了项目之外,所以配置请以具体环境为准,此例仅做参照。
二、建立配置文件
在protected目录下建立admin目录,然后将protected下的config里的main.pphp拷贝过来;在admin目录依次建立controllers,models,views目录;然后将protected下的site相关目录考贝过来,放在相应层次。参考主目录结构建立如下:
[html] view plaincopyprint?
admin
|-- config
| `-- main.php
|-- controllers
| `-- SiteController.php
|-- models
| |-- ContactForm.php
| |-- LoginForm.php
| `-- Operator.php
|-- runtime
| |--
`-- views
|-- layouts
| |-- column1.php
| |-- column2.php
| `-- main.php
`-- site
|-- contact.php
|-- error.php
|-- index.php
|-- login.php
`-- pages
`-- about.php
ps:对于类linux系统请不要忘记修改相应的目录、文件权限。
三、修改配置admin/config/main.php参考如下:
[php] view plaincopyprint?
<?php
// 这里使用了一个扩展,故定义了一个别名
Yii::setPathOfAlias('ext', dirname(__FILE__).'/../extensions');
// 下面是分离前后台需要增加的
$backend=dirname(dirname(__FILE__));
$frontend=dirname($backend);
Yii::setPathOfAlias('backend', $backend);
// 下面是通用配置
return array(
<span style="color:#ff6666;">// 着重注意修改的地方
'basePath' => $frontend,
'controllerPath' => $backend.'/controllers',
'viewPath' => $backend.'/views',
'runtimePath' => $backend.'/runtime',</span>
'name'=>'后台管理程序',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
<span style="color:#ff6666;"> // 着重注意修改的地方
'backend.models.*',
'backend.components.*',</span>
'ext.*',ext),
'modules'=>array(
// Gii tool
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'password',
'generatorPaths'=>array(
'ext.dwz.gii.module.templates.dwz.module',
),
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
// uncomment the following to enable URLs in path-format
/*
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
*/
// MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=dbname',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
),
'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'=>array(
// this is used in contact page
'adminEmail'=>'webmaster@example.com',
'loginType'=>'',
),
);
ps:请不要照抄,跟据实际情况调整,另注意web页面的转义。另,注意着重修改的地方。
四、生成后台model
因为import里导入了前后台的models因此,在后台可以使用前后台所有models。
下面利用yii神器GII,http://domain/admin.php?r=gii/model
请注意下图:
这里可以选择要生成的models的位置,默认的是applications.models。其实,一个gii也可以生成前后台models但用起来稍闲麻烦。
五、实现前后台登陆
验证部分不说了,修改UserIdentity.php和用户模型。具体可参考这里
主要的是在config/main.php里的params里增加了‘logintype’参数,用于标识登陆用户类型。这里是急中生智的办法,希望大侠们提出更好的方法。
汇报完毕。坐等挨喷。