PHPCMS系统为我们提供众多的模块,但是它不是能满足所有人的需求,所以我们要对PHPCMS进行二次开发,当然在这之前你已经对PHPCMS系统有了一定的了解。对PHPCMS系统的二次开发无非就是为PHPCMS添加新的模块,对于PHPCMS V9系统来说,模块分为前台模块和后台模块,比如我们要做一个医院网站,网站必然要提供在线预约的模块,但是PHPCMS系统并没有这样的模块,那就需要我们自己添加。对于前台我们需要为用户提供一个预约的功能模块,而后台需要为管理员提供一个处理预约的模块。好的下面以此为例,简单地为大家介绍一下 PHPCMS系统模块添加。
1)前台模块添加
打开phpcms/modules/目录,我们可以看到很多的目录,这里的每一个目录代表的就是一个模块,例如content模块、search模块等。由此我们就知道建立一个新的模块就是新建一个目录。好的,我们就新建一个目录,命名为qiantai。依照其他的模块我们在新建目录qiantai下在新建几个目录,目录结构如下:
|-phpcms
|-modules
|-qiantai //新建立的模块
|-classes //应用程序类文件,此模块中需要用到的类文件,当然其他的模块也可以调用这里的类文件。
|-functions //函数目录
|-templates //后台模板目录,因为我开发的是前台模块,这个目录基本上用不到
|-index.php //这就是我们所说的控制器
index.php中写入如下代码:
<?php defined('IN_PHPCMS') or exit('No permission resources.'); class index{ public function init(){ include template('yuyue','index');//这是PHPCMS系统的一个函数,是用来调用前台模板的,这里是调用你所选择的风格下yuyue目录下的index.html模板 } }
我们打开phpcms/templates/318php(前面课程我们自己建立的一套模板)/,在下面新建一个目录,以yuyue命名,然后再在yuyue目录下新建index.html文件,并写入一段测试代码。代码内容如“这是预约前台测试模板”。
然后输入网址:http://www.****.com/index.php?m=qiantai&c=index&a=init,查看结果,前台模板到此就做好了,当用户前台预约成功后,管理员需要在后台能够管理预约,那我们就必须在后台添加一个管理预约模块。
2)后台模块添加
后台模块的添加和前台类似,在phpcms/modules/下新建目录houtai,目录结构如下:
|-phpcms
|-modules
|-houtai //新建立的后台模块
|-classes //应用程序类文件,此模块中需要用到的类文件,当然其他的模块也可以调用这里的类文件。
|-functions //函数目录
|-templates //后台模板目录,这里需要用到这个目录了。
|-index.php //这就是我们所说的控制器
index.php中写入如下代码:
<?php defined('IN_PHPCMS') or exit('No permission resources.'); pc_base::load_app_class('admin','admin',0);//加载admin模块中的admin类文件 class index extends admin{//所有后台模块控制器都要继承admin类 public function __construct(){//构造方法,虽然这里是空代码,但是一定要写上,否则会提出“此模块未安装……”。 } public function init(){ include $this->admin_tpl('yuyue_list');//父类admin中的一个方法,功能是调用后台模板,这里就是调用上面所说的后台模板目录下的yuyue_list.tpl.php模板文件。 } }
我打开phpcms/modules/houtai/templates/目录,新建一个模板文件yuyue_list.tpl.php(必须以.tpl.php结尾命名),写入测试代码如“这是后台预约列表模板”。
到此这个后台模块就写完了,输入网址:http://www.****.com/index.php?m=houtai&c=index& amp;a=init查看结果。有人就说了,我访问后台这样访问网址太麻烦,我们怎么才能从后台点击过去的呢?简单啊,我们可以在后台的扩展 》菜单管理中添加菜单就可以了。假如我新建一个预约管理的一级菜单,这个菜单就显示在与内容、扩展等同级的导航上,有了一级菜单我们必须在这个菜单下建立一个二级菜单,也就是页面左侧菜单中的一级菜单,有点乱是吧,自己试一下就知道怎么回事了,一级二级菜单建立好了,然后是建立三级菜单,这才是真正调用咱们后台这个模块的菜单。添加三级菜单如图:
文件名:就是控制器名,这里是index。再添加一级二级菜单时没有必要纠结方法名,随便写就可以了,以为他们不连接网址,只执行js。建立好以后我看一下效果图:
PHPCMS V9的二次开发就是这些东西,具体就是自己写代码去实现了。做phpcms-v9二次开发时,我们经常需要用到如下代码,所以有必须在这里注释说明一下。
defined('IN_PHPCMS') or exit('No permission resources.'); //第一步:获取模型缓存路径 define('CACHE_MODEL_PATH',CACHE_PATH.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR); pc_base::load_app_func('util','content'); class index { private $db; function __construct() { //第二步:获取与数据库相关的配置信息,如:数据表前缀、数据库名、数据库用户名、数据库密码、数据库编码、数据库类型 $this->db = pc_base::load_model('content_model'); $this->_userid = param::get_cookie('_userid'); $this->_username = param::get_cookie('_username'); $this->_groupid = param::get_cookie('_groupid'); } //首页 public function init() { if(isset($_GET['siteid'])) { $siteid = intval($_GET['siteid']); } else { $siteid = 1;//模型情况下siteid为1 } $siteid = $GLOBALS['siteid'] = max($siteid,1); define('SITEID', $siteid); $_userid = $this->_userid; $_username = $this->_username; $_groupid = $this->_groupid; //SEO $SEO = seo($siteid); $sitelist = getcache('sitelist','commons'); $default_style = $sitelist[$siteid]['default_style']; $CATEGORYS = getcache('category_content_'.$siteid,'commons'); include template('content','index',$default_style); } //内容页 public function show() { $catid = intval($_GET['catid']); $id = intval($_GET['id']); if(!$catid || !$id) showmessage(L('information_does_not_exist'),'blank'); $_userid = $this->_userid; $_username = $this->_username; $_groupid = $this->_groupid; $page = intval($_GET['page']); $page = max($page,1); $siteids = getcache('category_content','commons');//获取各栏目所对应的站点id $siteid = $siteids[$catid];//获取当前栏目所对应的站点id $CATEGORYS = getcache('category_content_'.$siteid,'commons');//获取当前站点下所有栏目的配置信息 if(!isset($CATEGORYS[$catid]) || $CATEGORYS[$catid]['type']!=0) showmessage(L('information_does_not_exist'),'blank'); $this->category = $CAT = $CATEGORYS[$catid];//获取当前站点下当前栏目的配置信息 $this->category_setting = $CAT['setting'] = string2array($this->category['setting']); $siteid = $GLOBALS['siteid'] = $CAT['siteid'];//获取当前站点下当前栏目所对应的站点id值 $MODEL = getcache('model','commons');//获取各个模型的配置信息 $modelid = $CAT['modelid'];//获取当前站点下当前栏目所属的模型id,找到了模型,也就找到了要查询的模型表(数据表) //设置模型表:通过缓存文件获取modelid,然后再通过模型modelid获取对应的模型表及对应的模型附表 $tablename = $this->db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename']; //设置模型附表 $r = $this->db->get_one(array('id'=>$id)); if(!$r || $r['status'] != 99) showmessage(L('info_does_not_exists'),'blank'); //下面代码获取的是当前模型附表中数据 $this->db->table_name = $tablename.'_data'; //下面代码获取的是当前模型附表中数据 $r2 = $this->db->get_one(array('id'=>$id)); //将模型表数据和模型附表中数据合并在一起 $rs = $r2 ? array_merge($r,$r2) : $r; //再次重新赋值,以数据库为准 $catid = $CATEGORYS[$r['catid']]['catid']; $modelid = $CATEGORYS[$catid]['modelid']; require_once CACHE_MODEL_PATH.'content_output.class.php'; $content_output = new content_output($modelid,$catid,$CATEGORYS); //将查询出来的数据经模型处理函数处理后放入$data数据中 $data = $content_output->get($rs); //注意:这行代码非常之重要,主要用来将数组中各个元素转化为变量,数据元素的键名为变量名,数据元素的值为变量值 extract($data);