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

phpcms v9 二次开发教程
(图片来源网络,侵删)

目录

  1. 第一部分:准备工作与环境搭建

    • 1 理解 PHPCMS V9 的核心思想
    • 2 环境要求
    • 3 安装与配置
    • 4 开发工具推荐
  2. 第二部分:核心架构与文件结构

    • 1 MVC 设计模式详解
    • 2 核心目录结构解析
    • 3 URL 访问规则
  3. 第三部分:数据库操作

    • 1 数据库表设计规范
    • 2 使用 db_helper.php 进行增删改查
    • 3 使用模型 进行数据操作
  4. 第四部分:模板开发

    phpcms v9 二次开发教程
    (图片来源网络,侵删)
    • 1 模板引擎介绍
    • 2 常用模板标签
    • 3 模板继承与布局
    • 4 循环、判断与变量输出
  5. 第五部分:模块开发实战

    • 1 开发一个简单的“产品展示”模块
    • 2 创建数据库表
    • 3 创建控制器
    • 4 创建模型
    • 5 创建模板文件
    • 6 在后台添加菜单并访问
  6. 第六部分:常用 API 与函数库

    • 1 核心函数库 (phpcms/functions/global.func.php)
    • 2 URL 生成函数
    • 3 分页函数
    • 4 上传类使用
  7. 第七部分:高级主题与最佳实践

    • 1 URL 静态化
    • 2 缓存机制
    • 3 安全性考虑
    • 4 常见问题与调试技巧

第一部分:准备工作与环境搭建

1 理解 PHPCMS V9 的核心思想

PHPCMS V9 的核心是 MVC 模式:

phpcms v9 二次开发教程
(图片来源网络,侵删)
  • 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 安装与配置

  1. 下载程序:从 PHPCMS 官网或 GitHub 下载最新稳定版。
  2. 上传文件:将下载的压缩包解压,通过 FTP 或 SSH 将 phpcms 目录下的所有文件上传到你的网站根目录(如 /var/www/html/)。
  3. 设置权限:给以下目录和文件写入权限(通常是 755 或 777,生产环境建议 755):
    • caches/ 目录及其所有子目录
    • phpcms/install/ 目录
    • statics/ 目录(如果需要上传图片)
  4. 运行安装:在浏览器中访问 http://你的域名/install/,然后按照安装向导的提示操作,填写数据库信息等。
  5. 删除安装目录:安装成功后,务必删除 phpcms/install/ 目录,以防止安全风险。

4 开发工具推荐

  • 代码编辑器:VS Code (强烈推荐,插件丰富)、Sublime Text、PhpStorm。
  • FTP/SFTP 客户端:FileZilla、WinSCP。
  • 浏览器开发者工具:用于调试 HTML、CSS、JavaScript。

第二部分:核心架构与文件结构

1 MVC 设计模式详解

  • 请求流程:用户通过 URL 访问 -> 入口文件 index.php -> 路由系统解析 URL -> 加载对应的控制器和方法 -> 控制器调用模型获取数据 -> 控制器将数据传递给视图 -> 视图渲染 HTML -> 返回给用户。
  • 示例 URLhttp://你的域名/index.php?m=content&c=index&a=show&catid=1&id=100
    • m=content: 模块名为 content (内容模块)
    • c=index: 控制器名为 index
    • a=show: 方法名为 show
    • catid=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 使用模型 进行数据操作(推荐)

这是面向对象的、更规范的方式。

  1. 创建模型文件/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();
        }
    }
  2. 在控制器中使用模型

    // 在控制器中
    $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 在后台添加菜单并访问

  1. 登录后台:访问 http://你的域名/admin.php
  2. 添加菜单
    • 进入 扩展 -> 模块管理 -> 模块列表
    • 点击 增加模块,填写信息:
      • 模块名mymodule
      • 模块英文名MyModule
      • 模块目录mymodule (与代码目录名一致)
      • 菜单名称我的模块
      • 绑定菜单:选择“是”。
      • 菜单图标:选一个图标。
      • 菜单级别:一级菜单。
      • 菜单状态:显示。
    • 保存后,刷新缓存。
  3. 访问前台:现在你可以通过 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 架构,掌握好 模型 的数据操作和 模板 的渲染逻辑,你就可以在此基础上进行各种功能的扩展,多看官方文档,多分析现有模块的代码,是快速提升技能的最佳途径,祝你开发顺利!