PHPCMS V9 二次开发全面教程
第一部分:准备工作与环境搭建
在开始之前,请确保你已经具备以下条件:

-
基础技能:
- 熟悉 HTML 和 CSS。
- 掌握 PHP 基础语法。
- 了解 MySQL 数据库基本操作。
- 了解基本的 MVC(模型-视图-控制器)设计模式概念(PHPCMS V9 遵循此模式)。
-
开发环境:
- Web 服务器:Apache 或 Nginx。
- PHP 环境:建议使用 PHP 5.3 - 7.x 版本(PHPCMS V9 对新版 PHP 兼容性可能不佳)。
- 数据库:MySQL 5.0+。
- 本地开发工具:集成环境包如
phpStudy、XAMPP或WampServer可以一键搭建环境。
-
代码编辑器:
推荐使用 VS Code、Sublime Text 或 PhpStorm 等支持 PHP 语法高亮和代码提示的编辑器。
-
获取 PHPCMS V9:
- 官方网站:
https://www.phpcms.cn/(下载最新稳定版) - 将下载的压缩包解压到你的 Web 服务器根目录(如
phpstudy/WWW/),并访问域名进行安装。
- 官方网站:
第二部分:PHPCMS V9 核心架构解析
理解其核心架构是二次开发的关键,PHPCMS V9 主要由三部分组成:MVC、 和 模块。
MVC 模式
- M (Model - 模型):负责数据处理,通常指
phpcms/model/目录下的 PHP 文件,用于与数据库进行交互(增删改查)。 - V (View - 视图):负责数据显示,即我们看到的 HTML 模板文件,位于
phpcms/templates/目录下。 - C (Controller - 控制器):负责业务逻辑,接收用户请求,调用模型处理数据,并加载视图显示结果,控制器位于
phpcms/modules/模块目录下的php文件中。
数据流向:用户请求 -> 控制器 -> 模型 -> 数据库 -> 模型 -> 控制器 -> 视图 -> 用户。
模块
一个模块就是一个独立的功能单元,内容”、“会员”、“广告”等,每个模块都有自己的 MVC 结构。
- 位置:
phpcms/modules/ - 结构:
模块名/(content/)模块名/模块名.php(控制器入口文件)模块名/classes/(模型类目录)模块名/fields/(字段类型处理类目录)模块名/templates/(模板文件目录)模块名/install/(模块安装脚本目录)
这是 PHPCMS V9 的精髓,也是其区别于其他 CMS 的最大特点,标签是一种可以在模板中直接调用后台数据和功能的简短代码。
- 作用:让前端模板开发者无需编写 PHP 代码,就能动态获取并显示数据。
- 格式:
{pc:get ...}或{loop $data $r}...{/loop} - 原理:模板引擎在解析标签时,会自动调用对应的 PHP 控制器和模型,获取数据并循环输出。
第三部分:实战案例一:创建一个简单的“产品展示”模块
我们将创建一个名为 product 的新模块,用于展示产品列表。
步骤 1:创建数据库表
我们需要在数据库中创建一个存储产品信息的表。
CREATE TABLE `phpcms_product` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, varchar(100) NOT NULL COMMENT '产品标题', `description` varchar(255) NOT NULL COMMENT '产品描述', `content` text NOT NULL COMMENT '产品详情', `inputtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '发布时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1为正常,0为回收站', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
步骤 2:创建模型
模型用于操作我们刚刚创建的数据库表。
- 在
phpcms/model/目录下创建文件product_model.class.php。 - 编写模型代码:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('model', 'content', 0);
class product_model extends model {
public function __construct() {
// 数据库表名,前缀 'v9_' 是默认的,如果你的前缀不是,请修改
$this->db_config = pc_base::load_config('database');
$this->db_setting = 'default';
$this->table_name = 'product';
parent::__construct();
}
}
?>
步骤 3:创建控制器
控制器处理业务逻辑,比如显示产品列表。
- 在
phpcms/modules/目录下创建文件夹product。 - 在
product文件夹下创建文件product.php。
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_func('global', 'content');
class product {
// 首页方法,用于显示产品列表
public function init() {
// 加载产品模型
$product_model = pc_base::load_model('product_model');
// 查询产品数据,按发布时间倒序排列
$data = $product_model->select("`status`=1", '*', 'id DESC');
// 将数据传递给模板
// 第一个参数是模板变量名,第二个参数是要传递的数据
// 这里我们直接将数据赋值给一个模板变量 $product_list
include template('product', 'index'); // 加载模板文件
}
}
?>
步骤 4:创建模板
模板用于展示数据。
- 在
phpcms/templates/目录下创建文件夹product。 - 在
product文件夹下创建文件index.html。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">产品列表</title>
</head>
<body>
<h1>我们的产品</h1>
<ul>
{loop $product_list $r}
<li>
<h2><a href="javascript:;">{$r['title']}</a></h2>
<p>{$r['description']}</p>
<small>发布时间:{date('Y-m-d H:i:s', $r['inputtime'])}</small>
</li>
{/loop}
</ul>
</body>
</html>
步骤 5:访问模块
你可以通过以下 URL 访问你的新模块了:
http://你的域名/index.php?m=product&c=product&a=init
m=product: 指定模块名为product。c=product: 指定控制器为product(在 PHPCMS 中,控制器文件名通常和模块名相同)。a=init: 指定要执行控制器中的init方法。
如果一切正常,你应该能看到一个空的产品列表页面,你需要去后台手动添加一些产品数据,页面就会显示了。
第四部分:实战案例二:使用标签在首页调用产品
很多时候,我们不需要新建页面,而是想在现有的首页(如 phpcms/templates/content/index.html)上调用其他模块的数据。
步骤 1:修改首页模板
打开 phpcms/templates/content/index.html,在你想显示产品列表的位置,添加以下标签代码:
<div class="product-list">
<h2>最新产品</h2>
{pc:get sql="SELECT * FROM `phpcms_product` WHERE `status`=1 ORDER BY `id` DESC" num="5" cache="3600"}
<ul>
{loop $data $r}
<li>
<a href="#">{$r['title']}</a>
<span>{date('Y-m-d', $r['inputtime'])}</span>
</li>
{/loop}
</ul>
{/pc}
</div>
标签代码解析
{pc:get ...}: 获取数据的标签。sql: 直接编写 SQL 语句。注意:表名要带前缀(如v9_product),这里为了方便,我假设前缀是phpcms_,请根据你的实际情况修改。num: 获取的数据条数,这里是 5 条。cache: 缓存时间,单位为秒,设置为3600表示缓存 1 小时,可以减轻数据库压力。
{loop $data $r}: 循环输出获取到的数据。$data: 是{pc:get}标签默认返回的数据数组。$r: 是循环中的每一个元素,即每一条产品记录。
{$r['title']}: 输出产品标题。
保存模板后,刷新首页,你应该就能看到从 product 模块中调用的产品数据了。
第五部分:进阶技巧与常见问题
如何调用模块的公共方法?
如果你的控制器方法不是 init,而是 mylist,访问 URL 就需要修改为 ...&a=mylist。
如果想在标签中调用,可以使用 model 参数:
{pc:get model="product" method="mylist" num="5" cache="3600"}
{loop $data $r}
{$r.title}
{/loop}
{/pc}
这会自动调用 product_model 类中的 mylist() 方法,并将 num 等参数传递过去。
如何处理表单提交(如添加产品)?
-
创建表单模板 (
product/templates/add.html):<form action="{APP_PATH}index.php?m=product&c=product&a=add" method="post"> 标题:<input type="text" name="title"><br> 描述:<input type="text" name="description"><br> 内容:<textarea name="content"></textarea><br> <input type="submit" value="提交"> </form> -
在控制器中添加
add方法 (product/product.php):public function add() { if (isset($_POST['title'])) { $product_model = pc_base::load_model('product_model'); $data['title'] = $_POST['title']; $data['description'] = $_POST['description']; $data['content'] = $_POST['content']; $data['inputtime'] = TIME; // 当前时间戳 $data['status'] = 1; $product_model->insert($data); showmessage('添加成功!', 'index.php?m=product&c=product&a=init'); } else { include template('product', 'add'); } }
常见问题
-
Q: 为什么我的标签没有数据?
- A:
- 检查 SQL 语句是否正确,表名前缀是否对。
- 检查缓存问题,在后台清空缓存再试。
- 检查数据表中是否有符合条件的数据(如
status=1)。 - 检查模型文件是否创建正确,类名和文件名是否对应。
- A:
-
Q: 如何修改后台菜单或添加新的管理功能?
- A: 后台菜单的配置通常在
phpcms/modules/admin/templates/目录下的某些文件中,或者直接在数据库的v9_admin_menu表里修改,要添加完整的管理功能(如产品列表、添加、编辑、删除),你需要创建一个admin控制器,并遵循 PHPCMS 的后台开发规范,这比前台开发更复杂,需要参考官方模块的结构。
- A: 后台菜单的配置通常在
-
Q: PHPCMS V9 和 PHPCMS 有什么关系?
- A: PHPCMS V9 是 PHPCMS 家族中一个非常经典的版本,基于自主研发的 PHP 框架,后续的 PHPCMS (有时被称为 PHPCMS 10) 已经转向了基于 ThinkPHP 框架,两者在架构和开发方式上有很大不同,市面上绝大多数教程和二次开发都是针对 PHPCMS V9 的。
第六部分:学习资源
- 官方文档:虽然可能不完整,但始终是第一手资料。
- 开源社区/论坛:
https://bbs.phpcms.cn/(官方社区,虽然活跃度可能下降,但仍有大量历史帖子)。 - 代码仓库:可以在
Gitee或GitHub上搜索PHPCMS V9,找到许多开源的二次开发案例和模块,通过阅读源码是学习的最佳途径。 - 第三方教程:搜索“PHPCMS V9 教程”,可以找到很多博客和视频教程,但请注意甄别信息的时效性。
希望这份详细的教程能帮助你顺利入门 PHPCMS V9 的二次开发世界!祝你编码愉快!
