应用Yii11和PHP5进行敏捷Web开发第十二章迭代9添加管理模块.docx
- 文档编号:6118125
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:18
- 大小:833.22KB
应用Yii11和PHP5进行敏捷Web开发第十二章迭代9添加管理模块.docx
《应用Yii11和PHP5进行敏捷Web开发第十二章迭代9添加管理模块.docx》由会员分享,可在线阅读,更多相关《应用Yii11和PHP5进行敏捷Web开发第十二章迭代9添加管理模块.docx(18页珍藏版)》请在冰豆网上搜索。
应用Yii11和PHP5进行敏捷Web开发第十二章迭代9添加管理模块
第十二章:
迭代9:
添加管理模块
目前为止我们已经为TrackStar应用程序添加了很多功能。
回想一下第八章,我们介绍了如何使用用户的角色等级体系来限制用户访问一些功能。
这很好的帮助我们限制了对一些基于单一项目的管理功能的访问。
例如,在某个项目中,你并不想每一个人都拥有删除权限。
我们为用户添加基于某一项目的特殊角色来实现基于角色的用户控制,然后控制该角色是否拥有访问该功能的权限。
然而,到现在为止我们还没有提到的是整个应用程序的管理需求。
类似TrackStar的web应用程序需要针对某一用户设置拥有所有管理权限(的超级管理员)。
一个显著的例子就是,对系统的每一个用户拥有CRUD操作,而不仅仅是某个project(项目)。
当前应用程序中的系统管理员(同超级管理员)应当拥有如下权限:
可以登录,删除或者修改用户、project(项目),issue,管理所有评论,等等。
同时,也包括一些我们添加的额外功能,例如,给所有用户发布站点公告信息,管理E-mailcampaigns,打开/关闭当前应用程序功能,管理角色等级体系,更换站点主题,等等。
因为管理员权限和用户权限的巨大不同,将该本次迭代的功能和应用程序分离是一个好想法。
我们将通过在Yii的模块里完成这一功能来实现分离。
迭代计划
在本次迭代中,我们将会集中完成如下开发任务:
▪建立一个新模块来存放管理功能
▪为管理员建立系统广播的能力,用户将在项目列表页看到该消息
▪为模块添加新主题
▪为系统消息建立新的数据库表
▪为系统消息生成所有的CRUD操作
▪只允许管理员用户访问新模块中的功能
▪在项目列表页显示新系统消息
模块
模块是一个大型应用程序中的小型应用程序。
模块拥有与应用程序相似的结构,包含模型,试图,控制器,和其他支持组件。
但是,模块不可以单独作为一个应用程序出现,必须嵌入某一应用程序。
模块可以帮助你模块化实现你的应用程序。
大型应用程序常划分为离散的应用程序来实现功能,这里离散的应用程序可以通过模块实现。
站点功能类似添加用户论坛,用户博客,或者站点管理功能都是一些例子,可以从主功能上剥离,使得可以分离开发,并且可以很容易的在以后的项目中重用。
我们将在项目的不同目录建立存放管理功能的模块。
建立一个模块
使用我们的老朋友Gii代码生成工具建立一个新模块是非常容易的。
伴随着我们的URL的改变,应该通过http:
//localhost/trackstar/gii访问该工具。
打开以后选择,左边菜单的ModuleGenerator选项。
你将会看到下面的画面:
我们需要给该模块取一个唯一的名字。
因为我们在创建一个管理模块,我们可以命名为admin。
所以在ModuleID内填入admin,然后点击Preview按钮。
如下图所示,它向你展示了所有将会被生成的文件,允许你在新建之前预览他们:
然后点击Generate按钮,来生成所有文件。
因为Web服务器进程需要写入权限,所以确保你的/protected文件夹对于该应用程序是可写入的。
模块添加成功后,会看到下图的界面:
让我们仔细观察一下自动生成的模块。
一个模块在Yii中是以一个文件夹来组织的,该文件夹的名字就是模块的名字。
默认的,所有模块都存放在protected/modules目录下。
每一个模块的结构都和我们的主应用程序很相似。
命令行会为admin模块建立脚手架文件夹结构。
因为这是我们第一个模块,顶级文件夹/protected/modules被建立了,所以admin文件夹被放置在里面。
下面为我们展示了模块命令行为我们建立的所有文件夹和文件:
一个模块中必须有模块类继承自CWebModule或它的子类。
该模块类的名字由模块ID(在这里指admin)和字符串Module联合生成。
模块ID的首字母会大写。
因此,在我们的案例中,我们的admin模块类文件被命名为AdminModule.php。
模块类扮演了存储来自模块代码共享信息的中转地带。
例如,我们可以使用CWebModule的params属性来存储模块的特定参数,使用components属性在模块级分享应用程序组件。
该类在模块中的作用类似应用程序中的类对整个应用程序的作用。
因此,CWebModule是对模块来说的,CWebApplication是对整个应用程序来说的。
使用一个模块
在看到建立成功的消息后,我们需要在应用程序中设置modules属性,才可以使用它。
在添加gii模块到应用程序的时候,我们使用过该方法来允许我们使用Gii代码生成工具。
我们对主配置文件:
protected/config/main.php进行配置,如下的高亮代码需要被修改:
PHP代码:
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'iamadmin',
),
'admin',
),
保存以上改变后,我们的新admin模块已经可以使用了。
我们可以先通过以下地址访问一下http:
//localhost/trackstar/admin/default/index。
该请求为我们展示的页面类似我们的主应用程序页,唯一的区别是我们应该在路由中添加moduleID(模块ID)。
所以我们的路由应该是如下形式/moduleID/controllerID/actionID。
我们URL请求/admin/default/index应该解释为admin模块的default控制器的index方法。
浏览该页面时,将看到如下画面:
主题化一个模块
我们立刻能发现该view(视图)没有应用任何layout(布局)。
有人可能会想到,控制器渲染view时使用了renderPartial()而不是render()方法。
然而,打开默认的admin的controller文件,/protected/modules/admin/controllers/DefaultController.php,我们将会发现,实际上,使用了render()方法。
因此,我们需要一个layout文件。
问题(Issue)是基本上所有的东西都被独立到模块中,包括默认layout文件路径。
默认路径是/protected/modules/[moduleID]/views/layouts,在这里moduleID应该是admin。
我们可以看到该文件夹下没有任何文件,所以默认layout没有被使用。
在这里多讲一点。
在上一次迭代中,我们实现了一个叫new的新主题。
我们也可以通过新主题管理所有模块的view和layoutview文件。
如果要这样做,需要在适当的路径下添加主题文件包。
文件夹的结构与预期的一样。
大致上:
/themes/[themeName]/views/[moduleID]/layouts/为layout文件,/themes/[themeName]/views/[moduleID]/[controllerID]/为对应controller的试图文件。
为了更清楚,让我们模拟一次admin模块调用view的过程。
下面就是在admin模块的DefaultController.php文件中渲染$this->render('index')的过程:
1.当render()被调用,与renderPartial()不同,它将会使用一个layout文件来修饰index.phpview(试图)文件。
我们的应用程序被配置为使用叫new的主题,所以将会使用位于该主题文件夹下的layout文件。
我们的新模块的DefaultController类继承自应用程序组件Contorller.php,所以使用了column1作为特定$layout属性值。
因为该值没有被重写,所以也是DefaultController的layout值。
最终,当这些都在admin模块中完成后,Yii会首先查找一下的layout文件:
/themes/new/views/admin/layouts/column1.php。
注意这里包含了admin(moduleID)。
2.该文件不存在,所以在模块内查找。
如前面所说的,每一个模块都有特定的默认layout文件夹。
所以,在这里将会查找:
/protected/modules/admin/views/layouts/column1.php。
3.该文件也不存在,所以layout将不会被使用。
将会简单的渲染单独的index.php文件。
但是我们定义了主题new,所以它会查找/themes/new/views/admin/default/index.php。
4.该文件还是不存在,所以它会查找该模块(AdminModule)内的DefaultContorller.php(控制器)的/protected/modules/admin/views/default/index.php。
这解释了为什么http:
//localhost/trackstar/admin/default/index渲染没有layout。
为了保证完成,和简单,让我们管理一下位于我们模块中default位置的view文件(注意不是new主题内)。
让我们为admin模块应用我们为原始应用程序设计的主题,就是在使用新主题前的样子。
这样的话我们的admin模块的页面将与应用程序页面不同,这样可以很好的提醒我们处于不同的功能模块,并且无需重新设计。
应用一个主题
首先让我们设置模块的默认layout值。
我们在模块类的init()方法中设置模块级的配置,模块类位于:
/protected/modules/AdminiModule.php。
打开此文件,并添加如下代码:
PHP代码:
classAdminModuleextendsCWebModule
{
publicfunctioninit()
{
//thismethodiscalledwhenthemoduleisbeingcreated
//youmayplacecodeheretocustomizethemoduleortheapplication
//importthemodule-levelmodelsandcomponents
$this->setImport(array(
'admin.models.*',
'ponents.*',
));
$this->layout='main';
}
...
这样,如果我们没有特殊指定layout文件,所有的view都会调用位于/protected/modules/admin/views/layouts/下的main.php文件。
现在,我们自然是需要创建这一文件。
从主应用程序copy2个layout文件:
/protected/views/layouts/main.php和/protected/views/layouts/column1.php,将他们都放到/protected/modules/admin/views/layouts/文件夹。
copy之后我们需要对其做一定修改。
首先修改column1.php文件。
在beginContent()中去除对/layouts/main的引用,修改后代码如下:
PHP代码:
php$this->beginContent();?
>
phpecho$content;?
>
--content-->
php$this->endContent();?
>
在没有指定的情况下调用beginContent(),将会使用模块默认的layout文件,而我们刚刚将其指定到新copy过来的main.php。
现在是时候修改main.php文件了。
我们需要应用程序头部添加AdminConsole文字,来提示这是应用程序的管理部分。
我们也需要对菜单项进行修改,来添加指向管理首页的连接,同时也要添加返回主站点的连接。
我们可以去除About和Contact连接,因为在管理部分不需要重复这些资料。
修改后代码如下:
PHP代码:
...
phpechoCHtml:
:
encode(Yii:
:
app()->name)."Ad-minConsole";?
>
--header-->
php$this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'BackToMainSite','url'=>array('/proj-ect')),
array('label'=>'Admin','url'=>array('/admin/default/in-dex')),
array('label'=>'Login','url'=>array('/site/login'),'visible'=>Yii:
:
app()->user->isGuest),
array('label'=>'Logout('.Yii:
:
app()->user->name.')','url'=>array('/site/logout'),
'visible'=>!
Yii:
:
app()->user->isGuest)),
));?
>