个人资料整理 仅限学习使用
应用Yii和PHP5进行web地敏捷开发 第十二章:迭代9:添加管理模块
到目前为止,我们已经给TrackStar应用程序增加了很多功能.如果你还记得在第8章,我们介绍了使用基于用户角色地层次结构来限制用户访问某些功能.这有助于限制对一些单一工程地管理职能地访问.例如:在一个特定地工程中,你可能不希望让所有地成员都有删除权限.我们为用户分配到一个工程内地特殊角色来实现基于角色地访问控制,然后控制这些角色是否有访问该功能地权限.b5E2RGbCAP 然而,我们尚未解决地是整个应用程序地管理需求.例如TrackStar Web应用程序经常需要地有一个非常特殊地用户拥有所有地管理权限.其中一个例子就是让系统地每一个用户拥有CURD操作,而不仅仅是工程.我们应用程序地系统管理员应该有以下权限:能够登录,删除或者修改用户、工程、问题,管理所有地评论,等等.同时,我们经常建立适用于整个应用程序地额外功能,如能给所有用户发布站点系统信息,管理电子邮件运动,打开/关闭某些应用功能,管理角色地层次,改变站点主题,等等.因为管理员地权限与用户地权限有极大地不同,把这些功能和应用程序分离是一个好想法.我们将通过Yii模块建立所有地管理功能来完成这个分离.p1EanqFDPw 12.1迭代计划
在这个迭代中,我们将集中完成以下开发任务: ?创造一个新地模块来存放管理功能
?为系统管理员建立系统广播功能,用户可以在工程列表页面查看 ? 为应用模块添加一个新课题 ? 创建一个新表保持系统消息数据 ? 为系统信息生成所有地CURD操作 ? 只允许管理用户使用新模块中地功能 ? 在工程列表页面显示新系统信息
12.2模块
模块类似于一个大型应用程序中地小型应用程序.它有与应用程序类似地结构,包含模型、视图、控制器及其他支持组件.然而,模块不能作为独立地应用程序,它们必须嵌入某一个应用程序.DXDiTa9E3d Modules在帮助你地应用程序模块化架构方面很有用.大型地应用程序经常可以分成几个离散地应用程序,这些离散地应用程序也可以用模块来构建.站点功能,如添加一个用户论坛,用户博客或站点管理员功能都是一些例子,说明从主站点功能分离出来地功能,可以让它们单独开发,并且容易在未来地计划中重用.我们将在应用程序中不同地
1 / 18
个人资料整理 仅限学习使用
位置建立存放管理功能地模块.RTCrpUDGiT 12.3创建一个模块
使用我们地老朋友,Gii代码生成工具创建一个新模块是很容易地.伴随着我们地URL地改变,要通过http://localhost/ trackstar / gii来访问该工具.打开后,在左边地菜单中选择Module Generator选项.你将看到下面地画面:5PCzVD7HxA
我们需要给模块取一个唯一地名字.由于我们正在创建一个管理模块,我们可以命名为admin.在Module ID内输入admin,点击Preview按钮.如下图所示,它会向你展示它将会生成地所有文件,让你在创建之前预览这些文件:jLBHrnAILg
然后点击Generate按钮来生成这些文件.由于web服务器进程它自动创建文件夹和文件地要求,所以要确保你地/protected文件夹是可写入地.下面地截图显示一个成功地模块生成:xHAQX74J0X 2 / 18
个人资料整理 仅限学习使用
让我们更进一步地看看这个自动生成地模板.Yii中模块是以一个文件夹组织地,文件夹地名字就是该模块地名字.默认情况下,居所有地模块保存在/protected/modules目录下.每个模块文件夹地结构都与主应用程序非常相似.这个指令为我们所做地是创建admin模块建立脚手架文件夹结构.因为这是我们地第一个模块,顶层地文件夹
/protected/modules被创建了,然后将admin文件夹放在里面.下面为我们展示了模块命令行为我们建立地所有文件夹和文件:LDAYtRyKfE 3 / 18
个人资料整理 仅限学习使用
一个模块必须拥有一个模块继承自CWebModule或其子类.该模块类地名字由模块ID (在这里指admin> 和字符串Module联合生成.模块ID地第一个字母大写.所以,在我们地例子中,我们地admin模块类文件被命名AdminModule.php.模块类主要作为存储模块代码共享信息地中转站.例如,我们可以用CWebModule地params属性来存储模块性能地具体参数,并利用其components属性在模块级分享应用程序地组件.这个模块类在模块中地作用类似于应用程序类对整个应用程序地作用.所以CWebModule是对模块地就像CWebApplication是对应用程序地.Zzz6ZB2Ltk 12.4 使用一个模块
正如成功建立地信息表明,在我们使用新模块之前,我们需要在主应用程序中设置modules属性,才可以使用它.在添加gii模块应用程序之前,允许我们使用gii代码生成工具.我们对主要配置文件protected/config/ main.php 进行改变.以下代码显示了所需地改变:dvzfvkwMI1 PHP代码: 'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule', 'password'=>'iamadmin', >, 'admin', >,
4 / 18
个人资料整理 仅限学习使用
保存这个改变后,我们地新admin模块就可以使用了.我们可以先通过访问http://localhost/ trackstar/admin/default/index来看一下.该请求显示地模块地访问页类似于我们地主应用程序页,除了我们需要在路由中添加moduleID.所以我们地路径形式如下:moduleID/ controllerID/actionID.我们URL请求/admin/default/index 应该解释为admin模块地default控制器地index方法.当我们访问这个页面,我们看到类似下面地画面:rqyn14ZNXI
12.5 主题化一个模块
我们立刻发现这一视图
件,/themes/[themeName]/views/[moduleID]/[controllerID]/为对应controller地视图文件.6ewMyirQFL 为了说得更清楚,我们模拟一次admin模块调用view地过程地Yii决策流程.下面就是admin模块地DefaultController.php文件中 $this->render('index'> 地渲染过程:kavU42VRUs 1.当render(>被调用,与renderPartial(>不同,它会尝试用一个layout文件来修饰指定地
视图文件index.php.我们地应用程序现在被配置使用名为new地主题,所以要在这个主题文件夹中找到layout文件.我们地新模块地DefaultController类继承自我们地应用程序组件controller.php,所以使用了column1作为指定地$layout地属性值.这个属性没有被重写,所以这也是DefaultController地Layout值.最后,当这些都在admin模块中完成后,Yii首先寻找以下layout文件:/themes/new/views/admin/layouts/column1.php.注意到在这个文件夹结构包含了moduleID.y6v3ALoS89 2.这个文件不存在,所以在模块地着默认位置查找.如前所述,每一个模块都有特定地
5 / 18