嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2014-05-30 4234 次浏览 标签 : PHPCMS

不太习惯自动化生成的东西,毕竟需求是多样化的,还是希望能够自己写,但是有时候别人的就是要用PHPCMS做后台,没办法。

整个模块代码我上传,最简单的一个模块demo: https://github.com/zhoumengkang/notes/tree/master/phpcms-modules-demo

下面是复制系统自带的公告模块摸索的笔记。

|--install

    |--config.inc.php           //phpcms会自动调用里面的内容,作为该模块的信息描述

    |--orders.sql                   //该模块中需要用到的数据库

    |--module.sql                //该模块插入到module表里面的一条SQL

    |--model.php                //通过该文件找到order.sql并执行里面的SQL

    |--extention.inc.php    //是该模块在后台的操作菜单,至少得有增删改查的对应栏目

    |--languages                //如果不是多语言开发,这个就是删掉了.

    |--templates                 //里面存放的文件是前台模板文件

下面是我根据公告修改的,因为我的需求也仅仅是处理前台游客提交的一个表单。

config.inc.php略。

orders.sql代码:

---
---实际我的表单的前缀是`v9`,但是下面的sql语句应该是`phpcms_orders`而非`v9_orders`,可能先作为字符串把里面的phpcms替换为了配置文件里面的前缀吧
---
DROP TABLE IF EXISTS `phpcms_orders`;
CREATE TABLE IF NOT EXISTS `phpcms_orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL COMMENT '姓名',
  `company` varchar(300) NOT NULL COMMENT '公司名字',
  `tel` varchar(20) NOT NULL COMMENT '手机/座机',
  `email` varchar(200) NOT NULL COMMENT '电子邮件',
  `requirement` text NOT NULL COMMENT '用户需求',
  `addtime` int(11) NOT NULL COMMENT '数据填写的时间',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否处理',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

model.php的代码:

<?php 
defined('IN_PHPCMS') or exit('Access Denied');
defined('INSTALL') or exit('Access Denied');

return array('orders');
?>

module.sql的代码:

INSERT INTO `phpcms_module` (`module`, `name`, `url`, `iscore`, `version`, `description`, `setting`, `listorder`, `disabled`, `installdate`, `updatedate`) VALUES ('orders', '订单管理', 'orders/', 0, '1.0', '订单管理', '', 0, 0, '2014-5-29', '2014-5-29');

下面编辑下extention.inc.php,这里面是菜单的数据,数据库操作部分是将数据插入到了表v9_menu里面,卸载的时候会自动删掉.

后面的$language是用于匹配数据库里插入的数据在后台菜单中显示的中文名称的一个数组,这个数组被追加到了phpcms/languages/zh-cn/system_menu.lang.php的末尾(注意保证该文件是可写的,否则无法追加,而只能显示数据库里插入的英文),追加的记录,卸载的时候不会清除.

<?php
defined('IN_PHPCMS') or exit('Access Denied');
defined('INSTALL') or exit('Access Denied');
//下面的主菜单的parentid是29,是因为模块的id是29
$parentid = $menu_db->insert(array('name'=>'orders', 'parentid'=>29, 'm'=>'orders', 'c'=>'orders', 'a'=>'init', 'data'=>'s=1', 'listorder'=>0, 'display'=>'1'), true);
$menu_db->insert(array('name'=>'edit_orders', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'edit', 'data'=>'s=1', 'listorder'=>0, 'display'=>'1'));
$menu_db->insert(array('name'=>'check_orders', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'init', 'data'=>'s=2', 'listorder'=>0, 'display'=>'1'));
$menu_db->insert(array('name'=>'del_orders', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'delete', 'data'=>'', 'listorder'=>0, 'display'=>'1'));
//这个数组被追加到了phpcms/languages/zh-cn/system_menu.lang.php的末尾
$language = array('orders'=>'订单管理','edit_orders'=>'审核订单','check_orders'=>'审核订单','del_orders'=>'删除订单');
?>

下面我对这个文件重新修改了下,就是想让其直接在主导航显示,而非在模块下面,当然也可以安装完以后再到扩展->菜单管理里面去手动添加.

2014.6.17补充一点:修改 extention.inc.php ,该模块里面会直接触发调用的控制器(增删改查),不管是否会以菜单的形式显示,都应该应该添加到菜单表,因为在对非 admin 用户授权的时候需要找到对应的“m”,"c","a"。否则无法授权操作。授权操作读取的菜单表(v9_menu)里面的m,c,a,然后和授权用户的id,一起插入到v9_admin_role_priv这张表里面,作为权限控制。

<?php
defined('IN_PHPCMS') or exit('Access Denied');
defined('INSTALL') or exit('Access Denied');

$parentid = $menu_db->insert(array('name'=>'orders', 'parentid'=>0, 'm'=>'orders', 'c'=>'orders', 'a'=>'init', 'data'=>'', 'listorder'=>10, 'display'=>'1'), true);
$parentid = $menu_db->insert(array('name'=>'orders', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'init', 'data'=>'', 'listorder'=>0, 'display'=>'1'), true);
$menu_db->insert(array('name'=>'list_orders', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'init', 'data'=>'', 'listorder'=>0, 'display'=>'1'));
$menu_db->insert(array('name'=>'list_views', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'view', 'data'=>'', 'listorder'=>0, 'display'=>'1'));
$menu_db->insert(array('name'=>'list_check', 'parentid'=>$parentid, 'm'=>'orders', 'c'=>'orders', 'a'=>'check', 'data'=>'', 'listorder'=>0, 'display'=>'1'));
$language = array('orders'=>'订单管理','list_orders'=>'订单列表','list_views'=>'订单浏览','list_check'=>'订单处理');
?>

安装的时候会进行数据模型检测,在phpcms/model/里面新建一个orders_model.class.php文件,参考announce_model.class.php.代码如下:

<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('model', '', 0);
//修改这个类名为"order_model"
class orders_model extends model {

    public $table_name;
    public function __construct() {
        $this->db_config = pc_base::load_config('database');
        $this->db_setting = 'default';
        $this->table_name = 'orders';//仅仅需要修改这里的对应的表名,不带前缀
        parent::__construct();
    }
}
?>

编写语言包

如果存在语言包,以中文为例,安装的过程中会把phpcms/modules/orders/install/languages/zh-cn/orders.lang.php复制到phpcms/languages/zh-cn/orders.lang.php.

这个文件是多语言开发的时候模板文件中读取的变量存储用的.比如后台模板里面的echo L('startdate')就是读取的phpcms/languages/zh-cn/orders.lang.php里面的$LANG['startdate'].

如果你的模块不用于多语言的话,这一步可以省略.

添加前台模板

在安装的过程中,系统会把phpcms/modules/orders/install/templates/show.html自动复制一份保存到phpcms/templates/default/orders/show.html,这样前台控制器调用该模板.这里先保存一个文件即可,后期可以再修改.

如果前台不需要模板,这一步可以省略.

到此就可以在后台通过"模块>模块管理"进行安装了.

安装完以后,MVC大体结构如下

|--phpcms
	|--modules
		|--orders
			|--templates			//该模块的后台模板文件存放目录
				|--orders_list.tpl.php
				|--orders_view.tpl.php
			|--index.php 			//该模块的前台控制器
			|--orders.php 			//该模块的后台控制器
	|--templates
		|--default
			|--orders 			//该模块的前台模板文件存放目录
				|--show.html 
	|--model
		|--orders_model.class.php 	        //该模块对应的模型

前后台控制器如何写,就不再赘述了,具体请看文章最开始给的那个链接地址查看.

安装完了,如何卸载呢?还是在"模块>模块管理"里面进行卸载,卸载需要配置的文件和安装配置的文件类似,配置model.phporders.sql这两个文件即可.

model.php:

<?php 
defined('IN_PHPCMS') or exit('Access Denied');
defined('UNINSTALL') or exit('Access Denied');

return array('orders');
?>

orders.sql:

DROP TABLE IF EXISTS `phpcms_orders`;

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表

回复 letxxt 2017-03-16 15:15:03
问题解决,谢谢