DedeCms 二次开发终极指南

DedeCms 是一款非常经典和流行的 PHP 开源网站管理系统,尤其适合快速搭建资讯、企业、门户类网站,其强大的标签引擎和灵活的二次开发能力,使其拥有庞大的开发者社区。

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

本教程将分为以下几个核心部分:

  1. 【准备篇】开发环境搭建与核心概念
  2. 【入门篇】第一个二次开发:修改网站标题
  3. 【进阶篇】核心机制解析:模板引擎、标签与数据库
  4. 【实战篇】常用二次开发场景与代码示例
  5. 【高级篇】开发规范与性能优化
  6. 【资源篇】学习资料与社区

【准备篇】开发环境搭建与核心概念

在开始之前,请确保您的电脑上已经搭建好了标准的 PHP 开发环境。

开发环境推荐

  • 集成环境包:对于初学者,强烈推荐使用集成环境包,一键安装,配置简单。

    • phpStudy (Windows 平台):国内使用最广泛,集成度高,社区支持好。
    • XAMPP (跨平台):功能稳定,适合 Mac 和 Linux 用户。
    • 宝塔面板 (服务器/本地均可):图形化管理,非常方便,适合有服务器需求或喜欢可视化的用户。
  • 环境要求

    dedecms二次开发教程
    (图片来源网络,侵删)
    • PHP 版本:PHP 5.6 - PHP 7.4 (DedeCms 5.7 对 PHP 7.x 有较好的支持,新版本建议使用 PHP 7.2 或 7.3)
    • 数据库:MySQL 5.0+MariaDB
    • Web 服务器:ApacheNginx (DedeCms 默认为 Apache,Nginx 需要额外配置伪静态规则)

Dedecms 安装

  1. DedeCms 官网 下载最新稳定版。
  2. 将下载的压缩包解压,通过 FTP 或文件管理器上传到您的 Web 服务器根目录(如 htdocswww)。
  3. 访问您的域名(http://www.yourdomain.com/install),根据安装向导进行安装。
  4. 重要:安装成功后,请务必删除 install 目录和 /data/install.lock.php 文件,以防止安全风险。

核心概念理解

在动手之前,必须理解 Dedecms 的几个核心概念,这是二次开发的基石。

  • 模板引擎:DedeCms 使用自己的一套模板语法,核心是 {dede:标签名 属性='值'},模板文件是纯 HTML/PHP 文件,开发者通过在 HTML 中插入这些标签,来实现动态数据的调用和显示,模板文件存放在 /templets/ 目录下。

  • 这是 Dedecms 的灵魂,标签分为两大类:

    • 普通标签:用于调用和显示数据,如 {dede:arclist}(文章列表)、{dede:field})、{dede:global}(全局变量)等,它们通常用在模板文件中。
    • 功能标签:用于执行特定操作,如 {dede:php}(执行 PHP 代码)、{dede:include}(包含文件)等。
  • 标签文件:每个标签都对应一个 PHP 文件,这些文件位于 /include/taglib/ 目录下。{dede:arclist} 标签对应的就是 /include/taglib/arclist.lib.php二次开发的一个重要方法就是修改或扩展这些标签文件

    dedecms二次开发教程
    (图片来源网络,侵删)
  • 数据库与数据表:DedeCms 使用 MySQL 存储所有数据,核心数据表包括:

    • dede_archives:文章/文档主表,存储所有内容的通用信息(如 ID、标题、发布时间等)。
    • dede_addonarticle:文章附加表,存储文章特有的内容(如文章正文、来源等)。
    • dede_arctype:栏目表,存储网站栏目信息。
    • dede_admin:管理员表。
    • dede_ 是默认的数据表前缀,安装时可以修改。
  • MVC 思想(简化版)

    • M (Model - 模型):对应 /include//dede/ 目录下的 PHP 文件,负责处理业务逻辑、数据库操作。
    • V (View - 视图):对应 /templets/ 目录下的 HTML 模板文件,负责数据展示。
    • C (Controller - 控制器):DedeCms 的控制器概念比较模糊,通常由核心入口文件 index.php 和各个模块的入口文件(如 plus/list.php)充当,负责接收请求、调用模型、加载视图。

【入门篇】第一个二次开发:修改网站标题

这是一个最简单的例子,旨在让您感受二次开发的流程。

目标:将网站首页的标题从 "我的网站" 修改为 "我的酷炫网站"。

步骤

  1. 定位模板文件

    • 首页模板通常位于 /templets/default/index.htm
    • 用代码编辑器(如 VS Code, Sublime Text)打开这个文件。
  2. 查找并修改标题标签

    • index.htm 中,找到 <title> 标签,DedeCms 的标题通常由一个 {dede:global} 标签动态生成。
    • 找到类似这样的代码:
      <title>{dede:global.cfg_webname/}_{dede:global.cfg_subhead/}</title>
    • 这里 {dede:global.cfg_webname/} 对应的是系统后台“系统基本参数”中设置的“网站名称”。
    • 方法一(直接修改模板):你可以直接将 {dede:global.cfg_webname/} 替换成 "我的酷炫网站"。
      <title>我的酷炫网站_{dede:global.cfg_subhead/}</title>
    • 方法二(后台修改 - 推荐):登录 Dedecms 后台,进入【系统】->【系统基本参数】->【站点设置】,找到“网站名称”,将其修改为“我的酷炫网站”,然后保存。
  3. 查看效果

    • 清理浏览器缓存,或按 Ctrl + F5 强制刷新页面。
    • 查看网页源代码,您会发现 <title> 标签的内容已经更新。

这个例子展示了最简单的二次开发流程:定位模板 -> 找到标签 -> 修改内容


【进阶篇】核心机制解析

掌握了入门操作后,我们需要深入理解其工作原理,才能进行更复杂的开发。

模板引擎工作流程

当用户访问一个页面时(如首页),DedeCms 的大致工作流程如下:

  1. 请求接收index.php 接收用户请求。
  2. 模板加载:系统根据请求的页面,找到对应的模板文件(如 index.htm)。
  3. 标签解析:DedeCms 的解析器会扫描模板文件,识别出所有 {dede:...}
  4. 执行标签文件:对于每个识别出的标签,系统会去 /include/taglib/ 目录下找到对应的 .lib.php 文件(如 arclist.lib.php),并执行它。
  5. 数据获取:标签文件会执行 PHP 代码,连接数据库,查询数据。
  6. 内容替换:标签文件将查询到的数据格式化,然后返回给解析器,解析器用返回的内容替换掉模板中的原始标签。
  7. 输出生成:所有标签都被替换完毕后,生成一个纯 HTML/PHP 文件。
  8. 最终输出:将这个最终的 HTML 内容发送到用户的浏览器。

关键点:你看到的网页是最终生成的 HTML,而不是模板文件本身。

数据库操作

DedeCms 封装了一套简单的数据库操作函数,核心是 dedesql 类。

  • 初始化数据库连接

    require_once(dirname(__FILE__)."/../include/common.inc.php");
    // $dsql 是一个全局的数据库连接对象,在 common.inc.php 中已初始化
  • 执行查询(GetOne:用于获取单条记录(如查询一个栏目的信息)。

    $sql = "SELECT * FROM `dede_arctype` WHERE id=1";
    $row = $dsql->GetOne($sql);
    // $row 是一个关联数组,可以通过 $row['typename'] 来访问栏目名称
    echo $row['typename'];
  • 执行查询(Execute:用于获取多条记录(如获取文章列表)。

    $sql = "SELECT id, title FROM `dede_archives` ORDER BY id DESC LIMIT 10";
    $dsql->Execute('me', $sql); // 'me' 是一个别名
    while ($row = $dsql->GetArray('me')) {
        echo $row['id'] . " - " . $row['title'] . "<br>";
    }
  • 执行写入/更新/删除(ExecuteNoneQuery

    // 插入数据
    $sql = "INSERT INTO `dede_archives` (title, typeid, pubdate) VALUES ('新文章', 1, '".time()."')";
    $dsql->ExecuteNoneQuery($sql);
    // 更新数据
    $sql = "UPDATE `dede_archives` SET title='修改后的标题' WHERE id=100";
    $dsql->ExecuteNoneQuery($sql);
    // 删除数据
    $sql = "DELETE FROM `dede_archives` WHERE id=100";
    $dsql->ExecuteNoneQuery($sql);

【实战篇】常用二次开发场景与代码示例

在首页添加一个“最新产品”列表

假设我们有一个自定义的内容模型“产品”,我们需要在首页显示它。

步骤

  1. 模型:后台【核心】->【内容模型管理】->【增加一个内容模型】,命名为“产品”,并添加字段(如产品图片、价格等)。
  2. 创建栏目:后台【核心】->【栏目管理】,创建一个顶级栏目“产品”,并选择刚刚创建的“产品”内容模型。
  3. 添加产品:在“产品”栏目下添加几条产品数据。
  4. 修改首页模板
    • 打开 /templets/default/index.htm
    • 在您希望显示产品列表的位置,添加以下代码:
      <h2>最新产品</h2>
      <ul>
          {dede:arclist row='5' channelid='产品模型ID' typeid='产品栏目ID'}
          <li>
              <a href="[field:arcurl/]">[field:title/]</a>
              <p>价格:[field:price/]</p> <!-- 假设你有一个 price 字段 -->
          </li>
          {/dede:arclist}
      </ul>
    • channelid:这是关键,你需要知道“产品”模型的 ID,可以在后台【核心】->【内容模型管理】中查看,通常是 -N 的形式(如 -8)。
    • typeid:填写“产品”栏目的 ID。
    • [field:price/]:这是调用自定义字段的方法,price 是你定义的字段名。

制作一个自定义的 PHP 页面(如联系我们)

目标:创建一个 contact.php 页面,包含一个表单,提交后将数据保存到数据库。

步骤

  1. 创建数据表

    • 在数据库中手动创建一个表 dede_enquiry(留言表)。
      CREATE TABLE `dede_enquiry` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(50) NOT NULL,
        `email` varchar(100) NOT NULL,
        `content` text NOT NULL,
        `addtime` int(11) NOT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  2. 创建页面文件

    • 在网站根目录创建 contact.php 文件。

    • 编写代码:

      <?php
      require_once(dirname(__FILE__)."/include/common.inc.php");
      require_once(DEDEINC."/datalistcp.class.php");
      // 处理表单提交
      if (isset($_POST['submit'])) {
          $name = trim($_POST['name']);
          $email = trim($_POST['email']);
          $content = trim($_POST['content']);
          if (empty($name) || empty($email) || empty($content)) {
              ShowMsg('请填写完整信息!', '-1');
              exit();
          }
          $sql = "INSERT INTO `dede_enquiry` (name, email, content, addtime) VALUES ('$name', '$email', '$content', '".time()."')";
          if ($dsql->ExecuteNoneQuery($sql)) {
              ShowMsg('提交成功!', 'contact.php'); // 跳转到感谢页或本页
              exit();
          } else {
              ShowMsg('提交失败,请重试!', '-1');
              exit();
          }
      }
      // 显示表单
      // 这里可以加载一个模板,但为了简单,我们直接输出 HTML
      ?>
      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>联系我们</title>
      </head>
      <body>
          <h1>联系我们</h1>
          <form action="contact.php" method="post">
              姓名:<input type="text" name="name" required><br><br>
              邮箱:<input type="email" name="email" required><br><br>
              内容:<textarea name="content" rows="5" required></textarea><br><br>
              <input type="submit" name="submit" value="提交">
          </form>
      </body>
      </html>
    • require_once("include/common.inc.php");:这是必须的,它加载了核心配置和数据库连接。

    • ShowMsg():DedeCms 自带的提示跳转函数,非常方便。

修改或创建一个自定义标签

假设我们需要一个标签 {dede:mylist},它能随机显示一篇文章。

步骤

  1. 创建标签文件

    • /include/taglib/ 目录下创建一个新文件 mylist.lib.php

    • 编写代码:

      <?php
      if(!defined('DEDEINC')) exit('Request Error!');
      function lib_mylist(&$ctag, &$refObj)
      {
          global $dsql;
          // 获取标签属性
          $attlist = "row|10";
          FillAttsDefault($ctag->CAttribute->Items, $attlist);
          extract($ctag->CAttribute->Items, EXTR_SKIP);
          // SQL 查询,随机获取一篇文章
          $sql = "SELECT id, title FROM `dede_archives` ORDER BY RAND() LIMIT $row";
          $artlist = '';
          $dsql->SetQuery($sql);
          $dsql->Execute();
          while ($row = $dsql->GetArray()) {
              $artlist .= "<li><a href='/view.php?aid={$row['id']}'>{$row['title']}</a></li>\n";
          }
          return $artlist;
      }
      ?>
    • 函数名lib_标签名,这里是 lib_mylist

    • 参数$ctag (标签本身),$refObj (引用对象)。

    • 逻辑:获取 row 属性,构建 SQL 查询,循环处理数据,并返回 HTML 字符串。

  2. 在模板中使用标签

    • 在任意模板文件中使用:
      <h3>随机文章</h3>
      <ul>
          {dede:mylist row='5'}
          {/dede:mylist}
      </ul>
    • 访问页面,你就能看到随机生成的文章列表了。

【高级篇】开发规范与性能优化

  • 代码规范

    • 文件命名:清晰明了,如 user_info.php
    • 变量命名:使用有意义的英文单词,如 $articleTitle
    • 注释:对复杂逻辑和关键步骤添加注释。
  • 安全第一

    • SQL 注入:永远不要直接拼接用户输入到 SQL 语句中,使用 $dsqlGetOne, Execute 等安全方法,它们会自动进行转义,如果必须手写,使用 ParseSql 函数。
    • XSS 跨站脚本:在输出用户提交的内容到 HTML 时,使用 htmlspecialchars() 函数进行转义,DedeCms 的 {dede:field.body/} 等标签默认已做处理。
    • 文件上传:严格控制上传目录的执行权限,对上传文件类型、大小、内容进行严格校验。
  • 性能优化

    • 开启缓存:DedeCms 自带缓存机制,在后台开启“页面缓存”和“SQL 缓存”,可以极大提升首页和列表页的访问速度。
    • 减少数据库查询:尽量在一次查询中获取所有需要的数据,避免在循环中执行查询。
    • 使用 CDN:将静态资源(CSS, JS, 图片)放到 CDN 上,加速访问。
    • 静态化:对于不常变化的页面(如关于我们),可以生成纯 HTML 文件,直接访问 HTML 文件,绕过 PHP 和数据库解析。

【资源篇】学习资料与社区

  • 官方文档:虽然 Dedecms 官方文档更新较慢,但仍是权威参考。
  • DedeCms 官方论坛bbs.dedecms.com,遇到问题可以在这里搜索或提问。
  • 开源中国 Gitee:DedeCms 的源码托管在 Gitee,你可以直接阅读源码,学习其实现。https://gitee.com/destin/dedecms
  • 视频教程:在 B站、慕课网等平台搜索 "DedeCms 二次开发",有大量视频教程可供学习。
  • 博客和文章:许多开发者会在个人博客上分享 Dedecms 的二次开发经验和技巧,善用 Google/Bing 搜索。

DedeCms 的二次开发,核心在于理解 “模板 -> 标签 -> PHP逻辑 -> 数据库” 这条主线。

  • 新手:从修改模板、使用现有标签开始。
  • 进阶者:学习编写自定义页面,操作数据库,理解标签文件的工作原理。
  • 高手:精通标签开发,遵循安全规范,进行性能优化,甚至参与核心代码的修改。

希望这份详尽的教程能为您打开 Dedecms 二次开发的大门,祝您开发愉快!