{dede:datalist} 标签是什么?
{dede:datalist} 是一个循环输出标签,它的作用类似于其他编程语言中的 for 循环,它会从数据库中查询出符合条件的一组数据,然后将这组数据中的每一条记录,按照 {dede:datalist} 标签内部定义的模板结构,循环渲染一遍,最终生成完整的HTML列表页面。

核心功能: 循环遍历数据集,并格式化输出。
基本语法结构
{dede:datalist} 的基本结构如下:
{dede:datalist}
<!-- 这里是循环体内的模板代码,会被重复执行 -->
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:datalist}
{dede:datalist}:循环开始标签。- 循环体,这里可以包含HTML标签和其他织梦标签。
{/dede:datalist}:循环结束标签。
核心属性
{dede:datalist} 的行为主要由其属性控制,最常用和最重要的属性是 sql。
sql 属性
sql 属性允许你直接编写SQL查询语句来获取数据,这给了你极大的灵活性,可以查询任意表和字段。

语法:
sql="你的SQL查询语句"
示例1:查询文章列表
{dede:datalist sql="SELECT id, title, pubdate, arcurl FROM dede_archives WHERE channel=1 ORDER BY id DESC LIMIT 10"}
<div class="post-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
</div>
{/dede:datalist}
说明:
SELECT id, title, pubdate, arcurl FROM dede_archives:从dede_archives(文章主表) 中查询id,title,pubdate,arcurl这四个字段。WHERE channel=1:筛选条件,只查询内容模型ID为1的文章(文章模型”)。ORDER BY id DESC:按文章ID降序排列,即最新的文章在前。LIMIT 10:只获取最新的10条记录。
示例2:查询自定义模型数据
假设你有一个产品模型,其数据表为 dede_product。
{dede:datalist sql="SELECT id, pname, price, brand FROM dede_product ORDER BY price ASC"}
<div class="product">
<h3>[field:pname/]</h3>
<p>价格:¥[field:price/]</p>
<p>品牌:[field:brand/]</p>
</div>
{/dede:datalist}
内部字段调用 [field:字段名/]
在 {dede:datalist} 的循环体内,使用 [field:字段名/] 来输出当前循环到的那条记录的指定字段的值。
字段来源:
sql查询的字段:如上面的[field:title/],[field:pubdate/]。- 系统关键字段:即使
sql没有查询,一些关键字段也可以直接使用,[field:id/]:记录的ID。[field:arcurl/]:文章的链接(适用于文章模型)。[field:fulltitle/]:文章完整标题(不带副标题)。[field:typelink/]:栏目链接。
字段格式化:function 属性
[field:字段名/] 还可以通过 function 属性调用PHP函数来对输出值进行处理。
语法:
[field:字段名 function="处理函数(@me)"/]
常用 function 示例:
-
日期格式化:
[field:pubdate function="MyDate('Y-m-d H:i:s', @me)"/]将
pubdate(时间戳) 格式化为年-月-日 时:分:秒。 -
截取字符串:
[field:description function="cn_substr(@me, 100)"/]
截取
description( 字符串的前100个字符。 -
去除HTML标签:
[field:body function="htmlspecialchars(@me)"/]
对
body(文章内容) 进行HTML实体转义,防止XSS攻击,或者使用strip_tags()函数去除所有HTML标签。 -
自定义函数: 你可以在
/include/helpers/目录下创建自定义的PHP函数文件(如extention.helper.php),然后在模板中调用。[field:title function="MyCustomFunction(@me)"/]
分页功能
{dede:datalist} 本身不直接处理分页,但它通常与分页标签 {dede:pagelist} 配合使用,实现分页的关键在于 sql 语句中必须包含 LIMIT 子句。
分页实现步骤:
- 在列表页模板文件中(如
list_article.htm),使用{dede:datalist}并在sql中使用LIMIT。 - 在
{dede:datalist}循环结束后,添加{dede:pagelist}
示例模板 (list_article.htm):
<html>
<head>{dede:field.title/}</title>
</head>
<body>
<h1>{dede:field.title/}</h1>
<!-- 文章列表循环 -->
<ul>
{dede:datalist sql="SELECT id, title, pubdate, arcurl FROM dede_archives WHERE channel=1 ORDER BY id DESC LIMIT 0,10"}
<li>
<a href="[field:arcurl/]" target="_blank">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:datalist}
</ul>
<!-- 分页条 -->
<div class="page-nav">
{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}
</div>
</body>
</html>
说明:
LIMIT 0,10:这里的0是起始位置,10是每页显示的数量。{dede:pagelist}:会自动解析URL中的page参数,并生成上一页、下一页、页码等链接。listitem:用于控制显示哪些分页元素。listsize:控制页码显示的数量。
与 {dede:list} 的区别
很多新手会混淆 {dede:datalist} 和 {dede:list},这是一个非常重要的区别点:
| 特性 | {dede:datalist} |
{dede:list} |
|---|---|---|
| 数据来源 | 自定义 sql 语句,可查询任意表。 |
固定,查询 dede_archives 表,并根据栏目、频道等系统参数自动生成 WHERE 条件。 |
| 灵活性 | 极高,可以跨表查询,实现复杂的业务逻辑。 | 较低,主要用于标准的文章列表,灵活性受限于系统预设。 |
| 使用场景 | 自定义列表页、产品列表、下载列表、调用其他模型数据等。 | 标准的文章列表页,如首页、栏目页。 |
| 分页 | 需要手动在 sql 中写 LIMIT,并配合 {dede:pagelist}。 |
自动处理分页,无需手动写 LIMIT。 |
| 性能 | sql 写得不好,性能可能较差。 |
性能较好,因为经过了系统优化。 |
简单总结:
- 如果你的列表是标准文章,并且是按栏目分类的,直接用
{dede:list},最简单。 - 如果你的列表需要自定义查询条件、查询非文章模型、或者需要跨表关联数据,那么必须用
{dede:datalist}。
完整示例:调用产品列表并分页
假设你有一个产品模型,数据表为 dede_product,包含 pid, pname, price, brand, pic 等字段。
- 创建一个模板文件
list_product.htm
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">产品列表 - {dede:field.seotitle/}</title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div class="container">
<h1>我们的产品</h1>
<div class="product-list">
{dede:datalist sql="SELECT pid, pname, price, brand, pic FROM dede_product ORDER BY pid DESC LIMIT 0,12"}
<div class="product-item">
<img src="[field:pic/]" alt="[field:pname/]">
<h3>[field:pname/]</h3>
<p class="brand">品牌:[field:brand/]</p>
<p class="price">价格:<strong>¥[field:price/]</strong></p>
<a href="/product-detail.php?id=[field:pid/]" class="view-detail">查看详情</a>
</div>
{/dede:datalist}
</div>
<div class="pagination">
{dede:pagelist listitem="info,index,end,pre,next" listsize="3"}
</div>
</div>
</body>
</html>
- 在后台创建一个自定义列表页
- 进入后台 -> 核心 -> 频道模型 -> 自定义列表。
- 列表名称:填写一个名称,如“产品列表”。
- 列表模板:选择你刚创建的
list_product.htm。 - 命名规则:可以自定义,如
product-{page}.html。 - 附加SQL条件:这里可以留空,因为条件已经写在模板的
sql属性里了。 - 保存后,系统会生成一个列表页链接,你就可以访问这个产品列表页了。
{dede:datalist} 是织梦CMS中一个功能极其强大的标签,它打破了 {dede:list} 的限制,让开发者可以自由地从数据库中获取和展示数据,掌握它的核心在于:
- 理解
sql属性:如何编写高效的SQL查询语句。 - 掌握
[field:xx/]:如何在循环体内调用和格式化字段。 - 学会配合分页:如何与
{dede:pagelist}协作实现数据分页。 - 区分
{dede:list}:知道在什么场景下使用哪个标签。
希望这份详细的解析能帮助你完全理解并熟练运用 {dede:datalist}
