杰瑞科技汇

phpcms二次开发教程

PHPCMS V9 二次开发全面教程

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

在开始之前,请确保你已经具备以下条件:

phpcms二次开发教程-图1
(图片来源网络,侵删)
  1. 基础技能

    • 熟悉 HTML 和 CSS。
    • 掌握 PHP 基础语法。
    • 了解 MySQL 数据库基本操作。
    • 了解基本的 MVC(模型-视图-控制器)设计模式概念(PHPCMS V9 遵循此模式)。
  2. 开发环境

    • Web 服务器:Apache 或 Nginx。
    • PHP 环境:建议使用 PHP 5.3 - 7.x 版本(PHPCMS V9 对新版 PHP 兼容性可能不佳)。
    • 数据库:MySQL 5.0+。
    • 本地开发工具:集成环境包如 phpStudyXAMPPWampServer 可以一键搭建环境。
  3. 代码编辑器

    推荐使用 VS Code、Sublime Text 或 PhpStorm 等支持 PHP 语法高亮和代码提示的编辑器。

  4. 获取 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:创建模型

模型用于操作我们刚刚创建的数据库表。

  1. phpcms/model/ 目录下创建文件 product_model.class.php
  2. 编写模型代码:
<?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:创建控制器

控制器处理业务逻辑,比如显示产品列表。

  1. phpcms/modules/ 目录下创建文件夹 product
  2. 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:创建模板

模板用于展示数据。

  1. phpcms/templates/ 目录下创建文件夹 product
  2. 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 等参数传递过去。

如何处理表单提交(如添加产品)?

  1. 创建表单模板 (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>
  2. 在控制器中添加 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:
      1. 检查 SQL 语句是否正确,表名前缀是否对。
      2. 检查缓存问题,在后台清空缓存再试。
      3. 检查数据表中是否有符合条件的数据(如 status=1)。
      4. 检查模型文件是否创建正确,类名和文件名是否对应。
  • Q: 如何修改后台菜单或添加新的管理功能?

    • A: 后台菜单的配置通常在 phpcms/modules/admin/templates/ 目录下的某些文件中,或者直接在数据库的 v9_admin_menu 表里修改,要添加完整的管理功能(如产品列表、添加、编辑、删除),你需要创建一个 admin 控制器,并遵循 PHPCMS 的后台开发规范,这比前台开发更复杂,需要参考官方模块的结构。
  • Q: PHPCMS V9 和 PHPCMS 有什么关系?

    • A: PHPCMS V9 是 PHPCMS 家族中一个非常经典的版本,基于自主研发的 PHP 框架,后续的 PHPCMS (有时被称为 PHPCMS 10) 已经转向了基于 ThinkPHP 框架,两者在架构和开发方式上有很大不同,市面上绝大多数教程和二次开发都是针对 PHPCMS V9 的。

第六部分:学习资源

  • 官方文档:虽然可能不完整,但始终是第一手资料。
  • 开源社区/论坛https://bbs.phpcms.cn/ (官方社区,虽然活跃度可能下降,但仍有大量历史帖子)。
  • 代码仓库:可以在 GiteeGitHub 上搜索 PHPCMS V9,找到许多开源的二次开发案例和模块,通过阅读源码是学习的最佳途径。
  • 第三方教程:搜索“PHPCMS V9 教程”,可以找到很多博客和视频教程,但请注意甄别信息的时效性。

希望这份详细的教程能帮助你顺利入门 PHPCMS V9 的二次开发世界!祝你编码愉快!

分享:
扫描分享到社交APP
上一篇
下一篇