第一部分:核心概念 - DedeCMS 模板是如何工作的?
在开始学习标签之前,你必须理解 DedeCMS 的工作流程,这就像做菜,你需要知道食材(数据)、菜谱(模板)和厨师(程序)是如何协作的。

- 数据: 你的网站内容,比如文章、商品、图片等,都存储在 MySQL 数据库中,每个内容条目(一篇文章、一个产品)都是一个数据记录。
- 模板: 这就是你网站的“骨架”和“皮肤”,它是一个 HTML 文件,里面混合了静态的 HTML/CSS/JavaScript 和动态的 DedeCMS 标签,模板文件通常存放在
/templets/目录下。 - 这是 DedeCMS 的核心,它们是特殊的指令,告诉 DedeCMS 程序:“请从数据库里取出符合条件的数据,然后按照我指定的格式显示在这里”,当用户访问一个页面时,DedeCMS 程序会解析模板文件,执行标签指令,将动态数据填充到模板中,最终生成一个完整的 HTML 页面发送给用户的浏览器。
模板 + 标签 + 数据 = 最终的网页
第二部分:最核心的几类标签
DedeCMS 的标签非常多,但 90% 的场景都离不开以下几类,我们先从最常用、最重要的开始。
全局标签
这类标签用于获取网站的全局信息,通常不受 {dede:} 包围。
{dede:global.cfg_webname/}: 获取网站后台设置的“网站名称”。{dede:global.cfg_weburl/}: 获取网站后台设置的“网站根网址”。{dede:global.cfg_keywords/}: 获取网站关键词。{dede:global.cfg_description/}: 获取网站描述。
示例 (在 head 标签中使用):

<head>{dede:global.cfg_webname/} - {dede:field.title/}</title>
<meta name="keywords" content="{dede:global.cfg_keywords/}" />
<meta name="description" content="{dede:global.cfg_description/}" />
</head>
文章列表标签
这是网站首页、列表页的“灵魂”,用于循环输出文章列表。
{dede:list}: 列表页专用标签,它本身是一个循环开始和结束的标记,必须成对出现。
基本结构:
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:list}
常用属性:
pagesize='10': 每页显示的文章数量,这是最常用的属性。titlelen='30': 标题显示的字符长度,超出部分用省略号代替。infolen='100': description)的显示字符长度。orderby='hot': 排序方式。sortrank(默认): 按发布日期排序。hot: 按点击量排序。pubdate: 按发布时间排序。lastpost: 按最后评论时间排序。
orderway='desc': 排序顺序。desc为降序(从大到小),asc为升序(从小到大)。
内部字段 (使用 [field:xxx/] 调用):

[field:title/]: 文章标题。[field:arcurl/]: 文章的完整链接URL。非常重要![field:pubdate/]: 文章发布时间,格式为 Unix 时间戳。[field:pubdate function="MyDate('Y-m-d', @me)"/]: 对发布时间进行格式化,Y-m-d是目标格式,@me代表原始值,这是最常用的写法。[field:description/]:[field:click/]: 文章点击量。[field:litpic/]: 文章的缩略图URL。
第三部分:常用列表标签详解
除了 {dede:list},还有几个功能相似的列表标签,用于不同的场景。
{dede:arclist} - 万能列表标签
{dede:arclist} 比 {dede:list} 更强大、更灵活,可以应用于任何地方,包括首页、列表页,甚至文章内容页。
基本结构:
{dede:arclist titlelen='30' row='10' orderby='pubdate'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
{dede:arclist} 的独有属性:
typeid: 指定栏目ID,只显示该栏目及其子栏目的文章,这是实现“指定栏目调用”的关键。row='10': 同pagesize,表示输出多少条记录。channelid: 指定模型ID。channelid='1'表示调用文章模型。flag='h': 指定特定属性的文章。h代表头条,c代表推荐,p代表图片,s代表幻灯片,可以组合使用,如flag='hc'。
示例:调用“产品展示”栏目下的5条推荐文章
{dede:arclist typeid='5' row='5' flag='c' titlelen='20'}
<div class="product-item">
<img src="[field:litpic/]" alt="[field:title/]" />
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
</div>
{/dede:arclist}
{dede:loop} - 自由循环标签
{dede:loop} 是一个“无中生有”的标签,它不依赖于 DedeCMS 的任何数据表,你需要自己指定数据表、查询条件和字段。
基本结构:
{dede:loop table='dede_archives' sort='pubdate' row='10' if=''}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:loop}
属性说明:
table: 要查询的数据表名,如dede_archives(文章表)、dede_arctype(栏目表)。sort: 排序字段。row: 循环次数。if: 查询条件 (SQL 的 WHERE 子句)。
示例:直接从文章表里调用10篇最新文章
{dede:loop table='dede_archives' sort='pubdate' row='10'}
<a href="/plus/view.php?aid=[id]">[title]</a>
{/dede:loop}
注意: 在 loop 标签中,直接使用字段名(如 id, title),而不是 [field:id/]。
第四部分:文章内容页标签
页(article_article.htm)的标签用于显示单篇文章的详细信息。
{dede:field.title/}: 当前文章的标题。{dede:field.pubdate function="MyDate('Y-m-d H:i:s', @me)"/}: 当前文章的发布时间。{dede:field.source/}: 文章来源。{dede:field.writer/}: 文章作者。{dede:field.click/}: 文章点击量。{dede:field.body/}: 最重要的标签,输出文章的正文内容。{dede:field.description/}:
第五部分:栏目导航标签
用于网站的导航栏,实现栏目循环和当前栏目高亮。
{dede:channel}
基本结构:
{dede:channel type='top' row='8'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
属性:
type='top': 调用顶级栏目,如果改为type='son',则调用当前栏目的子栏目。row='8': 调用8个栏目。currentstyle='active': 设置当前栏目的样式。'active'是样式类名。
示例 (带当前栏目高亮的导航):
<ul class="nav">
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
currentstyle 的语法: ~typename~ 会被替换为栏目名,~typelink~ 会被替换为栏目链接。
第六部分:分页标签
列表页和文章列表都需要分页。
{dede:pagelist listsize='4'/}: 显示分页的页码列表,如上一页 1 2 3 4 5 下一页。{dede:pagebreak/}: 在文章内容中,用于手动分割长文章,生成“下一页”链接。
第七部分:实战演练 - 制作一个首页
让我们用学到的知识来构建一个典型的首页。
index.htm 模板文件示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global.cfg_webname/}</title>
<meta name="keywords" content="{dede:global.cfg_keywords/}" />
<meta name="description" content="{dede:global.cfg_description/}" />
</head>
<body>
<!-- 顶部导航 -->
<div class="header">
<ul class="nav">
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
<!-- 幻灯片区域 (假设用 arclist 调用 flag='p' 的文章) -->
<div class="slider">
{dede:arclist flag='p' row='5'}
<img src="[field:litpic/]" alt="[field:title/]" />
{/dede:arclist}
</div>
<!-- 网站主内容区 - 文章列表 -->
<div class="main-content">
<h2>最新文章</h2>
<ul class="article-list">
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]" title="[field:title/]" target="_blank">[field:title/]</a>
<span class="date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:list}
</ul>
<!-- 分页 -->
<div class="page">
{dede:pagelist listsize='4'/}
</div>
</div>
<!-- 页脚 -->
<div class="footer">
<p>Copyright © {dede:global.cfg_webname/} All Rights Reserved.</p>
</div>
</body>
</html>
第八部分:进阶技巧与注意事项
- 自定义函数: 在
list或arclist中,我们使用了function="MyDate(...)",你可以在/include/extend.func.php文件里编写自己的 PHP 函数,然后在模板中调用,实现更复杂的数据处理。 - SQL 查询标签 (
{dede:sql}): 当内置标签无法满足需求时,可以直接执行 SQL 语句。{dede:sql sql='SELECT * FROM dede_archives ORDER BY click DESC LIMIT 10'} <a href="/plus/view.php?aid=[id]">[title]</a> {/dede:sql}警告: 使用此标签有安全风险,请务必对用户输入进行过滤,不要直接将变量拼接到 SQL 语句中。
- 嵌套循环: 你可以在一个循环内部再使用另一个循环,例如调用一个栏目的文章列表,然后每个栏目下面再调用其子栏目的文章。
- 缓存机制: DedeCMS 默认会对页面进行缓存以提高性能,在后台修改模板后,可能需要清除缓存才能看到效果。
DedeCMS 的模板标签系统虽然看起来有些“古老”,但它的设计思想非常清晰,通过标签将数据与表现层分离,使得网站维护和内容更新变得非常简单。
- 记住核心流程: 数据 -> 模板 -> 标签 -> 最终页面。
- 从
{dede:list}和{dede:arclist}开始: 这两个列表标签是日常开发中使用最频繁的,务必熟练掌握它们的属性和字段调用。 - 善用官方文档: DedeCMS 自带了一份标签手册,遇到不熟悉的标签可以去查阅。
- 多看、多练、多模仿: 最好的学习方法就是分析现有的优秀模板,然后自己动手去搭建和修改。
希望这篇详细的讲解能帮助你真正掌握 DedeCMS 模板制作!
