1.模块的安装卸载机制介绍
OC的模块安装机制目前来说比较简单,暂时只支持本地模块的安装卸载。
如果要能够被OC识别并允许安装卸载。开发人员需要遵守以下约定。
目录结构约定:
模块文件放置在
/Application下
每一个模块的目录结构如下
以Issue(专辑)模块为例
/Conf 配置文件 config.php 模块配置文件 /Controller 控制器 IndexController 模块入口控制器 IssueController 模块管理后台控制器 /Info 模块信息 info.php 模块信息 install.sql 模块安装sql uninstall.sql 模块卸载sql /Model 业务模型 IssueModle.class.php Issue模块 /Static 静态资源存放 /css /js /View 模板文件 /defalut /Index index.html 模块首页模板 /Public /Widget ueditormini.html UeditorMini编辑器小部件模板 /Widget 小部件Widget UeditorMiniWidget.class.php UeditorMini编辑器小部件控制器
模块的生命周期:
安装模块
使用模块
卸载模块
安装模块
此步骤涉及到/Info/info.php
<?php return array( //模块名 'name' => 'Issue', //别名 'alias' => '专辑', //版本号 'version' => '1.0.0', //是否商业模块,1是,0,否 'is_com' => 0, //是否显示在导航栏内? 1是,0否 暂时无效,保留项 'show_nav' => 1, //模块描述 'summary' => '专辑模块,适用于精品内容展示', //开发者 'developer' => '嘉兴想天信息科技有限公司', //开发者网站 'website' => 'http://www.ourstu.com', //前台入口,可用U函数 'entry' => 'Issue/index/index', //后台入口 'admin_entry' => 'Admin/Issue/contents', //zui中的icon-xxx的小图标,此处为icon-th 'icon' => 'th', //是否允许卸载,核心模块请设为0 'can_uninstall' => 1 );
上面代码定义了专辑模块的模块信息,显示在模块管理中的内容为
可以点击安装按钮执行安装。
安装的过程就是导入/Info/install.sql这个数据表。
安装成功后,左侧模块列表中会多出一个模块。图标就是info.php中的th。链接地址就是Admin/Issue/contents
卸载模块
同时可以通过卸载按钮卸载文件。
卸载模块其实就是执行了uninstall.sql这个操作。
2.模块的开发
OC中多模块的开发实际上和普通的TP模块开发是一致的。这边主要介绍一下OC中的一些机制,这些机制会大大降低开发成本。
模块管理后台的开发
管理后台的开发涉及到几个知识点:
1.管理后台文件的约定
一般来说,我们要求模块的后台文件放置在Issue/Controller/IssueController.class.php这个位置。而不是放置在Admin模块下。
同时命名空间必须是Admin\Controller
有一点要注意的是,虽然我们放置在Issue模块下,但是执行这些代码还是在Admin模块中,这一点是通过映射这个文件实现的。所以大家可以完全等同于把这个文件放到了Admin下。
<?php namespace Admin\Controller; use Admin\Builder\AdminConfigBuilder; use Admin\Builder\AdminListBuilder; use Admin\Builder\AdminTreeListBuilder; class IssueController extends AdminController { protected $issueModel; function _initialize() { $this->issueModel = D('Issue/Issue'); parent::_initialize(); } public function config() { $admin_config = new AdminConfigBuilder(); $data = $admin_config->handleConfig(); $admin_config->title('专辑基本设置') ->keyBool('NEED_VERIFY', '投稿是否需要审核','默认无需审核') ->buttonSubmit('', '保存')->data($data); $admin_config->display(); } public function issue() { //显示页面 $builder = new AdminTreeListBuilder(); $attr['class'] = 'btn ajax-post'; $attr['target-form'] = 'ids'; $attr1 = $attr; $attr1['url'] = $builder->addUrlParam(U('setWeiboTop'), array('top' => 1)); $attr0 = $attr; $attr0['url'] = $builder->addUrlParam(U('setWeiboTop'), array('top' => 0)); $tree = D('Issue/Issue')->getTree(0, 'id,title,sort,pid,status'); $builder->title('专辑管理') ->buttonNew(U('Issue/add')) ->data($tree) ->display(); } }
2.管理后台菜单的创建
模块在被安装之后,会自动在左侧菜单创建一个入口(要求模块的配置信息中admin_entry不为空) ,这个入口是不需要菜单机制配合的。系统会自动添加。
但是,开发者在开发后台管理界面的时候往往需要用到侧栏菜单,这就需要开发者手动创建一些菜单来实现这个功能。为了兼容原生的菜单机制,我们采用了如下的变通方法来实现侧栏菜单。
1.针对某个模块创建一个隐藏的顶级菜单项,一般命名为模块名称。如Issue里,我们先要创建一个如图所示的顶级菜单项(这一步必不可少)
创建菜单的入口为 用户-》权限(分组)-》菜单-》新增
图中链接是默认的一个地址,建议和模块的后台管理入口一致,是否隐藏设为是,如果不设为是,就会在顶部栏多出一个入口
2.创建顶级菜单项之后再创建二级菜单。
上述创建的菜单会在侧栏菜单产生这么一个菜单项
在菜单管理的过程中,我们有以下两点建议,也算是开发过程中的一些经验总结。
1.对于有表单的页面,强烈建议提交到当前页面,再用IS_POST去判断是表单提交还是普通的展示表单。
此建议好处在于可以少创建一个菜单来专门用于权限处理。不需要为展示表单和处理表单创建两个权限节点。
2.对于一些ajax操作,必须为相应ajax操作的action创建对应的隐藏节点来处理权限。
因为OC中,后台的权限默认是用菜单来实现绑定,所以一些隐藏的菜单项实际上就是一个权限节点的存在。
如果开发者不针对一些ajax请求访问的action去创建隐藏菜单的话,很容易出现给了某些管理员的列表页面的管理权限之后却没有操作的权限。