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

dedecms 模板 sql
(图片来源网络,侵删)

第一部分: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) 全局标签

dedecms 模板 sql
(图片来源网络,侵删)

这些标签可以在任何模板页面中使用。

  • {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 查询主要用于两个场景:

  1. 后台数据管理:在“核心” -> “内容维护” -> “SQL命令行工具”中执行SQL,用于批量修改、删除、添加数据。
  2. 前台模板调用:在模板中使用 {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} 与其他标签结合,实现复杂的数据展示。

场景:在一个自定义的页面上,同时显示“最新文章”、“热门文章”和“推荐文章”。

  1. 创建一个自定义页面模板/templets/default/custom_page.htm
  2. 在模板中分别使用 {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命令操作数据库前,请务必备份数据库!