DedeCMS 的自定义表单功能非常强大,但默认的前台提交和后台管理(在“自定义表单”栏目下)对于数据展示和二次开发来说比较有限,我们需要在网站的前台页面(如列表页、详情页)中查询并展示这些表单数据。

主要有以下几种查询场景和方法:
在后台直接查看和管理数据(最简单)
这是最基础的方式,适用于管理员直接查看所有提交的记录。
- 登录 DedeCMS 后台。
- 在左侧菜单栏找到 “核心” -> 发布” -> “自定义表单”。
- 点击进入后,你会看到所有你创建的自定义表单列表。
- 找到你想要查询的那个表单,点击后面的 “管理” 按钮。
- 你可以看到所有用户提交的数据,默认会按提交时间倒序排列。
- 筛选:通常顶部会有一个简单的筛选框,可以按
aid(主键ID)或ip(提交IP)进行快速查找。 - 排序:点击列表头部的字段名(如
dtime)可以进行升序或降序排序。 - 搜索:这个自带的搜索功能很弱,只能按ID或IP搜,无法按内容搜,如果需要更强大的后台搜索,通常需要修改程序或使用第三方插件。
- 筛选:通常顶部会有一个简单的筛选框,可以按
优点:无需任何代码,直接可见。 缺点:功能有限,无法在前台展示,不适合大量数据的筛选。
在前台页面以列表形式展示所有数据(最常用)
这是最常见的用法,比如做一个“在线留言”列表页、“人才招聘”申请列表页等。

实现这个功能需要修改一个模板文件:/templets/default/list_表单id.htm
步骤:
-
获取你的表单
id: 登录后台,进入“自定义表单”,鼠标悬停在你需要查询的表单“管理”链接上,浏览器状态栏会显示类似dede/plus/List.php?aid=1的链接,这里的aid=1中的1就是你的表单id。 -
创建或修改模板文件: 在你的模板文件夹
/templets/default/下,创建一个名为list_你的表单id.htm的文件,如果你的表单id是5,就创建list_5.htm。 -
编写模板代码: 在
list_5.htm文件中,使用 DedeCMS 的dede:list标签进行循环查询。dede:list的底层循环变量和arclist类似,但主要针对自定义表单的数据。示例代码 (list_5.htm):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>我的留言列表</title> </head> <body> <h1>用户留言列表</h1> {dede:list pagesize='10' titlelen='50'} <!-- dede:list 标签用于循环查询自定义表单数据。 pagesize='10' 表示每页显示10条数据。 titlelen='50' 表示标题字符截取长度(如果你的表单有标题字段的话)。 --> <div class="msg-item"> <!-- 循环变量说明: [field:id] -> 当前记录的ID (aid) [field:title] -> 当前记录的标题字段 (如果你的表单有名为'title'的字段) [field:uname] -> 当前记录的姓名字段 (如果你的表单有名为'uname'的字段) [field:email] -> 当前记录的邮箱字段 [field:content] -> 当前记录的内容字段 (如果你的表单有名为'content'的字段) [field:ip] -> 提交时的IP地址 [field:dtime] -> 提交时间,格式为 Unix 时间戳,需要用函数处理 --> <h3>姓名:[field:uname/]</h3> <p>邮箱:[field:email/]</p> <p>留言内容:[field:content/]</p> <p>提交时间:[field:function.fmtdate('@me','%Y-%m-%d %H:%M:%S')/]</p> <hr> </div> {/dede:list} <!-- 分页标签 --> <div class="page"> {dede:pagelist listsize='5' listitem='info,index,end,pre,next,pageno'} </div> </body> </html> -
访问页面: 访问
你的域名/plus/list.php?aid=你的表单id即可看到效果。http://www.yoursite.com/plus/list.php?aid=5
要点:
- 底层字段:
[field:字段名/]中的“字段名”必须和你后台自定义表单中添加的字段名完全一致(区分大小写)。 - 时间格式化:
[field:dtime]默认输出时间戳,必须用[field:function.fmtdate('@me','%Y-%m-%d')/]这样的方式来格式化显示。 - 分页:
{dede:pagelist}标签是实现分页的关键,{dede:list}会自动处理分页逻辑。
在前台页面查询并展示单条数据详情
比如用户提交留言后,点击查看自己的留言详情;或者在招聘网站点击查看某个职位的详细信息。
这需要使用 dede:sql 标签,通过 GET 传值来获取指定 ID 的数据。
步骤:
-
创建模板文件: 创建一个名为
msg_detail.htm的文件。 -
编写模板代码: 使用
dede:sql标签直接执行 SQL 查询。示例代码 (msg_detail.htm):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>留言详情</title> </head> <body> <h1>留言详情</h1> {dede:sql sql="SELECT * FROM `dede_addon5` WHERE id = ~aid~"} <!-- dede:sql 标签用于执行自定义SQL语句。 1. `dede_addon5` 是自定义表单的数据表名,规则是 `dede_addon + 你的表单id`,例如id为5的表单,数据表就是 `dede_addon5`。 2. `id = ~aid~` 是关键,`aid` 是一个默认的变量,代表通过URL传递过来的 `aid` 值。 访问 ?aid=123,这里的 `~aid~` 就会被替换成 123。 注意:`~` 是 DedeCMS 对 GET 变量的一种安全封装方式。 3. 如果查询结果有多条,需要用 {dede:datalist} 循环,但这里我们查询单条,所以直接使用 {dede:sql} 即可。 --> <div class="detail-item"> <h2>标题:[field:title/]</h2> <p>姓名:[field:uname/]</p> <p>电话:[field:tel/]</p> <p>邮箱:[field:email/]</p> <p>详细内容:</p> <div class="content">[field:content/]</div> <p>提交时间:[field:function.fmtdate('@me','%Y-%m-%d %H:%M:%S')/]</p> <p>IP地址:[field:ip/]</p> </div> {/dede:sql} <!-- 如果查询不到数据,可以显示提示 --> <div class="not-found"> 抱歉,未找到指定的留言信息! </div> </body> </html> -
访问页面: 访问
你的域名/plus/msg_detail.htm?aid=123(将123替换为你要查看的记录ID)。
要点:
- 数据表名:
dede_addon表单id这个规则一定要找对。 - 变量传递:
~aid~是 DedeCMS 获取 GET 参数的标准方式,比直接用$aid更安全。 - 安全性:直接使用
dede:sql有一定的 SQL 注入风险。aid值来自用户输入,最好在程序中做一次强制类型转换(如intval()),或者确保你的网站有足够的安全防护。
带条件查询的前台列表(高级)
比如做一个留言板,可以根据姓名或留言内容进行搜索。
这需要结合 dede:list 和自定义的 SQL 查询来实现。
方法:修改 list_表单id.htm
-
在模板中添加搜索表单: 在
{dede:list}标签之前,添加一个 HTML 表单,用于接收用户的搜索关键词。<form action="/plus/list.php" method="get"> <input type="hidden" name="aid" value="你的表单id" /> <input type="text" name="keyword" placeholder="请输入关键词搜索" /> <button type="submit">搜索</button> </form> -
修改
dede:list:dede:list本身不支持复杂的条件查询,但我们可以利用它的sql属性(如果版本支持)或者通过修改include/arc.listview.class.php文件来实现,这里我们介绍一种更简单但需要修改一点PHP文件的方法(不推荐新手直接修改文件,这里仅作原理说明)。更推荐的做法(通过修改PHP文件): 你需要修改
include/arc.listview.class.php文件,在ParseSql()函数中增加对自定义查询参数的判断,这需要一定的 PHP 开发能力。相对简单的替代方案(使用
dede:sql手动分页): 如果不想修改核心文件,可以完全用dede:sql+dede:pagelist自己实现分页逻辑,但这更复杂。一个折中的“伪”查询方法(前端过滤): 这种方法不真正在数据库查询,而是把所有数据查出来,然后用 JavaScript 在前端进行过滤。缺点是数据量大时页面会卡顿,不推荐。
鉴于其复杂性,对于带条件查询的需求,最规范的方法还是修改 arc.listview.class.php 文件或在程序中用 PHP 直接查询数据库并赋值给模板。
| 查询场景 | 实现方法 | 核心标签/文件 | 优点 | 缺点 |
|---|---|---|---|---|
| 后台管理 | 后台直接操作 | 后台 -> 自定义表单 |
无需代码,简单直接 | 功能弱,无法前台展示 |
| 前台列表 | 创建专用模板 | list_x.htm + {dede:list} |
简单,标准,支持分页 | 条件查询能力弱 |
| 前台详情 | SQL单条查询 | 详情页.htm + {dede:sql} |
灵活,可获取任意单条数据 | 需要知道数据表名,有安全风险 |
| 前台条件查询 | 修改核心文件或PHP查询 | arc.listview.class.php 或自定义PHP |
功能强大,灵活 | 需要开发能力,有修改核心文件的风险 |
对于大多数用户来说,场景二和场景三已经能满足 90% 的需求,在开始之前,请务必备份你的网站文件和数据库,以防操作失误。
