PHPCMS v9二次开发之模块开发

背景概述:
最近我想开发一款知识问题的小软件,关于用户操作的那块暂且不去深究。我本想自己用Yaf框架写一套后台管理系统。但是,发现需要准备的东西太多,导致个人没有精力去做。于是,就想到phpcms v9 系统。我可以通过开发自己的模块来实现自己想要的功能。而且还使用结合使用这套系统的权限、内容管理、以及各种系统功能。

一、模块开发流程:
为你的phpcms创建一个模块的一般开发流程是:
1、创建数据库和数据表;(没有数据库操作可略过) ;
2、创建模块目录 ;
3、创建模块控制器类;
4、创建模块类与模块函数;(如果只是简单的模块可以不必创建)
5、创建模板文件;
6、运行和调试。

二、创建模块:

phpcms v9框架中的模块,位于phpcms/modules目录中,每一个目录称这为一个模块。如果要创建一个模块,只要在phpcms/modules目录下创建文件夹并放入你的控制器类就可以了。

例如我要开发一个叫做question的模块,那么首先在phpcms/modules目录下创建文件夹,并将其命名为question.

question模块中通常包含:
classes文件夹:为模块类库包
functions文件夹:为模块函数库包
templates文件夹:为模块模板包,这里通常包含有权限控制的控制器模板,也就是后台模板。
install文件夹:安装这个模块时的一些SQL、模板、语言包、配置文件、模型加载的东西在这里。
uninstall文件夹:顾名思义是卸载这个模块时的一些配置。

如果你的模板有单独的前台模板,你需要在phpcms/templates/default下创建一个你的模块目录来放置前台模板,default为你的风格包名称,我们默认适用default.

====================一些初始化工作 start ===========================
1、配置模块介绍:

在管理后台–》模块–》模块管理 找到我们创建的模块question,但是,是没介绍的,我们来配置一下:

@打开question/install/config.inc.php脚本文件,里面可以配置作者,作者网站,以及作者邮箱等信息。我的配置如下:

  1. <?php
  2. defined(‘IN_PHPCMS’or exit(‘Access Denied’);
  3. defined(‘INSTALL’or exit(‘Access Denied’);
  4. $module = ‘link’;
  5. $modulename = ‘问答游戏’;
  6. $introduce = ‘问答游戏模块’;
  7. $author = ‘寒冰’;
  8. $authorsite = ‘http://www.phpcxz.cn’;
  9. $authoremail = ‘qljs888@163.com’;
  10. ?>

2、配置安装时需要加载的模型:

我们创建模块的时候,肯定是希望能创建一些表来做一些特殊的需求。那么,你得告诉phpcms系统你有哪些表,SQL文件放在哪里。那么,我们就需要通过按照phpcms规则来告诉phpcms系统:

@打开question/install/model.php脚本文件,我的脚本代码如下:

  1. <?php
  2. defined(‘IN_PHPCMS’or exit(‘Access Denied’);
  3. defined(‘INSTALL’or exit(‘Access Denied’);
  4. return array(‘question’‘question_category’‘prop’‘medal’‘reward’‘user_prop’‘user_medal’‘online’);
  5. ?>

返回的数组里面就是表的名称(或模型的名称)。当然,这个名称是去掉前缀的。在PHPCMS系统中,只要把表前缀设置为phpcms_则会自动替换。

3、创建模型文件:

我们通过上面的model.php告诉了phpcms系统模型有哪些,但是,这些文件是否存在,它会去phpcms/model目录中去寻找。所以,我们要按照与表一一对应的方法创建模型。我举一个例子:

在phpcms/model目录中创建question表的model.

@脚本名称为:question_model.class.php,代码如下:

  1. <?php
  2. defined(‘IN_PHPCMS’or exit(‘No permission resources.’);
  3. pc_base::load_sys_class(‘model’, 0);
  4. class question_model extends model {
  5.     public function __construct() {
  6.         $this->db_config = pc_base::load_config(‘database’);
  7.         $this->db_setting = ‘default’;
  8.         $this->table_name = ‘question’;
  9.         parent::__construct();
  10.     }
  11. }
  12. ?>

代码中的question_model要与脚本名称对应起来,否则是错误的。

4、创建SQL文件:

SQL文件必须放在question/install文件夹下面,名称必须与model.php脚本数组中注明的一样。如,question模型对应的表为:

@创建一个SQL文件:question.sql,请注意一个模型对应一个SQL文件,请不要试图将多个表放在同一个sql文件中。

  1. # 题库表
  2. DROP TABLE IF EXISTS `phpcms_question`;
  3. CREATE TABLE `phpcms_question` (
  4. w_id INT(10) UNSIGNED AUTO_INCREMENT COMMENT ‘题目ID’,
  5. w_catid SMALLINT(5) UNSIGNED COMMENT ‘题库分类ID,phpcms_qestype.w_id’,
  6. w_title VARCHAR(255) NOT NULL COMMENT ‘题目’,
  7. w_a VARCHAR(255) NOT NULL COMMENT ‘A选项’,
  8. w_b VARCHAR(255) NOT NULL COMMENT ‘B选项’,
  9. w_c VARCHAR(255) NOT NULL COMMENT ‘C选项’,
  10. w_d VARCHAR(255) NOT NULL COMMENT ‘D选项’,
  11. w_answer TINYINT(1) NOT NULL COMMENT ‘正确答案:1:A、2:B、3:C、4:D’,
  12. w_parse VARCHAR(255) NOT NULL DEFAULT  COMMENT ‘题库解析’,
  13. PRIMARY KEY (w_id)
  14. )ENGINE = MyISAM DEFAULT CHARSET utf8 COMMENT ‘题库表’;

大家会发现,我的表名是phpcms_question,而不是question,或者其他前缀的表名。这是phpcms规定的。必须是phpcms_开头。

在question中还有一个文件夹:languages。

这个文件夹是专门用来放置语言包的。比如,我们要创建一个中文的语言包,那么在里面创建一个zh-cn文件夹即可。然后在这个文件夹里面创建一个与模块名称对应的PHP脚本文件:question.lang.php。

到时候这个文件会被自动加载,就可以使用里面配置的语言值了。

细心的人一定发现在question/install/templates文件夹,这个文件夹是用来给前台页面调用的模板。至于谁来调用?那当然是当前模块的index.php文件。这个脚本文件就在模块下面。
路径是:question/index.php.这个脚本就是传说中的控制器。关于控制器,我就不想多说了。一说全是口水。。。

既然有前台的控制器文件,那一般来说会有后台控制器。通过在后台操作,然后在前台显示。模块的工作方式差不多就是这样的。后台的控制脚本文件的名称:模块名称.php.

那么根据此命名规则,后台的控制器脚本文件是:question/question.php.

5、配置属于模块的函数:

根据模块自身的不同,肯定需要一些特殊的、定制的、属于自己的函数来支撑模块的功能。一般我们都把此类函数定义在:
question/functions/global.func.php

关于定义函数我相信你肯定不需要我balabala…..

6、配置模块管理后台菜单:

我们模块有了,那得在后台能看到操作该模块的相应的菜单吧。比如,我们要示例中的题目中增加题目表吧。

@打开:question/install/extention.inc.php脚本文件。
当前以上的5点都是以link模块(友情链接)作为母本进行的对照开发。

那么你将看到以下内容:

  1. <?php
  2. defined(‘IN_PHPCMS’or exit(‘Access Denied’);
  3. defined(‘INSTALL’or exit(‘Access Denied’);
  4. $parentid = $menu_db->insert(array(‘name’=>‘question’‘parentid’=>29, ‘m’=>‘link’‘c’=>‘link’‘a’=>‘init’‘data’=>‘listorder’=>0, ‘display’=>‘1’), true);
  5. $menu_db->insert(array(‘name’=>‘add_link’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘add’‘data’=>‘listorder’=>0, ‘display’=>‘0’));
  6. $menu_db->insert(array(‘name’=>‘edit_link’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘edit’‘data’=>‘listorder’=>0, ‘display’=>‘0’));
  7. $menu_db->insert(array(‘name’=>‘delete_link’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘delete’‘data’=>‘listorder’=>0, ‘display’=>‘0’));
  8. $menu_db->insert(array(‘name’=>‘link_setting’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘setting’‘data’=>‘listorder’=>0, ‘display’=>‘1’));
  9. $menu_db->insert(array(‘name’=>‘add_type’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘add_type’‘data’=>‘listorder’=>0, ‘display’=>‘1’));
  10. $menu_db->insert(array(‘name’=>‘list_type’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘list_type’‘data’=>‘listorder’=>0, ‘display’=>‘1’));
  11. $menu_db->insert(array(‘name’=>‘check_register’‘parentid’=>$parentid‘m’=>‘link’‘c’=>‘link’‘a’=>‘check_register’‘data’=>‘listorder’=>0, ‘display’=>‘1’));
  12. $link_db = pc_base::load_model(‘link_model’);
  13. $link_db->insert(array(‘siteid’=>1,‘typeid’=>$typeid,‘linktype’=>‘1’,‘name’=>‘PHPCMS’,‘url’=>‘http://www.phpcms.cn’,‘logo’=>‘http://www.phpcms.cn/images/logo_88_31.gif’,‘passed’=>1,‘addtime’=>SYS_TIME));
  14. $link_db->insert(array(‘siteid’=>1,‘typeid’=>$typeid,‘linktype’=>‘1’,‘name’=>‘盛大在线’,‘url’=>‘http://www.sdo.com’,‘logo’=>‘http://www.snda.com/cn/logo/comp_logo_sdo.gif’,‘passed’=>1,‘addtime’=>SYS_TIME));
  15. $language = array(‘link’=>‘友情链接’‘add_link’=>‘添加友情链接’‘edit_link’=>‘编辑友情链接’‘delete_link’=>‘删除友情链接’‘link_setting’=>‘模块配置’‘add_type’=>‘添加类别’‘list_type’=>‘分类管理’‘check_register’=>‘审核申请’);
  16. ?>

以下代码是向phpcms_menu菜单表增加一条菜单:

$parentid = $menu_db->insert(array('name'=>'question', 'parentid'=>29, 'm'=>'link', 'c'=>'link', 'a'=>'init', 'data'=>'', 'listorder'=>0, 'display'=>'1'), true);

这里面有一个父ID为29,我只能告诉你,以后开发的模块都必须是29.这个29是管理后台–》模块管理 的ID。也就是说,我要让这个模块在这个模块管理里面显示出来。

严重注意:如果不想把菜单放到“模块管理”节点下面,比如,你想放到顶部,那么可以将其设置为0,除此之外还要设备其他的参数。不推荐初学这么搞。

后面的m=link,c=link,a=init,一看就知道是phpcms的标准MVC参数。m模块、c控制器、a操作。值得关注的是true,是插入之后返回其插入时的ID。

返回插入时的ID是方便我们在 question 下添加对应的子菜单。

当然这些参数去里面找,当然是去question/question.php后台控制器里面去找啦~~~

$language = array('link'=>'友情链接', 'add_link'=>'添加友情链接', 'edit_link'=>'编辑友情链接', 'delete_link'=>'删除友情链接', 'link_setting'=>'模块配置', 'add_type'=>'添加类别', 'list_type'=>'分类管理', 'check_register'=>'审核申请');

这个数组非常重要,在上面插入菜单的数据中,有一个name=”….”,这里的省略号在菜单显示的时候,会通过L函数来找这个名称对应的名称,这个名称就是$language数组配置的。

其次是插入菜单的时候,有一个字段是display字段,如果设置为0,则不显示出来,但是,依然受到权限的控制。

====================一些初始化工作 end ===========================

注意:
1、数据库模型类名称必须与文件名称相同;

2、$this->db_setting = ‘default’为数据库配置文件中配置数据库连接的名称。默认为default.一般情况下不需要修改。如果,当前网站会涉及多个库之间的操作,那么,这个位置可以指定为你想要操作的数据库配置。

3、$this->table_name = ‘test’为数据表的名称。

这样我们创建好了一个数据库模型类。在模块的控制器中使用:

$this->db = pc_base::load_model('question_model');

4、所有模型都继承了model类,此类定义了访问数据库以及获取数据的一些常规方法。此类文件在:
phpcms/libs/classes/model.class.php

文章链接:,本站部分内容来自互联网,如不慎侵害的您的权益,请告知,我们将尽快删除!

发表评论