在模板文件中,使用 {dede:标签名 属性='值'}...{/dede:标签名}{dede:变量名/} 的形式来调用和显示从 PHP 后端传递过来的数据。

dedecms 模板输出变量
(图片来源网络,侵删)

下面我将从简单到复杂,分层次详细介绍 DedeCMS 的变量输出。


基础变量输出

这是最常见、最简单的用法,通常用于显示文章、栏目等基本信息。

单行文本/字符串变量

这类变量通常直接使用 {dede:变量名/} 输出。

示例: 在文章详情页 (article_article.htm) 中,输出文章的标题。

dedecms 模板输出变量
(图片来源网络,侵删)
<h1>{dede:field.title/}</h1>

常用单行变量:

  • {dede:field.title/}: 文章标题
  • {dede:field.shorttitle/}: 文章短标题
  • {dede:field.writer/}: 作者
  • {dede:field.source/}: 来源
  • {dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/}: 发布时间(带格式化)
  • {dede:field.seotitle/}: SEO标题
  • {dede:field.description/}: 文章摘要

注意: field 是一个特殊的标签,代表当前文章的字段。@me 是模板引擎中的一个内置变量,代表当前标签的值。

带格式化的变量

很多变量需要经过格式化处理才能正确显示,比如时间戳、长文本等,这通常通过 function 属性实现。

示例1:格式化时间戳

dedecms 模板输出变量
(图片来源网络,侵删)

field.pubdate 存储的是一个 Unix 时间戳,直接显示看不懂,我们需要用 MyDate 函数将其格式化。

发布时间:{dede:field.pubdate function='MyDate("Y-m-d", @me)'/}
<!-- 输出格式如:2025-10-27 -->
<!-- 更详细的格式 -->
{dede:field.pubdate function='MyDate("Y年m月d日 H:i:s", @me)'/}
<!-- 输出格式如:2025年10月27日 15:30:00 -->

示例2:截取摘要

field.description 可能为空,或者太长,我们可以用 cn_substr 函数来截取并指定长度。

<!-- 截取 description 的前100个字符 -->

示例3:自定义函数

你也可以调用自定义的 PHP 函数。

{dede:field.title function='MyCustomFunction(@me)'/}

循环列表变量输出

当需要输出一个列表(如文章列表、栏目列表、图集列表等)时,需要使用循环标签。

{dede:arclist} 文章列表标签

这是 DedeCMS 中最核心、最常用的标签之一,用于在任意页面调用文章列表。

基本用法:

{dede:arclist row='10' titlelen='30' typeid='1'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('m-d',@me)"/]</span>
    </li>
{/dede:arclist}

常用属性:

  • row='10': 调用 10 条记录。
  • typeid='1': 只调用 ID 为 1 的栏目及其子栏目的文章,不写则调用所有,len='30'`: 标题长度,截取 30 个字符。
  • orderby='hot': 排序方式,hot 为按点击量,pubdate 为按发布时间,sortrank 为按权重。

内部字段(循环体内使用):{dede:arclist}{/dede:arclist} 之间,使用 [field:xxx/] 来输出单条记录的字段。

  • [field:title/]: 文章标题
  • [field:arcurl/]: 文章链接(非常重要!)
  • [field:pubdate function="MyDate('Y-m-d',@me)"/]: 发布时间
  • [field:description function='cn_substr(@me, 100)'/]: 文章摘要
  • [field:litpic/]: 文章缩略图

{dede:list} 当前栏目文章列表标签

这个标签通常用于在栏目列表页(如 list_*.htm)中,分页显示本栏目的所有文章。

基本用法 (在 list_article.htm 中):

<ul>
    {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}
</ul>
<!-- 分页链接 -->
<div class="dede_pages">
    <ul>
        {dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'/}
    </ul>
</div>

arclist 的区别:

  • list 必须在栏目列表页中使用,它直接操作当前栏目的文章数据。
  • arclist 可以在任何页面使用,通过 typeid 指定数据来源,非常灵活。

高级与特殊变量输出

系统变量

输出 DedeCMS 系统的全局变量,如网站名称、路径等。

示例:

<!-- 网站首页链接 -->
<a href="{dede:global.cfg_basehost/}">{dede:global.cfg_webname/}</a>
<!-- 网站路径,用于引入CSS/JS -->
<link rel="stylesheet" href="{dede:global.cfg_cmsurl/}/static/css/style.css">
<!-- 会员中心链接 -->
<a href="{dede:global.cfg_memberurl/}/index.php">会员中心</a>

常用全局变量:

  • {dede:global.cfg_basehost/}: 网站域名,如 http://www.example.com
  • {dede:global.cfg_cmsurl/}: CMS 系统路径,如 http://www.example.com/dede
  • {dede:global.cfg_webname/}: 网站名称
  • {dede:global.cfg_powerby/}: 网页底部版权信息

IF 条件判断

在模板中根据条件输出不同的内容。

语法:

{dede:if 条件表达式}
    // 条件成立时输出
    <span>这是新发布的文章</span>
{else}
    // 条件不成立时输出
    <span>这是旧文章</span>
{/dede:if}

示例:判断文章是否为当天发布

{dede:if
    strptime(MyDate('Y-m-d', field.pubdate), MyDate('Y-m-d', @me)) == 0
}
    <span class="new-tag">NEW</span>
{/dede:if}

或者更简单的方式(利用PHP的 判断):

{dede:if MyDate('Y-m-d', field.pubdate) == MyDate('Y-m-d', @me)}
    <span class="new-tag">NEW</span>
{/dede:if}

注意:@me 在这里代表当前时间。

字段值替换(适用于特定字段)

有些字段(如 flag)存储的是逗号分隔的标识符,可以用 function='str_replace' 来进行替换显示。

**示例:将文章的 flag 字段中的 c 替换为 “推荐”,h 替换为 “头条”。

{dede:field.flag function='str_replace("c", "推荐", str_replace("h", "头条", @me))'/}

flag 的值是 h,c,那么输出就会是 “头条,推荐”。


自定义字段输出

这是 DedeCMS 强大扩展性的体现,当你添加了自定义字段后,如何输出它们?

普通文本/数字类型

直接调用即可,和普通字段一样。

假设你添加了一个自定义字段 myprice(价格)。

价格:{dede:field.myprice/} 元

单选/多选类型

这类字段在数据库中存储的是选项的值(如 a,b,c),需要用 function 进行处理。

假设你添加了一个自定义字段 mycolor(颜色),选项为“红色|a, 绿色|b, 蓝色|c”。

使用 str_replace 进行简单替换(不推荐,如果选项多会很麻烦)

{dede:field.mycolor function='str_replace("a", "红色", str_replace("b", "绿色", @me))'/}

使用 GetInnerText 和选项列表(推荐) 这是 DedeCMS 内置的、更优雅的方式,你需要先在后台自定义字段的“列表选项”中填写好映射关系。

{dede:field.mycolor function='GetInnerText(@me)'/}

mycolor 的值是 a,b,那么输出就会是 “红色, 绿色”。

文件/图片类型

如果自定义字段是上传文件或图片,它存储的是相对路径。

示例:输出一个自定义的图片字段 myphoto

<img src="{dede:field.myphoto/}" alt="自定义图片" />

为了更安全,通常会加上系统路径:

<img src="[field:global.cfg_cmsurl/][field:myphoto/]" alt="自定义图片" />

总结与最佳实践

  1. 区分场景

    • 在首页、封面页等任意页面调用其他栏目文章,用 {dede:arclist}
    • 栏目列表页显示本栏目文章,用 {dede:list}
    • 文章详情页显示当前文章信息,用 {dede:field.xxx/}
  2. 链接安全:凡是涉及到链接(文章链接、图片链接、CSS/JS链接),都尽量使用 [field:arcurl/]{dede:global.cfg_cmsurl/} 等动态获取的方式,而不是写死绝对路径,这样在网站迁移时才不会出错。

  3. 善用 function:时间格式化、字符串截取、字段替换等操作,优先使用 function 属性,它是在 PHP 端处理的,效率比用 JS 在前端处理高。

  4. 查阅官方文档:DedeCMS 的标签非常丰富,以上只是最常用的部分,遇到更复杂的需求,可以查阅 DedeCMS 官方提供的模板标签手册,那里有最权威的说明。

希望这份详细的指南能帮助你完全掌握 DedeCMS 的模板变量输出!