本教程将从基础概念讲起,逐步深入到实际开发案例,旨在帮助你快速掌握 PHPCMS V9 的二次开发技能。

目录
-
第一部分:准备工作与环境搭建
- 1 理解 PHPCMS V9 的核心思想
- 2 环境要求
- 3 安装与配置
- 4 开发工具推荐
-
第二部分:核心架构与文件结构
- 1 MVC 设计模式详解
- 2 核心目录结构解析
- 3 URL 访问规则
-
第三部分:数据库操作
- 1 数据库表设计规范
- 2 使用
db_helper.php进行增删改查 - 3 使用模型 进行数据操作
-
第四部分:模板开发
(图片来源网络,侵删)- 1 模板引擎介绍
- 2 常用模板标签
- 3 模板继承与布局
- 4 循环、判断与变量输出
-
第五部分:模块开发实战
- 1 开发一个简单的“产品展示”模块
- 2 创建数据库表
- 3 创建控制器
- 4 创建模型
- 5 创建模板文件
- 6 在后台添加菜单并访问
-
第六部分:常用 API 与函数库
- 1 核心函数库 (
phpcms/functions/global.func.php) - 2 URL 生成函数
- 3 分页函数
- 4 上传类使用
- 1 核心函数库 (
-
第七部分:高级主题与最佳实践
- 1 URL 静态化
- 2 缓存机制
- 3 安全性考虑
- 4 常见问题与调试技巧
第一部分:准备工作与环境搭建
1 理解 PHPCMS V9 的核心思想
PHPCMS V9 的核心是 MVC 模式:

- M (Model - 模型):负责与数据库交互,处理数据逻辑,通常对应
phpcms/model/目录下的文件。 - V (View - 视图):负责数据显示,即我们看到的 HTML 页面,通常对应
phpcms/modules/模块名/templates/目录下的模板文件。 - C (Controller - 控制器):接收用户请求,调用模型和视图,是整个流程的调度中心,通常对应
phpcms/modules/模块名/目录下的 PHP 文件。
这种结构将业务逻辑、数据和显示分离,使代码更易于维护和扩展。
2 环境要求
- Web 服务器:Nginx (推荐) 或 Apache
- 数据库:MySQL 5.0+
- PHP:PHP 5.3+ (推荐 PHP 5.4 - 5.6,更高版本可能需要调整)
- 操作系统:Linux/Windows
3 安装与配置
- 下载程序:从 PHPCMS 官网或 GitHub 下载最新稳定版。
- 上传文件:将下载的压缩包解压,通过 FTP 或 SSH 将
phpcms目录下的所有文件上传到你的网站根目录(如/var/www/html/)。 - 设置权限:给以下目录和文件写入权限(通常是 755 或 777,生产环境建议 755):
caches/目录及其所有子目录phpcms/install/目录statics/目录(如果需要上传图片)
- 运行安装:在浏览器中访问
http://你的域名/install/,然后按照安装向导的提示操作,填写数据库信息等。 - 删除安装目录:安装成功后,务必删除
phpcms/install/目录,以防止安全风险。
4 开发工具推荐
- 代码编辑器:VS Code (强烈推荐,插件丰富)、Sublime Text、PhpStorm。
- FTP/SFTP 客户端:FileZilla、WinSCP。
- 浏览器开发者工具:用于调试 HTML、CSS、JavaScript。
第二部分:核心架构与文件结构
1 MVC 设计模式详解
- 请求流程:用户通过 URL 访问 -> 入口文件
index.php-> 路由系统解析 URL -> 加载对应的控制器和方法 -> 控制器调用模型获取数据 -> 控制器将数据传递给视图 -> 视图渲染 HTML -> 返回给用户。 - 示例 URL:
http://你的域名/index.php?m=content&c=index&a=show&catid=1&id=100m=content: 模块名为content(内容模块)c=index: 控制器名为indexa=show: 方法名为showcatid=1,id=100: 传递给方法的参数
2 核心目录结构解析
/phpcms/: 核心程序目录modules/: 模块目录,所有二次开发的模块都放在这里。content/(内容模块),admin/(后台管理模块)。模块名/: 每个模块的目录。模块名.php: 模块入口文件(可选)。classes/: 类库文件。templates/: 模板目录,存放该模块的所有模板文件。index.php: 默认控制器。
model/: 模型目录,存放所有数据模型文件,如content_model.php。libs/: 核心类库和函数库目录。languages/: 语言包目录。caches/: 缓存目录。statics/: 静态资源目录,如 CSS, JS, images。
/phpcms.php: 程序入口文件。/index.php: 网站前台入口文件。/admin.php: 网站后台入口文件。
3 URL 访问规则
PHPCMS V9 支持 URL 伪静态,可以通过后台设置,默认是动态 URL(如 ?m=...&c=...),伪静态后的 URL 更美观,也有利于 SEO。
第三部分:数据库操作
PHPCMS V9 提供了多种数据库操作方式,推荐使用模型。
1 数据库表设计规范
- 表名建议使用小写字母,并用下划线分隔,如
phpcms_product。 - 每个表都应该有一个自增的
id作为主键。 - 模型名通常与表名对应,如
product模型对应phpcms_product表。
2 使用 db_helper.php 进行增删改查(不推荐,但需了解)
这是一种面向过程的数据库操作方式,简单直接但不利于维护。
// 引入数据库帮助类
pc_base::load_sys_class('db_helper', 'libs/classes/', 0);
// 1. 查询
$sql = "SELECT * FROM `phpcms_product` WHERE `status` = 1";
$list = $db_helper->get_list($sql);
print_r($list);
// 2. 插入
$data = array( => '新产品',
'price' => 99.99,
'description' => '这是一个好产品',
'inputtime' => SYS_TIME // 系统当前时间戳
);
$r = $db_helper->insert('phpcms_product', $data);
if($r) {
echo "插入成功,ID: " . $db_helper->insert_id();
}
// 3. 更新
$update_data = array('price' => 199.99);
$r = $db_helper->update('phpcms_product', $update_data, array('id' => 1));
if($r) {
echo "更新成功";
}
// 4. 删除
$r = $db_helper->delete('phpcms_product', array('id' => 1));
if($r) {
echo "删除成功";
}
3 使用模型 进行数据操作(推荐)
这是面向对象的、更规范的方式。
-
创建模型文件:
/phpcms/model/product_model.php<?php defined('IN_PHPCMS') or exit('No permission resources.'); pc_base::load_sys_class('model', 'libs/classes/', 0); class product_model extends model { public function __construct() { // $table_name 是数据表的前缀,默认是 'phpcms_' // $this->table_name 是完整的表名,如 'phpcms_product' $this->db_config = pc_base::load_config('database'); $this->db_setting = 'default'; $this->table_name = 'product'; parent::__construct(); } } -
在控制器中使用模型
// 在控制器中 $product_model = pc_base::load_model('product_model'); // 1. 查询 // 查询所有 $list = $product_model->select(); // 条件查询 $item = $product_model->get_one(array('id' => 1)); // 排序、分页查询 $list = $product_model->select(array('status' => 1), '*', 'id DESC', 10, 0); // 10条/页,第0页 // 2. 插入 $data = array( 'title' => '新产品', 'price' => 99.99, 'description' => '这是一个好产品', 'inputtime' => SYS_TIME ); $id = $product_model->insert($data, true); // true 返回新插入的ID // 3. 更新 $update_data = array('price' => 199.99); $r = $product_model->update($update_data, array('id' => $id)); // 4. 删除 $r = $product_model->delete(array('id' => $id));
第四部分:模板开发
PHPCMS V9 使用自己的模板引擎,语法简单。
1 模板引擎介绍
模板文件存放在 phpcms/modules/模块名/templates/ 目录下,后缀为 .html。
2 常用模板标签
- 变量输出:
{$variable} - 循环:
{loop $list $k $v} <li>ID: {$v['id']}, 标题: {$v['title']}</li> {/loop} - 判断:
{if $score > 90} 优秀 {elseif $score > 60} 良好 {else} 不及格 {/if} - 函数调用:
{function_name($param1, $param2)} - 包含其他模板:
{template 'header', '模块名'}
3 模板继承与布局
- 定义区块:在基础模板(如
layout.html)中定义{block name='header'}...{/block}。 - 继承模板:在子模板中,使用
{extend layout="layout" module="模块名" /}来继承。 - 填充区块:在子模板中,使用
{block name='header'}我的头部内容{/block}来填充继承的区块。
4 循环、判断与变量输出
- 控制器中传递数据:
$this->assign('title', '产品列表'); $this->assign('list', $product_list); $this->display('list.html'); // 渲染 list.html 模板 - 模板中接收数据:
<h1>{$title}</h1> <ul> {loop $list $v} <li> <a href="{$v['url']}">{$v['title']}</a> <span>价格:¥{$v['price']}</span> </li> {/loop} </ul>
第五部分:模块开发实战
我们将开发一个名为 mymodule 的模块,用于展示产品列表。
1 创建数据库表
CREATE TABLE `phpcms_product` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, varchar(100) NOT NULL DEFAULT '' COMMENT '产品标题', `description` text COMMENT '产品描述', `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-上架,0-下架', `inputtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2 创建模型 (/phpcms/model/product_model.php)
参考 3 节的代码创建。
3 创建控制器 (/phpcms/modules/mymodule/index.php)
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('model', 'libs/classes/', 0);
class index {
private $product_model;
public function __construct() {
// 加载产品模型
$this->product_model = pc_base::load_model('product_model');
}
/**
* 显示产品列表
*/
public function init() {
// 1. 从模型获取数据
$list = $this->product_model->select(array('status' => 1), '*', 'id DESC');
// 2. 将数据分配给模板
// $this->assign('变量名', '值');
$this->assign('title', '我的产品列表');
$this->assign('list', $list);
// 3. 显示模板
// $this->display('模板文件名', '模块名');
$this->display('list.html');
}
}
4 创建模板文件 (/phpcms/modules/mymodule/templates/list.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">{$title}</title>
</head>
<body>
<h1>{$title}</h1>
<ul>
{loop $list $v}
<li>
<h2>{$v['title']}</h2>
<p>描述:{$v['description']}</p>
<p>价格:¥{$v['price']}</p>
<p>发布时间:{date('Y-m-d H:i:s', $v['inputtime'])}</p>
</li>
{/loop}
</ul>
</body>
</html>
5 在后台添加菜单并访问
- 登录后台:访问
http://你的域名/admin.php。 - 添加菜单:
- 进入 扩展 -> 模块管理 -> 模块列表。
- 点击 增加模块,填写信息:
- 模块名:
mymodule - 模块英文名:
MyModule - 模块目录:
mymodule(与代码目录名一致) - 菜单名称:
我的模块 - 绑定菜单:选择“是”。
- 菜单图标:选一个图标。
- 菜单级别:一级菜单。
- 菜单状态:显示。
- 模块名:
- 保存后,刷新缓存。
- 访问前台:现在你可以通过
http://你的域名/index.php?m=mymodule来访问你的产品列表页面了。
第六部分:常用 API 与函数库
1 核心函数库 (phpcms/functions/global.func.php)
这个文件包含了大量全局可用的函数,如:
date(): 格式化日期。str_cut(): 字符串截取。is_mobile(): 判断是否为手机访问。
2 URL 生成函数
url('模块名', '控制器', '方法', array('参数1'=>'值1', '参数2'=>'值2'))url('content', 'index', 'show', array('id' => 100))会生成类似/index.php?m=content&c=index&a=show&id=100的 URL。
go_url($url): 跳转到指定 URL。
3 分页函数
在控制器中获取分页数据:
$page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1;
pagesize = 10;
$offset = ($page - 1) * $pagesize;
// 在模型查询中添加 limit
$list = $model->select($where, '*', 'id DESC', $pagesize, $offset);
$total = $model->count($where); // 总记录数
$page_url = url('mymodule', 'index', 'init'); // 分页基准URL
// 在模板中调用分页
{if $pages}
<div class="page">{$pages}</div>
{/if}
PHPCMS 会自动在 $pages 变量中生成分页 HTML。
4 上传类使用
// 引入上传类
pc_base::load_sys_class('upload', 'libs/classes/', 0);
$upload = new upload('upfile', 'jpg|jpeg|gif|png'); // 'upfile' 是表单中 <input> 的 name
if ($upload->upload('file')) {
$file_info = $upload->get_upload_info();
// $file_info 是上传成功后的文件信息数组
// $file_info['filepath'] 是文件相对路径
// $file_info['filename'] 是文件名
} else {
// 获取错误信息
$error = $upload->get_error();
}
第七部分:高级主题与最佳实践
1 URL 静态化
在后台 扩展 -> URL规则 中可以设置,将动态 URL 转换为类似 /html/1/100.html 的静态 URL,这需要服务器配置 Rewrite 规则。
2 缓存机制
PHPCMS 有强大的缓存系统,可以缓存模板、数据等,极大提升网站性能。
cache_start(): 开始缓存。cache_get($cache_name): 获取缓存。cache_set($cache_name, $data, $timeout): 设置缓存。
3 安全性考虑
- 防止 SQL 注入:始终使用模型提供的参数化查询,不要直接拼接 SQL 语句。
- 防止 XSS 攻击:在输出用户提交的内容时,使用
htmlspecialchars()函数进行转义,PHPCMS 的{$v['field']}默认会进行转义。 - 文件上传安全:严格限制上传文件类型、大小,并对上传的文件进行重命名,避免覆盖系统文件。
4 常见问题与调试技巧
- 白屏:检查 PHP 错误日志,通常是致命错误导致。
- 模板不更新:检查
caches/目录权限,或者清空模板缓存。 - 变量未定义:检查控制器中是否正确
assign了变量,以及模板中变量名是否正确。 - 开启调试模式:在
phpcms/config.php中设置define('APP_DEBUG', true);可以看到详细的错误和调试信息。
PHPCMS V9 的二次开发核心在于理解其 MVC 架构,掌握好 模型 的数据操作和 模板 的渲染逻辑,你就可以在此基础上进行各种功能的扩展,多看官方文档,多分析现有模块的代码,是快速提升技能的最佳途径,祝你开发顺利!
