核心概念:工作流程
在深入标签之前,先理解 DedeCMS 的工作流程:

- 用户请求:用户在浏览器中访问一个页面,
http://www.yoursite.com/a/1.html。 - URL 解析:DedeCMS 的路由系统会解析这个 URL,发现这是一个静态 HTML 文件,于是检查是否存在。
- 静态文件处理:
- 如果文件存在:直接读取并输出这个 HTML 文件,速度最快。
- 如果文件不存在:DedeCMS 会启动“动态解析”模式。
- 动态解析:
- 系统根据 URL 信息(如
a/1.html中的a和1),找到对应的模板文件(default/list_article.htm)。 - 模板引擎加载这个模板文件。
- 引擎扫描文件中的所有 Dede 标签。
- 对于每一个标签,引擎会调用其对应的 PHP 函数(如
GetArcList())去数据库或其他地方获取数据。 - 将获取到的数据填充到标签的位置。
- 将最终生成纯 HTML 代码。
- (可选)将生成的 HTML 保存到
a/1.html的位置,供下次用户直接访问。
- 系统根据 URL 信息(如
- 输出结果:将最终生成的 HTML 代码发送给用户的浏览器。
关键点:模板文件(.htm)是“半成品”,它包含了静态的 HTML 和动态的 Dede 标签,DedeCMS 的引擎在运行时将其“编译”成完整的静态 HTML 页面。
模板文件结构
一个典型的 DedeCMS 模板文件结构如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global.cfg_webname/}</title>
<meta name="description" content="{dede:global.cfg_description/}" />
<link rel="stylesheet" href="{dede:global.cfg_templets_skin/}/style/css/style.css">
</head>
<body>
<!-- 头部 -->
{dede:include filename="head.htm"/}
<!-- 主体内容区 -->
<div class="main">
<!-- 循环输出文章列表 -->
{dede:arclist titlelen='30' row='10'}
<div class="list-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:description function='cn_substr(@me, 100)'/]...</p>
<div class="info">
<span>作者:[field:writer/]</span>
<span>时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
<span>点击:[field:click/]</span>
</div>
</div>
{/dede:arclist}
</div>
<!-- 底部 -->
{dede:include filename="footer.htm"/}
</body>
</html>
标签分类详解
DedeCMS 的标签主要分为四大类:普通标签、列表标签、内容页标签、条件判断标签。
普通标签
用于输出简单的全局变量或单条数据,通常没有起始和结束标签。

语法:{dede:标签名 属性='值' /}
常用标签:
-
{dede:global}:输出系统全局配置变量。{dede:global.cfg_webname/}:网站名称{dede:global.cfg_weburl/}:网站网址{dede:global.cfg_templets_skin/}:当前模板目录{dede:global.cfg_powerby/}:版权信息
-
{dede:field}页(article_article.htm)中,用于输出当前文章的字段。
(图片来源网络,侵删){dede:field.title/}{dede:field.body/}:文章正文{dede:field.pubdate function='MyDate('Y-m-d H:i:s', @me)'/}:发布时间(带格式化){dede:field.keywords/}:文章关键词
-
{dede:php}:在模板中直接执行一小段 PHP 代码。- 注意:有安全风险,非必要不使用。
-
{dede:php} echo "Hello, DedeCMS!"; {/dede:php}
列表标签
用于循环输出一组内容,如文章列表、图集列表等。必须有起始和结束标签。
语法:
{dede:标签名 属性='值'}
<!-- 循环体,使用 [field:字段名/] 来获取当前项的数据 -->
{/dede:标签名}
最核心的列表标签:{dede:arclist}
{dede:arclist} 用于在任意页面调用文章列表,功能极其强大。
常用属性:
| 属性名 | 说明 | 示例 |
|---|---|---|
typeid |
指定栏目ID,调用指定栏目及其子栏目的文章。 | typeid='1' (调用ID为1的栏目) |
row |
获取条数。 | row='10' (获取10条) |
infolen |
简介长度。 | infolen='100' (简介最多100个字符) |
orderby |
排序方式。 | orderby='hot' (按点击量排序), orderby='pubdate' (按发布时间排序) |
orderway |
排序方向。 | orderway='desc' (降序), orderway='asc' (升序) |
channelid |
模型ID。 | channelid='1' (调用文章模型), channelid='2' (调用图集模型) |
limit |
起始位置,条数。 | limit='0,5' (从第0条开始,取5条) |
循环体内的字段:
在 {dede:arclist} 和 {/dede:arclist} 之间,使用 [field:字段名/] 来获取当前文章的数据。
| 字段名 | 说明 |
|---|---|
[field:title/] |
|
[field:arcurl/] |
文章链接 (自动生成静态或动态链接) |
[field:pubdate/] |
发布时间 (时间戳) |
[field:description/] |
文章简介 |
[field:click/] |
点击量 |
[field:writer/] |
作者 |
[field:litpic/] |
文章缩略图 |
示例:调用栏目ID为1的下的5篇热门文章,标题20字,简介80字。
{dede:arclist typeid='1' row='5' titlelen='20' infolen='80' orderby='click'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:description/]...</span>
</li>
{/dede:arclist}
其他列表标签:
{dede:loop}:用于调用任意数据表,比arclist更灵活,但需要手动指定SQL。{dede:channelartlist}:用于调用栏目列表,并可以在每个栏目下再调用其文章列表,常用于首页。{dede:myad}:调用广告位。
内容页标签
页(article\_article.htm)或列表页(list\_*.htm)等特定页面生效的标签。
核心标签:{dede:field} 和 {dede:global}
-
{dede:field}:如前所述,用于输出当前文章的字段。{dede:field.title/}{dede:field.body/}{dede:field.pages/}:分页符{dede:field.vote/}:投票功能{dede:field.shownote/}:文章简介(在内容页)
-
{dede:global}页,{dede:global}也可以用于获取当前文章的特定信息。{dede:global.cfg_webname/}:网站名{dede:global.itemindex/}:当前栏目在首页栏目列表中的索引
分页标签: 页,分页是必不可少的。
<!-- 文章正文 -->
{dede:field.body/}
<!-- 分页导航 -->
<ul class="pagelist">
<li>{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}</li>
</ul>
{dede:pagelist} 的属性可以控制分页显示哪些部分(如首页、上一页、页码、下一页、末尾)。
条件判断标签
根据条件输出不同的内容,类似于 PHP 的 if...else。
语法:
{dede:if 条件}
<!-- 条件成立时输出的内容 -->
[field:typename function='(@me=="首页") ? "Home" : @me'/]
{else if 另一个条件}
<!-- 另一个条件成立时输出的内容 -->
{else}
<!-- 所有条件都不成立时输出的内容 -->
{/dede:if}
示例:根据栏目ID显示不同的前缀。
{dede:if typeid==1}
<span class="label">新闻</span>
{else if typeid==2}
<span class="label">产品</span>
{else}
<span class="label">其他</span>
{/dede:if}
高级技巧
函数与修饰符
DedeCMS 标签支持使用函数对获取到的数据进行二次处理,这是其强大之处。
语法:[field:字段名 function='自定义函数(@me)'/]
@me是一个特殊变量,代表当前字段的原始值。
常用函数:
| 函数 | 说明 | 示例 |
|---|---|---|
cn_substr() |
截取字符串,防止乱码 | [field:title function='cn_substr(@me, 20)'/] |
MyDate() |
格式化时间戳 | [field:pubdate function='MyDate('Y-m-d', @me)'/] |
htmlspecialchars() |
转义HTML特殊字符,防止XSS攻击 | [field:title function='htmlspecialchars(@me)'/] |
str_replace() |
字符串替换 | [field:title function='str_replace("DedeCMS", "织梦", @me)'/] |
| 自定义函数 | 可以调用 /include/helpers/ 目录下的PHP文件 |
[field:title function='Uppercase(@me)'/] (需要创建 helpers/uppercase.helper.php) |
php 标签的妙用
虽然前面提到 php 标签有风险,但在某些特定场景下非常有用,例如在列表页获取当前栏目的ID。
{dede:php}
$typeid = $_GET['tid'];
echo "当前栏目ID是: " . $typeid;
{/dede:php}
注意:务必确保你了解代码的安全性,不要让用户输入直接进入 假设我们要做一个包含“网站头条”、“最新文章”、“热门推荐”的首页。 掌握 DedeCMS 模板标签是进行二次开发和模板定制的基石,多看、多练、多思考,就能熟练运用这些标签构建出功能强大、性能优异的网站。php
实战案例:制作一个首页
index.htm<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{dede:global.cfg_webname/}</title>
<meta name="description" content="{dede:global.cfg_description/}">
</head>
<body>
<header>
<h1>{dede:global.cfg_webname/}</h1>
<!-- 可以用 {dede:include filename="head.htm"} 引入公共头部 -->
</header>
<main>
<!-- 1. 网站头条 (调用单个文章) -->
<section class="headline">
{dede:arclist row='1' titlelen='50' typeid='1' orderby='click'}
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p class="summary">[field:description function='cn_substr(@me, 150)'/]</p>
{/dede:arclist}
</section>
<!-- 2. 最新文章 (调用栏目ID为1和2的最新5篇文章) -->
<section class="latest-news">
<h3>最新文章</h3>
<ul>
{dede:arclist typeid='1,2' row='5' titlelen='30' orderby='pubdate'}
<li><span class="date">[field:pubdate function='MyDate('m-d', @me)'/]</span><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
</section>
<!-- 3. 热门推荐 (调用栏目ID为3的热门文章) -->
<section class="hot-recommend">
<h3>热门推荐</h3>
<ul>
{dede:arclist typeid='3' row='8' titlelen='25' orderby='click'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{dede:arclist}
</ul>
</section>
</main>
<footer>
<p>Copyright © {dede:global.cfg_webname/} - All Rights Reserved.</p>
<!-- 可以用 {dede:include filename="footer.htm"} 引入公共底部 -->
</footer>
</body>
</html>
总结与最佳实践
head.htm, footer.htm, list_article.htm。function 属性来格式化输出,使模板更简洁、安全。{dede:include} 标签将公共部分(如头部、底部、侧边栏)抽离出来,提高复用性和维护性。
