datalist 是 DedeCMS 中一个非常核心且常用的列表标签,主要用于在页面上以列表形式(如文章列表、产品列表、图片列表等)循环输出数据,它的作用类似于 PHP 中的 foreach 循环,但使用了 DedeCMS 的模板标签语法,使得在模板文件中调用数据变得非常简单和高效。
datalist 的基本语法
datalist 标签通常由两部分组成:<dl> 标签和其内部的 <dd>
{dede:datalist sort='...'}
<dd>
<!-- 这里是循环输出的单条内容模板 -->
<!-- 文章标题、缩略图、发布时间等 -->
</dd>
{/dede:datalist}
{dede:datalist ...}: 这是循环的开始标签,可以包含多个属性来控制数据查询。
<dd>: 这是循环体内的标签,每循环一次,就会输出一个 <dd> 及其内部的内容,你可以使用其他标签(如 arclist 的子标签)来获取当前条目的具体信息。
{/dede:datalist}: 这是循环的结束标签。
datalist 的常用属性
datalist 的强大之处在于其丰富的属性,可以精确地控制要获取哪些数据、如何排序、分页等。
| 属性名 |
含义 |
示例值 |
说明 |
typeid |
栏目ID |
1, 1,2,3 |
核心属性,指定要获取哪个或哪些栏目下的内容,不填则获取所有栏目的内容。 |
row |
获取记录数 |
10, 20 |
每页显示多少条数据,通常与分页标签配合使用。 |
infolen |
摘要长度 |
120, 200 |
截取文章摘要(description)的字符长度。 |
orderby |
排序方式 |
pubdate (默认), hot, click, id |
按什么字段排序。pubdate (发布时间), hot (浏览量), click (点击率), id (文章ID), sortrank (自定义排序) |
orderway |
排序方向 |
desc (默认), asc |
desc (降序,从大到小/新到旧), asc (升序,从小到大/旧到新) |
channelid |
模型ID |
1 (文章), -1 (所有模型) |
指定要获取的内容模型。1 是普通文章模型,-1 表示获取所有模型的数据。 |
limit |
起始位置与记录数 |
0,10, 10,20 |
用于分页,格式为 起始条数,显示条数。{dede:page/} 标签会自动计算这个值。 |
flag |
特定属性 |
h, c, p |
筛选具有特定属性的内容。h (头条), c (推荐), p (图片), s (滚动) 等,可组合如 hc。 |
subday |
天数筛选 |
7, 30 |
只获取最近 N 天内发布的内容。 |
keyword |
关键词筛选 |
织梦,DedeCMS |
或关键词包含指定文字的内容。 |
datalist 的常用子标签(在 <dd> 内部使用)
在 <dd> 标签内部,你可以使用 DedeCMS 的各种字段标签来获取当前循环条目的具体信息。
| 子标签 |
含义 |
示例 |
[field:title/] |
|
<a href="[field:arcurl/]">[field:title/]</a> |
[field:description/] |
文章摘要 |
[field:description function='cn_substr(@me, 100)'/] |
[field:pubdate function='MyDate('Y-m-d', @me)'/] |
发布时间 |
MyDate 是自定义函数,格式化日期。 |
[field:click/] |
点击次数 |
<span>点击: [field:click/]</span> |
[field:litpic/] |
缩略图地址 |
<img src="[field:litpic/]" alt="[field:title/]"> |
[field:arcurl/] |
文章链接 |
这是获取文章详情页地址最重要的标签。 |
[field:id/] |
文章ID |
[field:id/] |
[field:typeid/] |
所属栏目ID |
[field:typeid/] |
[field:typename/] |
所属栏目名称 |
[field:typename/] |
[field:typelink/] |
所属栏目链接 |
<a href="[field:typelink/]">[field:typename/]</a> |
实战示例
示例1:调用文章列表(最常用)
假设我们要在首页调用 ID 为 1 的栏目下的最新 10 篇文章。
模板代码 (index.htm):
<h2>最新文章</h2>
<ul>
{dede:datalist typeid='1' row='10' orderby='pubdate' orderway='desc'}
<li>
<span class="date">[field:pubdate function='MyDate('m-d', @me)'/]</span>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:datalist}
</ul>
说明:
typeid='1': 只调用栏目ID为1的文章。
row='10': 每页显示10条。
orderby='pubdate' orderway='desc': 按发布时间降序排列(最新的在前)。
示例2:带缩略图和摘要的文章列表
<div class="article-list">
{dede:datalist typeid='2' row='6' titlelen='40' infolen='120'}
<dd class="article-item">
<div class="thumb">
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]">
</a>
</div>
<div class="info">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="desc">[field:description/]</p>
<p class="meta">
<span>[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
<span>阅读: [field:click/]</span>
</p>
</div>
</dd>
{/dede:datalist}
</div>
示例3:结合分页标签 {dede:page/}
datalist 本身只负责输出列表数据,分页功能需要由分页标签 {dede:page/} 来实现。
模板代码:
<!-- 列表内容区域 -->
{dede:datalist typeid='1' row='10'}
<dd>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</dd>
{/dede:datalist}
<!-- 分页区域 -->
<div class="dede_pages">
<ul class="pagelist">
{dede:page/}
</ul>
</div>
说明:
- 当
{dede:datalist} 和 {dede:page/} 同时存在时,DedeCMS 会自动处理分页逻辑。
datalist 的 limit 属性会被 {dede:page/} 自动填充,你无需手动设置。
- 你需要确保在后台的“频道模型” -> “内容分页选项”中,为该栏目设置了“列表每页显示条数”,否则分页可能不生效。
datalist 与 arclist 的区别
很多新手会混淆 datalist 和 arclist,它们都是列表标签,但有重要区别:
| 特性 |
arclist (文章列表) |
datalist (数据列表) |
| 主要用途 |
调用文章模型。 |
调用任意模型,包括自定义模型。 |
| 灵活性 |
较为固定,专为文章优化。 |
非常灵活,可以配合 SQL 查询,功能更强大。 |
| 性能 |
性能较好,有专门的缓存机制。 |
如果使用 sql 属性,性能取决于 SQL 查询效率。 |
| 常用场景 |
首页、栏目页调用普通文章列表。 |
调用产品、软件下载、图集等自定义模型列表;或需要复杂筛选时。 |
datalist 的 sql 属性(高级用法)
datalist 最强大的地方在于它可以通过 sql 属性直接执行自定义的 SQL 语句。
{dede:datalist sql='SELECT * FROM dede_archives WHERE typeid=3 ORDER BY pubdate DESC LIMIT 0, 5'}
<dd>
<a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
</dd>
{/dede:datalist}
注意:
- 使用
sql 属性时,typeid、row 等其他属性可能会失效。
- 表前缀(如
dede_)需要根据你的实际安装情况修改。
- 直接写 SQL 有一定的安全风险,请确保输入经过过滤。
datalist 是 DedeCMS 的万能列表标签,用于循环输出数据。
- 通过
typeid, row, orderby 等属性可以轻松控制数据源和显示方式。
- 在
<dd> 内部使用 [field:xxx/] 子标签来获取单条数据的各个字段。
- 它与
{dede:page/} 标签配合使用可以实现分页功能。
- 相比
arclist,datalist 更通用,特别是对于调用自定义模型的数据或进行复杂查询时,优势明显。
掌握 datalist 标签是进行 DedeCMS 模板开发的基础和关键一步。