核心方法:使用 array 定义标签属性
DedeCMS的标签系统非常灵活,绝大多数标签的属性都可以通过一个PHP数组来动态赋值,这个数组就是 array。
基本语法
{dede:标签名 属性1='值1' 属性2='值2' ...}
...标签内容...
{/dede:标签名}
当你需要使用变量时,只需要将 '值' 替换为 变量名 即可。
{dede:标签名 属性1=$变量名 属性2=$another_var ...}
...标签内容...
{/dede:标签名}
关键点:
- 变量来源:这些
$变量名通常来自PHP代码块,最常见的是在{dede:getdata}或{dede:loop}循环中,从$fields数组里获取字段值。 - 引号:当属性值是固定的字符串时,需要用单引号 包裹,当使用变量时,直接写
$变量名,不需要再加引号。
在列表页调用当前栏目的信息(最常用)
这是最经典的需求,比如在列表页的标题前加上“栏目名称:”。
假设你的栏目名称字段是 typename。
模板代码示例 (list_article.htm):
<h2>当前栏目:{dede:field.typename/}</h2>
{dede:list pagesize='10'}
<li>
<!-- 这里调用当前文章的标题,标题前加上当前栏目的名称 -->
<a href="[field:arcurl/]">
{dede:field name='title'/}
</a>
<!-- 这里调用当前文章的发布时间,并格式化为 Y-m-d -->
<span>[field:pubdate function='MyDate("Y-m-d",@me)'/]</span>
</li>
{/dede:list}
代码解析:
{dede:field.typename/}:这是获取当前栏目名称的标签,它本身就是一个变量。{dede:list}:这是一个循环标签,它会循环出当前栏目下的所有文章。- 在
{dede:list}的循环体内,[field:xxx/]这样的标签会自动获取到当前正在循环的文章的字段值,这里的field就是循环体内部的变量。
在文章页调用当前文章的字段(单个变量)
在文章详情页,你需要展示文章的各个字段,这些字段都是变量。
模板代码示例 (article_article.htm):
<h1>{dede:field.title/}</h1>
<div class="info">
作者:{dede:field.writer/}
时间:{dede:field.pubdate function='MyDate("Y-m-d H:i:s",@me)'/}
来源:{dede:field.source/}
点击:{dede:field.click/}
</div>
<div class="content">
{dede:field.body/}
</div>
代码解析:
{dede:field.字段名/}:在文章页,field这个对象就代表了当前文章的所有字段。field.title就是文章标题,field.body就是文章正文。function='MyDate(...)':这是一个非常重要的功能,它允许你对字段值进行PHP函数处理,这里就是用MyDate函数将时间戳@me(字段本身)格式化为易读的日期。
为 arclist 等标签传入动态属性(核心技巧)
这是“为标签加入变量”最强大的应用场景,你想让列表的条数由后台参数控制,而不是在模板里写死。
假设你有一个自定义的模型,在文章内容页可以设置一个“推荐文章数量”的字段,tjsl。
页 (article_article.htm) 获取这个变量并传递给 arclist
<h2>相关推荐</h2>
{dede:php}
// 获取当前文章的“推荐数量”字段值
$tuijian_num = $this->Fields['tjsl'];
// 如果没有设置,则给一个默认值,比如5
if(empty($tuijian_num)) $tuijian_num = 5;
{/dede:php}
<!--
将PHP变量 $tuijian_num 传递给 arclist 标签的 row 属性
注意:这里我们使用 {$tuijian_num} 这种语法,这是在Dede模板中直接输出PHP变量值的标准方式
-->
{dede:arclist row='{$tuijian_num}' titlelen='30' orderby='pubdate'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
代码解析:
{dede:php}...{/dede:php}:这是一个执行任意PHP代码的标签块。$this->Fields:在文章页模板中,$this指向了模板引擎对象,$this->Fields是一个包含当前文章所有字段值的PHP数组。{$tuijian_num}:在Dede模板引擎中,使用 大括号包裹一个PHP变量名,会将其值输出并替换到模板中,这个值会直接作为arclist标签的row属性的值。
在列表页调用当前栏目的某个字段
假设你在后台为每个栏目添加了一个“列表显示条数”字段 list_num。
模板代码示例 (list_article.htm):
{dede:php}
// 获取当前栏目的“列表显示条数”字段值
$list_rows = $this->Type->Fields['list_num'];
// 如果没有设置,则给一个默认值,比如10
if(empty($list_rows)) $list_rows = 10;
{/dede:php}
<!--
将PHP变量 $list_rows 传递给 list 标签的 pagesize 属性
-->
{dede:list pagesize='{$list_rows}'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解析:
$this->Type:在列表页模板中,$this->Type是一个包含当前栏目信息的PHP对象。$this->Type->Fields:这个对象包含了当前栏目的所有自定义字段。
结合 if 判断实现更复杂的逻辑
你可以结合 {dede:if} 标签,根据变量的值来决定是否显示某些内容。
示例:只在文章有缩略图时才显示缩略图。
模板代码示例:
{dede:list pagesize='10'}
<li>
<!-- 使用 if 判断 litpic 字段是否为空 -->
{dede:if $fields['litpic'] != ''}
<img src="[field:litpic/]" alt="[field:title/]" />
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解析:
{dede:if $fields['litpic'] != ''}:在{dede:list}循环体内,$fields数组代表了当前文章的所有字段,这里我们判断litpic(缩略图字段)是否不为空。- 注意:在
{dede:list}内部,推荐使用[field:xxx/]语法,但在if判断中,直接使用$fields['xxx']是更直接和高效的方式。
总结与最佳实践
-
明确变量来源:
- 文章页:当前文章字段在
$this->Fields中,标签用{dede:field.字段名/}。 - 列表页:当前栏目字段在
$this->Type->Fields中;当前循环的文章字段在$fields中,标签用[field:字段名/]。 - 全局:可以通过
{dede:php}执行PHP代码来获取任意变量。
- 文章页:当前文章字段在
-
变量赋值方式:
- 直接赋值:
{dede:arclist row=$my_var}。 - 模板输出:
{dede:arclist row='{$my_var}'},当变量值来自{dede:php}块时,推荐使用这种方式。
- 直接赋值:
-
处理函数:善用
function属性,如function='MyDate("Y-m-d",@me)',可以极大地扩展标签功能。 -
安全性:如果变量来自用户输入(如URL参数),一定要进行过滤和转义,防止XSS等安全漏洞,可以使用
htmlspecialchars函数。
通过掌握这些方法,你就可以让DedeCMS的模板变得非常智能和强大,轻松应对各种复杂的网站需求。
