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

本教程将分为以下几个核心部分:
- 【准备篇】开发环境搭建与核心概念
- 【入门篇】第一个二次开发:修改网站标题
- 【进阶篇】核心机制解析:模板引擎、标签与数据库
- 【实战篇】常用二次开发场景与代码示例
- 【高级篇】开发规范与性能优化
- 【资源篇】学习资料与社区
【准备篇】开发环境搭建与核心概念
在开始之前,请确保您的电脑上已经搭建好了标准的 PHP 开发环境。
开发环境推荐
-
集成环境包:对于初学者,强烈推荐使用集成环境包,一键安装,配置简单。
- phpStudy (Windows 平台):国内使用最广泛,集成度高,社区支持好。
- XAMPP (跨平台):功能稳定,适合 Mac 和 Linux 用户。
- 宝塔面板 (服务器/本地均可):图形化管理,非常方便,适合有服务器需求或喜欢可视化的用户。
-
环境要求:
(图片来源网络,侵删)- PHP 版本:
PHP 5.6-PHP 7.4(DedeCms 5.7 对 PHP 7.x 有较好的支持,新版本建议使用 PHP 7.2 或 7.3) - 数据库:
MySQL 5.0+或MariaDB - Web 服务器:
Apache或Nginx(DedeCms 默认为 Apache,Nginx 需要额外配置伪静态规则)
- PHP 版本:
Dedecms 安装
- 从 DedeCms 官网 下载最新稳定版。
- 将下载的压缩包解压,通过 FTP 或文件管理器上传到您的 Web 服务器根目录(如
htdocs或www)。 - 访问您的域名(
http://www.yourdomain.com/install),根据安装向导进行安装。 - 重要:安装成功后,请务必删除
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 使用 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)充当,负责接收请求、调用模型、加载视图。
- M (Model - 模型):对应
【入门篇】第一个二次开发:修改网站标题
这是一个最简单的例子,旨在让您感受二次开发的流程。
目标:将网站首页的标题从 "我的网站" 修改为 "我的酷炫网站"。
步骤:
-
定位模板文件:
- 首页模板通常位于
/templets/default/index.htm。 - 用代码编辑器(如 VS Code, Sublime Text)打开这个文件。
- 首页模板通常位于
-
查找并修改标题标签:
- 在
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 后台,进入【系统】->【系统基本参数】->【站点设置】,找到“网站名称”,将其修改为“我的酷炫网站”,然后保存。
- 在
-
查看效果:
- 清理浏览器缓存,或按
Ctrl + F5强制刷新页面。 - 查看网页源代码,您会发现
<title>标签的内容已经更新。
- 清理浏览器缓存,或按
这个例子展示了最简单的二次开发流程:定位模板 -> 找到标签 -> 修改内容。
【进阶篇】核心机制解析
掌握了入门操作后,我们需要深入理解其工作原理,才能进行更复杂的开发。
模板引擎工作流程
当用户访问一个页面时(如首页),DedeCms 的大致工作流程如下:
- 请求接收:
index.php接收用户请求。 - 模板加载:系统根据请求的页面,找到对应的模板文件(如
index.htm)。 - 标签解析:DedeCms 的解析器会扫描模板文件,识别出所有
{dede:...}- 执行标签文件:对于每个识别出的标签,系统会去
/include/taglib/目录下找到对应的.lib.php文件(如arclist.lib.php),并执行它。- 数据获取:标签文件会执行 PHP 代码,连接数据库,查询数据。
- 内容替换:标签文件将查询到的数据格式化,然后返回给解析器,解析器用返回的内容替换掉模板中的原始标签。
- 输出生成:所有标签都被替换完毕后,生成一个纯 HTML/PHP 文件。
- 最终输出:将这个最终的 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);
【实战篇】常用二次开发场景与代码示例
在首页添加一个“最新产品”列表
假设我们有一个自定义的内容模型“产品”,我们需要在首页显示它。
步骤:
- 模型:后台【核心】->【内容模型管理】->【增加一个内容模型】,命名为“产品”,并添加字段(如产品图片、价格等)。
- 创建栏目:后台【核心】->【栏目管理】,创建一个顶级栏目“产品”,并选择刚刚创建的“产品”内容模型。
- 添加产品:在“产品”栏目下添加几条产品数据。
- 修改首页模板:
- 打开
/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 页面,包含一个表单,提交后将数据保存到数据库。
步骤:
-
创建数据表:
- 在数据库中手动创建一个表
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;
- 在数据库中手动创建一个表
-
创建页面文件:
-
在网站根目录创建
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},它能随机显示一篇文章。
步骤:
-
创建标签文件:
-
在
/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 字符串。
-
-
在模板中使用标签:
- 在任意模板文件中使用:
<h3>随机文章</h3> <ul> {dede:mylist row='5'} {/dede:mylist} </ul> - 访问页面,你就能看到随机生成的文章列表了。
- 在任意模板文件中使用:
【高级篇】开发规范与性能优化
-
代码规范:
- 文件命名:清晰明了,如
user_info.php。 - 变量命名:使用有意义的英文单词,如
$articleTitle。 - 注释:对复杂逻辑和关键步骤添加注释。
- 文件命名:清晰明了,如
-
安全第一:
- SQL 注入:永远不要直接拼接用户输入到 SQL 语句中,使用
$dsql的GetOne,Execute等安全方法,它们会自动进行转义,如果必须手写,使用ParseSql函数。 - XSS 跨站脚本:在输出用户提交的内容到 HTML 时,使用
htmlspecialchars()函数进行转义,DedeCms 的{dede:field.body/}等标签默认已做处理。 - 文件上传:严格控制上传目录的执行权限,对上传文件类型、大小、内容进行严格校验。
- SQL 注入:永远不要直接拼接用户输入到 SQL 语句中,使用
-
性能优化:
- 开启缓存: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 二次开发的大门,祝您开发愉快!
