这两者是 Dedecms 的核心,一个负责前端展示,一个负责后端数据,理解它们如何协同工作,是进行 Dedecms 开发、二次开发和优化的关键。

第一部分:Dedecms 模板
Dedecms 的模板系统非常灵活,采用了类似 PHP 的模板引擎语法,它允许开发者将网站的 HTML 结构与 PHP 逻辑和数据分离开来。
模板文件位置
Dedecms 的模板文件主要存放在 /templets/ 目录下,默认情况下,后台会为每个模型创建一个独立的模板目录,
/templets/default/:默认模板的根目录。/templets/default/index.htm:首页模板。/templets/default/article_article.htm页模板。/templets/default/list_article.htm:文章列表页模板。/templets/default/目录下还会有style/(存放CSS)、images/(存放图片)、js/(存放JavaScript)等子目录。
模板核心标签
模板文件中使用 {dede:标签名 属性='值'} 这样的语法来调用数据和执行逻辑。
a) 全局标签

这些标签可以在任何模板页面中使用。
{dede:global name='cfg_webname'/}:调用网站名称。{dede:global name='cfg_weburl'/}:调用网站网址。{dede:include filename='head.htm'/}:包含另一个模板文件(通常是头部)。{dede:include filename='footer.htm'/}:包含另一个模板文件(通常是底部)。
b) 列表页标签
用于在栏目列表页或首页的特定栏目区域循环输出内容。
-
{dede:arclist typeid='' row='' titlelen='' orderby=''}:文章列表标签,最核心的标签之一。typeid='栏目ID':指定要调用的栏目ID,为空时表示调用所有栏目。row='10':输出的记录条数。titlelen='30'长度。orderby='pubdate':排序方式,如pubdate(发布日期)、hot(点击量)、id(ID)等。- 内部循环变量:
[field:title/]。[field:arcurl/]:文章链接。[field:pubdate function="MyDate('Y-m-d',@me)"/]:发布日期,使用function进行格式化。[field:description/]:[field:litpic/]:文章缩略图。
示例(首页调用最新5条文章):
<ul> {dede:arclist row='5' orderby='pubdate'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:arclist} </ul>
c) 文章内容页标签
用于在文章详情页调用当前文章的具体信息。
{dede:field name='title'/}。{dede:field name='pubdate' function='GetDateMk(@me)'/}:发布日期。{dede:field name='body'/}:文章正文内容。{dede:field name='description'/}:{dede:field name='keywords'/}:文章关键词。{dede:php}...{/dede:php}:可以在模板中直接写 PHP 代码(不推荐,但有时很有用)。
d) 其他常用标签
{dede:channel}:用于调用栏目列表。{dede:flink}:用于调用友情链接。{dede:pagelist listsize='4' listitem=''/}:用于生成分页列表。
第二部分:Dedecms SQL
在 Dedecms 中,SQL 查询主要用于两个场景:
- 后台数据管理:在“核心” -> “内容维护” -> “SQL命令行工具”中执行SQL,用于批量修改、删除、添加数据。
- 前台模板调用:在模板中使用
{dede:sql}标签,直接从数据库中查询并展示数据。
后台 SQL 命令行工具
这是最直接的 SQL 使用方式。
-
批量修改文章标题:将所有包含“旧标题”的文章标题替换为“新标题”。
UPDATE dede_archives SET title = REPLACE(title, '旧标题', '新标题') WHERE title LIKE '%旧标题%';
注意:
dede_是 Dedecms 默认的数据库表前缀,如果你的网站修改过,请使用你自己的前缀,执行前务必备份数据库! -
批量删除某个栏目下的所有文章:
-- 第一步:删除文章数据 DELETE FROM dede_archives WHERE typeid IN (SELECT id FROM dede_arctype WHERE reid = 10); -- 假设10是父栏目ID -- 第二步:删除栏目(谨慎操作) -- DELETE FROM dede_arctype WHERE reid = 10;
前台模板 SQL 查询 ({dede:sql})
这是最强大也最灵活的功能,允许你在不修改PHP代码的情况下,在模板页直接展示数据库中的任意数据。
基本语法:
{dede:sql sql='查询语句'}
[field:字段名/]
{/dede:sql}
a) 查询单个值
想显示网站的总文章数。
网站共有文章:{dede:sql sql='SELECT COUNT(*) as c FROM dede_archives'}[field:c/]{/dede:sql} 篇。
b) 查询并循环输出列表
想显示点击量最高的5篇文章(即使它们不在当前栏目)。
<h3>热门文章</h3>
<ul>
{dede:sql sql='SELECT id, title, click FROM dede_archives ORDER BY click DESC LIMIT 0,5'}
<li>
<a href="[field:php]echo GetArcUrl(@me);[/field:php]">[field:title/]</a> (点击:[field:click/])
</li>
{/dede:sql}
</ul>
说明:这里用到了
[field:php]标签来调用PHP函数GetArcUrl(),因为[field:arcurl/]在{dede:sql}中默认不可用。@me代表当前行的数据,这里是id字段。
c) 关联查询
想显示某个栏目及其子栏下的文章总数。
{dede:sql sql='SELECT a.id, a.typename, (SELECT COUNT(*) FROM dede_archives WHERE typeid=a.id) as arc_count FROM dede_arctype a WHERE a.reid=10'}
<p>栏目:[field:typename/],文章数:[field:arc_count/]</p>
{/dede:sql}
d) 带条件查询
只显示今天发布的文章。
<h3>今日发布</h3>
<ul>
{dede:sql sql='SELECT title, pubdate FROM dede_archives WHERE pubdate >= UNIX_TIMESTAMP(CURDATE()) ORDER BY pubdate DESC'}
<li>[field:title/] - [field:pubdate function="MyDate('m-d',@me)"/]</li>
{/dede:sql}
</ul>
第三部分:模板与 SQL 的结合(高级应用)
最强大的用法是将 {dede:sql} 与其他标签结合,实现复杂的数据展示。
场景:在一个自定义的页面上,同时显示“最新文章”、“热门文章”和“推荐文章”。
- 创建一个自定义页面模板,
/templets/default/custom_page.htm。 - 在模板中分别使用
{dede:sql}调用不同的数据。
custom_page.htm 示例代码:
<!DOCTYPE html>
<html>
<head>自定义数据展示页</title>
<meta charset="UTF-8">
</head>
<body>
<h1>欢迎来到自定义数据页</h1>
<!-- 最新文章 -->
<div class="section">
<h2>最新文章</h2>
<ul>
{dede:sql sql='SELECT id, title, pubdate FROM dede_archives ORDER BY pubdate DESC LIMIT 5'}
<li>
<a href="[field:php]echo GetArcUrl(@me);[/field:php]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:sql}
</ul>
</div>
<hr>
<!-- 热门文章 -->
<div class="section">
<h2>热门文章</h2>
<ul>
{dede:sql sql='SELECT id, title, click FROM dede_archives ORDER BY click DESC LIMIT 5'}
<li>
<a href="[field:php]echo GetArcUrl(@me);[/field:php]">[field:title/]</a>
<span>点击:[field:click/]</span>
</li>
{/dede:sql}
</ul>
</div>
<hr>
<!-- 推荐文章 (通过flag字段判断) -->
<div class="section">
<h2>推荐文章</h2>
<ul>
{dede:sql sql='SELECT id, title FROM dede_archives WHERE flag LIKE "%c%" LIMIT 5'}
<li>
<a href="[field:php]echo GetArcUrl(@me);[/field:php]">[field:title/]</a>
</li>
{/dede:sql}
</ul>
</div>
</body>
</html>
在 Dedecms 后台的“生成” -> “一键更新网站” -> “更新页面”中,选择“更新自定义HTML”,然后找到并更新这个页面,或者直接通过页面地址访问。
总结与注意事项
| 特性 | Dedecms 模板 | Dedecms SQL |
|---|---|---|
| 目的 | 数据展示,将后端数据渲染到前端HTML。 | 数据查询,直接从数据库获取数据。 |
| 位置 | 主要在 /templets/ 目录下的 .htm 文件中。 |
主要在后台的“SQL命令行工具”或模板的 {dede:sql} 标签中。 |
| 安全性 | 模板标签本身是安全的,但需注意对用户输入的过滤。 | 风险极高!前台SQL注入是常见漏洞,必须对用户输入进行严格过滤和转义。 |
| 灵活性 | 灵活,但受限于系统提供的标签。 | 极高,可以执行任何有效的SQL语句。 |
| 性能 | 模板引擎解析有一定开销,但已优化。 | 复杂查询对数据库压力大,频繁或复杂的SQL查询会拖慢网站速度。 |
重要提示:
- 安全第一:在使用
{dede:sql}时,绝对不要将用户提交的变量直接拼接到SQL语句中,必须使用Dedecms提供的过滤函数或进行严格的转义,防止SQL注入。 - 性能优化:避免在首页等高并发页面使用复杂的
{dede:sql}查询,如果数据不常变化,可以考虑将查询结果缓存。 - 备份:在任何时候通过后台执行SQL命令操作数据库前,请务必备份数据库!
