织梦CMS 开发文档
目录
织梦CMS简介
织梦CMS(DedeCMS)是一款开源的内容管理系统,基于PHP + MySQL技术开发,它以其简单易用、功能强大、扩展灵活而广受欢迎,尤其适合快速搭建企业官网、新闻门户、个人博客等网站。
主要特点:
- 模板与程序分离:采用MVC思想,模板和逻辑代码分离,便于设计和维护。
- 标签化调用:通过简单的标签语言,无需编程即可调用数据和功能。
- 强大的后台管理:可视化的内容编辑、模型管理、会员系统等。
- 丰富的插件机制:支持插件扩展,方便添加新功能。
- 开源免费:遵循开源协议,社区活跃,资源丰富。
开发环境搭建
在开始开发前,需要搭建一个本地服务器环境,推荐使用集成环境包,一键安装。
推荐软件:
- PHP环境:推荐使用 phpStudy 或 XAMPP,确保PHP版本在 6 - 7.4 之间(织梦V5.7对PHP8支持有限,开发时需注意)。
- 数据库:MySQL 5.0 - 5.7。
- Web服务器:Apache 或 Nginx。
- 开发工具:
- 代码编辑器:VS Code, Sublime Text, Notepad++ 等。
- FTP/SFTP工具:FileZilla, WinSCP 等。
- 数据库管理工具:phpMyAdmin。
安装步骤:
- 安装集成环境(如phpStudy)。
- 将织梦CMS的源码包解压到Web服务器的根目录(如
WWW或htdoc)。 - 在浏览器中访问
http://你的域名/install,进入安装向导。 - 根据提示填写数据库信息、网站信息等,完成安装。
核心架构与目录结构
理解织梦的目录结构是开发的第一步。
dedecms/
├── dede/ # 后台管理程序目录
├── include/ # 核心类库和函数文件目录
│ ├── arc.archives.class.php # 文档发布、生成HTML的核心类
│ ├── channelunit.class.php # 模型处理核心类
│ ├── common.func.php # 通用函数库
│ ├── userlogin.class.php # 用户登录类
│ └── ...
├── plus/ # 扩展功能模块目录
│ ├── guestbook/ # 留言板
│ ├── search/ # 搜索功能
│ └── ...
├── special/ # 专题目录
├── templets/ # 网站前台模板目录
│ ├── default/ # 默认模板
│ └── ... # 其他模板
├── uploads/ # 上传文件目录(附件、图片等)
├── a/ # 文章内容静态HTML目录
├── html/ # 首页及其他页面静态HTML目录
├── install/ # 安装程序目录(安装后建议删除)
├── member/ # 会员中心目录
├── favicon.ico
├── index.php # 前台入口文件
├── robots.txt
└── ...
模板引擎与标签
织梦的模板引擎是其精髓,通过标签来调用数据。
基础语法
- 变量调用:
{dede:var name='变量名'/} - 循环标签:
{dede:loop name='循环变量' id='ID'} ... {/dede:loop} - 条件判断:
{dede:if 条件} ... {else} ... {/dede:if} - 注释:
{dede:*这是注释*}(不会被解析输出)
常用系统标签
这些标签通常放在模板的头部,用于获取网站的全局信息。
| 标签名 | 用途 | 示例 |
|---|---|---|
global |
调用全局变量 | {dede:global name='cfg_webname'/} (获取网站名称) |
cfg |
调用系统配置参数 | {dede:field name='cfg_webname'/} (与global类似,常用在列表/内容页) |
pagelist |
生成分页列表 | {dede:pagelist listsize='4'/} |
arclist |
调用文章列表 | 最核心、最常用的标签 |
list |
在列表页调用文章列表 | {dede:list pagesize='10'}...{/dede:list} |
field |
页获取字段值 | {dede:field.title/} (获取文章标题) |
channel |
调用栏目列表 | {dede:channel type='top'}...{/dede:channel} (调用顶级栏目) |
标签
arclist 标签 (文章列表)
用于首页、栏目页等地方调用文章列表。
{dede:arclist typeid='1' row='10' titlelen='30' orderby='pubdate'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</li>
{/dede:arclist}
常用属性:
typeid: 栏目ID,0表示全站,-1表示当前栏目及其子栏目。row: 调用文章数量,len`: 标题长度。orderby: 排序方式,如pubdate(发布时间),click(点击量),id(文章ID)。orderway: 排序方向,desc(降序),asc(升序)。limit: 起始位置, 数量,如limit='0,5'。
list 标签 (列表页专用)
在列表模板(list_栏目ID.htm)中使用,用于调用当前栏目的文章。
{dede:list pagesize='10'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>[field:description/]...</p>
<div class="info">作者:[field:writer/] 发布时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</div>
{/dede:list}
分页标签:
在 list 标签循环结束后,加上分页代码。
<div class="dede_pages">
<ul>
<li><span class="pageinfo">共 <strong>{dede:pagelist listitem='info'/}</strong> 页</span></li>
{dede:pagelist listsize='5' listitem='pre,next,pageno,option'/}
</ul>
</div>
field 标签 (内容页专用)模板(article_栏目ID.htm)中使用,用于获取当前文章的详细信息。
<h1>{dede:field.title/}</h1>
<div class="info">
来源:{dede:field.source/} 作者:{dede:field.writer/} 时间:{dede:field.pubdate function='MyDate('Y-m-d H:i:s', @me)'/}
</div>
<div class="content">
{dede:field.body/}
</div>
自定义标签
当系统标签无法满足需求时,可以开发自定义标签。
开发步骤:
-
创建标签处理文件:在
include/tag/目录下创建一个新文件,如mytag.lib.php。 -
编写处理函数:文件内必须定义一个与文件名同名的函数。
// include/tag/mytag.lib.php function lib_mytag(&$ctag, &$refObj) { // 获取标签属性 $attlist = "typeid|0,row|10"; FillAttsDefault($ctag->CAttributeItems, $attlist); extract($ctag->CAttributeItems, EXTR_SKIP); // 查询数据库 $dsql = new DedeSql(false); $dsql->SetQuery("SELECT * FROM dede_archives WHERE typeid = $typeid ORDER BY id DESC LIMIT 0, $row"); $dsql->Execute('me'); $html = ''; while($row = $dsql->GetArray('me')) { $html .= "<li><a href='/view.php?aid={$row['id']}'>{$row['title']}</a></li>"; } $dsql->FreeResult(); return $html; } -
在模板中调用:
{dede:mytag typeid='1' row='5'/}
二次开发核心
数据表结构
织梦的核心数据表都带有 dede_ 前缀。
| 表名 | 用途 |
|---|---|
dede_archives |
文章主表,存储文章ID、标题、发布时间、所属栏目等核心信息。 |
dede_addonarticle |
文章附加表,存储文章内容、作者、来源等(模型为“文章”时使用)。 |
dede_arctype |
栏目表,存储栏目ID、名称、上级栏目、模板等。 |
dede_admin |
管理员表。 |
dede_member |
会员表。 |
dede_homepageset |
首页设置表。 |
重要提示:dede_archives 表只存储摘要,详细内容在附加表,通过 aid (文章ID) 关联。
核心文件解析
- 入口文件 (
index.php): 负责初始化环境,加载核心类,并根据URL参数决定是显示静态页还是动态页,并调用相应的控制器。 - 发布流程:
- 后台发布文章时,数据先存入
archives表。 - 根据模型,将详细内容存入对应的附加表(如
addonarticle)。 - 点击“生成HTML”时,
arc.archives.class.php类被调用,根据模板生成静态HTML文件到a/目录。
- 后台发布文章时,数据先存入
- 动态页:当未生成静态页或开启了“仅动态浏览”时,
index.php会将请求转发给view.php(文章页) 或list.php(列表页) 等动态脚本,由这些脚本实时查询数据库并渲染模板。
自定义模型开发
除了默认的“文章”、“图片”等模型,可以创建自己的内容模型。
步骤:
- 后台创建模型:
后台 -> 核心 -> 内容模型管理 -> [增加内容模型],填写模型名称、表前缀等。 - 添加字段:进入刚创建的模型,点击“[管理字段]”,添加所需的字段(如:产品型号、价格、规格等),每个字段都有字段名、类型、提示文字等属性。
- 创建模板:为这个新模型创建发布模板(
article_add_模型ID.htm)、列表模板(list_模型ID.htm模板(article_模型ID.htm)。 - 调用数据:在模板中,使用
{dede:field.字段名/}来调用自定义字段的数据。
自定义表单开发
用于制作留言板、在线报名、招聘申请等。
步骤:
- 后台创建表单:
后台 -> 核心 -> 自定义表单管理 -> [增加表单],填写表单名称。 - 添加字段:进入表单管理,点击“[字段管理]”,添加表单字段(如:姓名、电话、留言内容等)。
- 前台调用:在需要显示表单的模板页面,使用
{dede:loop table='dede_myform' sort='id' row='10'}...{/dede:loop}来循环显示已有数据。table属性是数据表名(dede_+ 你在后台设置的表单名称)。 - 提交处理:创建一个HTML表单,
action指向/plus/diy.php,method为post,每个输入框的name属性必须与后台添加的字段名一致。<form action="/plus/diy.php" enctype="multipart/form-data" method="post"> <input type="hidden" name="action" value="post" /> <input type="hidden" name="diyid" value="1" /> <!-- 表单ID --> <input type="text" name="name" placeholder="您的姓名" /> <textarea name="content" placeholder="留言内容"></textarea> <button type="submit">提交</button> </form>
API接口开发
织梦V5.7开始内置了简单的API功能,可以开启并调用。
- 开启API:在
系统->系统基本参数->核心设置中,开启“是否开启API接口”。 - 调用示例 (以文章列表为例):
- URL:
http://你的域名/api/?json - 参数:
action: 操作类型,如list(列表),arc(文章详情)typeid: 栏目IDrow: 调用数量
- 请求示例:
http://你的域名/api/?action=list&typeid=1&row=5&format=json - 返回数据: JSON格式的文章列表数据,可供移动端或其他系统调用。
- URL:
常用函数与类库
GetOne()/GetArray():dsql类的常用方法,用于查询数据库。GetOne()获取一行,GetArray()获取多行。p():include/common.func.php中的调试函数,print_r()的加强版,会以<pre>标签格式化输出变量,方便调试。GetOneMk(): 获取一个栏目信息。GetKeywords(): 获取关键词。MyDate(): 日期格式化函数。
安全规范与最佳实践
- SQL注入:
- 永远不要直接拼接SQL语句。
- 必须使用织梦提供的
$dsql类进行数据库操作,它会自动处理转义。 - 对用户输入进行过滤,可以使用
$dsql->FilterSearch()函数。
- XSS攻击:
- 对于用户提交的内容,在输出到HTML前进行转义,可以使用织梦自带的
htmlspecialchars()函数。 - 模板中,
{dede:field.body/}默认已经做了转义,但如果要在JS或属性中使用,需要手动处理。
- 对于用户提交的内容,在输出到HTML前进行转义,可以使用织梦自带的
- 文件上传安全:
- 严格限制上传文件类型(白名单机制)。
- 重命名上传的文件,避免使用用户提供的文件名。
- 将上传目录设置在Web根目录之外,或通过
.htaccess禁止执行脚本。
- 后台安全:
- 修改默认后台目录
dede为一个复杂的名字。 - 定期修改管理员密码。
- 关闭不必要的后台功能模块。
- 修改默认后台目录
- 代码规范:
- 遵循PSR-4等现代PHP规范。
- 二次开发时,尽量使用织梦的钩子和标签,而不是直接修改核心文件。
- 注释清晰,方便后期维护。
调试与性能优化
- 调试:
- 使用
p($variable);在代码中打印变量,查看其值。 - 开启PHP错误报告:在
php.ini中设置display_errors = On。 - 使用浏览器开发者工具(F12)查看网络请求和JS错误。
- 使用
- 性能优化:
- 静态化:尽可能生成静态HTML页面,减少数据库查询。
- 缓存:利用织梦自带的缓存机制,或使用Redis、Memcached等外部缓存。
- 数据库优化:为常用查询字段(如
typeid,arcrank)建立索引。 - 代码优化:避免在模板中使用复杂的PHP循环和计算,尽量在标签属性中完成。
资源与社区
- 官方网站:http://www.dedecms.com/
- 官方文档:官方文档相对老旧,但仍有参考价值。
- 开发者社区:
- 织梦论坛:官方社区,问题多,但解答质量参差不齐。
- GitHub:搜索
dedecms,可以找到一些开源的二次开发项目和补丁。 - CSDN、博客园:大量开发者分享织梦二次开发教程和经验。
- 模板市场:可以购买优质的商业模板进行学习和参考。
希望这份文档能为你打开织梦CMS开发的大门,实践是最好的老师,多动手、多思考,你很快就能熟练掌握它。
