什么是 key 属性?
key 是 dede 标签的一个内置属性,它的作用是为循环中的每一个子项自动生成一个唯一的、从指定数字开始的序号(索引)。

(图片来源网络,侵删)
当你使用 key 后,你就可以在循环体内通过 [field:key/] 这个变量来获取当前项是第几个。
key 属性的语法
在循环标签中,直接添加 key='起始值' 即可。
{dede:标签名 key='起始值'}
<!-- 循环内容 -->
[field:key/]
{/dede:标签名}
key: 属性名,固定为key。'起始值': 你希望序号开始的数字,如果不指定,默认从0开始。
key 属性的作用和使用场景
key 属性在网页开发中非常实用,主要用于以下几种情况:
自动添加序号
这是最直接的功能,比如在文章列表前显示编号。

(图片来源网络,侵删)
示例:
假设你想让文章列表从 1 开始编号。
<ul>
{dede:arclist titlelen='30' row='5' key='1'}
<li>
[field:key]. [field:title/]
</li>
{/dede:arclist}
</ul>
输出结果:
<ul>
<li>1. 这是第一篇文章的标题</li>
<li>2. 这是第二篇文章的标题</li>
<li>3. 这是第三篇文章的标题</li>
<li>4. 这是第四篇文章的标题</li>
<li>5. 这是第五篇文章的标题</li>
</ul>
实现隔行变色(Zebra Stripes)
这是 key 最经典的应用之一,通过判断 key 的奇偶性来给不同的行添加不同的CSS类,从而实现视觉上的区分。
示例:

(图片来源网络,侵删)
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<th>序号</th>
<th>标题</th>
<th>发布时间</th>
</tr>
{dede:arclist titlelen='30' row='10'}
<tr class="[field:global name=autoindex runphp="yes"]
if(@me % 2 == 0){@me='even';}else{@me='odd';}"]">
<td>[field:key/]</td>
<td>[field:title/]</td>
<td>[field:pubdate function="MyDate('Y-m-d',@me)"/]</td>
</tr>
{/dede:arclist}
</table>
代码解析:
[field:global name=autoindex runphp="yes"]:autoindex是另一个与key类似的内置变量,它表示从1开始的序号,我们在这里用它来进行取模运算。if(@me % 2 == 0){@me='even';}else{@me='odd';}: 这是PHP代码,判断autoindex是否能被2整除,如果能,则设置@me(即当前值) 为'even',否则为'odd'。class="[field:global ...]": 将计算出的'even'或'odd'作为tr标签的class值。
CSS样式:
/* 偶数行样式 */
table tr.even {
background-color: #f9f9f9;
}
/* 奇数行样式 (默认就是白色,可以不写) */
table tr.odd {
background-color: #ffffff;
}
控制循环的特定行为
你可以通过 key 的值来对某一项或某几项进行特殊处理,比如只在第一项或最后一项添加某个元素。
示例: 只在第一篇文章前面加上“热门推荐”的标签。
{dede:arclist titlelen='30' row='5' key='1'}
[field:key runphp="yes"]
if(@me == 1) {
@me = '<span class="hot-tag">热门推荐</span>';
} else {
@me = '';
}
[/field:key]
<div>
[field:title/]
</div>
{/dede:arclist}
代码解析:
[field:key runphp="yes"]: 我们对key变量使用runphp。if(@me == 1): 判断当前key值是否为1。- 如果是,则
@me被赋值为一个HTML标签字符串。 - 如果不是,则
@me被赋值为空字符串。
key 与 autoindex 的区别
这是很多新手容易混淆的地方,虽然它们都用来表示序号,但有一些关键区别:
| 特性 | [field:key/] |
[field:global name='autoindex'/] |
|---|---|---|
| 定义方式 | 通过标签属性 key='起始值' 定义 |
内置全局变量,无需定义 |
| 起始值 | 可自定义,默认为 0 |
固定从 1 开始 |
| 作用域 | 只在当前 {dede:...} 标签内有效 |
只在当前 {dede:...} 标签内有效 |
| 典型用法 | [field:key/] |
[field:global name='autoindex'/] |
| PHP调用 | [field:key runphp='yes'] |
[field:global name='autoindex' runphp='yes'] |
简单总结:
- 如果你需要从 0 开始计数,或者需要一个可自定义起始值的序号,使用
key。 - 如果你只需要一个从1开始的简单序号,使用
autoindex更为方便和符合常规认知。
完整示例:{dede:arclist} 使用 key
下面是一个完整的、结合了 key 和 autoindex 的列表实例。
模板代码:
<h2>文章列表 (使用 key 从0开始)</h2>
<ul>
{dede:arclist titlelen='40' row='5' key='0'}
<li>
<strong>Key值:</strong> [field:key/] |
<strong>Autoindex值:</strong> [field:global name='autoindex'/] |
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
<hr>
<h2>文章列表 (使用 key 从1开始)</h2>
<ul>
{dede:arclist titlelen='40' row='5' key='1'}
<li>
<strong>Key值:</strong> [field:key/] |
<strong>Autoindex值:</strong> [field:global name='autoindex'/] |
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
可能的输出结果:
<h2>文章列表 (使用 key 从0开始)</h2>
<ul>
<li><strong>Key值:</strong> 0 | <strong>Autoindex值:</strong> 1 | <a href="/a/1.html">这是第一篇文章的标题</a></li>
<li><strong>Key值:</strong> 1 | <strong>Autoindex值:</strong> 2 | <a href="/a/2.html">这是第二篇文章的标题</a></li>
<li><strong>Key值:</strong> 2 | <strong>Autoindex值:</strong> 3 | <a href="/a/3.html">这是第三篇文章的标题</a></li>
<li><strong>Key值:</strong> 3 | <strong>Autoindex值:</strong> 4 | <a href="/a/4.html">这是第四篇文章的标题</a></li>
<li><strong>Key值:</strong> 4 | <strong>Autoindex值:</strong> 5 | <a href="/a/5.html">这是第五篇文章的标题</a></li>
</ul>
<hr>
<h2>文章列表 (使用 key 从1开始)</h2>
<ul>
<li><strong>Key值:</strong> 1 | <strong>Autoindex值:</strong> 1 | <a href="/a/1.html">这是第一篇文章的标题</a></li>
<li><strong>Key值:</strong> 2 | <strong>Autoindex值:</strong> 2 | <a href="/a/2.html">这是第二篇文章的标题</a></li>
<li><strong>Key值:</strong> 3 | <strong>Autoindex值:</strong> 3 | <a href="/a/3.html">这是第三篇文章的标题</a></li>
<li><strong>Key值:</strong> 4 | <strong>Autoindex值:</strong> 4 | <a href="/a/4.html">这是第四篇文章的标题</a></li>
<li><strong>Key值:</strong> 5 | <strong>Autoindex值:</strong> 5 | <a href="/a/5.html">这是第五篇文章的标题</a></li>
</ul>
从上面的例子可以清晰地看到 key 和 autoindex 的区别。
注意事项
- 嵌套循环:如果存在嵌套的循环标签(比如在
{dede:channelartlist}里使用{dede:arclist}),内外层的key和autoindex是相互独立的,不会互相干扰。 - 性能影响:
key和autoindex是DedeCMS模板引擎在解析时自动计算的,对性能影响极小,可以放心使用。 runphp的强大:当key或autoindex与runphp结合时,可以实现非常复杂的逻辑判断,是DedeCMS模板开发的高级技巧。
希望这个详细的解释能帮助你完全理解并熟练使用DedeCMS中的 key 属性!
