下面我将为你提供一份详尽的、从创建到调用的完整教程,涵盖最常用的两种方法:标签调用 和 直接查询。
第一步:创建自定义表单
在调用数据之前,你必须先在后台创建一个自定义表单。
-
登录 DedeCMS 后台。
-
在左侧菜单栏找到 【核心】 -> 模型管理】,模型管理页面,点击右上角的 【增加一个自定义表单】。
-
填写表单信息:
- 表单名称:给你的表单起一个名字,
留言反馈、在线报名等,这个名字会保存在dede_sysmodule表中。 - 数据表:系统会自动根据你输入的表单名称生成一个数据表名,
dede_addonfeedback。这个字段非常重要,在后续调用时需要用到,通常不需要修改。 - 默认表单模板:可以留空,我们将在前台页面手写表单代码。
- 列表模板:用于显示提交的数据列表,可以留空或稍后设置。
- 会员投稿模板:一般用不到,可以留空。
- 后台列表行数:设置在后台管理页面每页显示多少条记录。
- 是否验证码:根据需要选择,建议开启以防垃圾信息。
- 是否前台发布:选择“是”。
- 其他选项:保持默认即可。
- 表单名称:给你的表单起一个名字,
-
点击 【确定】 保存,你的自定义表单已经创建成功,并且数据表
dede_addonfeedback(或类似名称) 也被建好了。
第二步:在前台页面添加表单提交代码
创建完表单后,你需要在前台的某个页面(liuyan.htm)放置一个表单,让用户可以提交数据。
重要提示:DedeCMS 自定义表单的提交方式是 POST,并且必须有一个隐藏域 <input type="hidden" name="dopost" value="send" /> 来告诉系统这是一个提交动作。
示例代码 (liuyan.htm):
<form name="myform" action="/plus/diy.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="dopost" value="send" />
<!-- 这里是你自定义的字段,字段名必须和你后台添加的一致 -->
<p>
<label for="name">您的姓名:</label>
<input type="text" name="name" id="name" class="int" />
</p>
<p>
<label for="tel">联系电话:</label>
<input type="text" name="tel" id="tel" class="int" />
</p>
<p>
<label for="content">留言内容:</label>
<textarea name="content" id="content" rows="5" cols="50"></textarea>
</p>
<!-- 如果后台开启了验证码,就需要加上验证码 -->
<p>
<label for="vdcode">验证码:</label>
<input type="text" name="vdcode" id="vdcode" class="int" style="width:50px;text-transform:uppercase;"/>
<img src="/include/vdimgck.php" onclick="this.src='/include/vdimgck.php?'+Math.random();" alt="看不清?点击换一张" style="cursor:pointer" />
</p>
<p>
<input type="submit" name="submit" value="提 交" class="btn" />
</p>
</form>
代码解释:
action="/plus/diy.php":所有自定义表单都提交到这个地址。name="dopost" value="send":必须的隐藏域,表示执行发送操作。name="name",name="tel":这里的name属性值必须与你第一步在后台添加字段时定义的“字段名”完全一致。- 验证码代码是可选的,但如果你在后台开启了验证码,就必须加上。
第三步:调用已提交的表单数据
这是你问题的核心,当用户提交数据后,这些数据会保存在 dede_addonXXX (dede_addonfeedback) 表中,现在我们来看如何调用它们。
假设你的表单数据保存在 dede_addonfeedback 表中,并且有 id (主键), name (姓名), tel (电话), content (内容), dtime (提交时间) 等字段。
使用 DedeCMS 标签调用(推荐)
这是最标准、最安全的方法,能更好地利用 DedeCMS 的缓存机制。
获取表单的中文名称(关键步骤)
DedeCMS 的标签调用需要一个 {dede:php} 标签来获取自定义表单的“模型ID”或“中文名称”,这个名称就是你第一步在“表单名称”里输入的内容。
你当时填写的表单名称是 留言反馈。
编写调用代码
将以下代码放到你需要显示列表的模板文件中(list_liuyan.htm)。
<h2>用户留言列表</h2>
{dede:php}
// 在这里填入你的自定义表单名称
$formName = '留言反馈';
// 获取这个表单对应的数据表名
$dsql->SetQuery("SELECT addtable FROM `dede_sysmodule` WHERE mid = (SELECT id FROM `dede_sys_module` WHERE name='$formName')");
$dsql->Execute();
$addtable = $dsql->GetOne();
$tableName = $addtable['addtable'];
// 如果找到了表,则进行查询
if ($tableName) {
$sql = "SELECT * FROM `$tableName` WHERE arcrank=0 ORDER BY id DESC LIMIT 10"; // arcrank=0表示已审核,按ID降序取前10条
$dsql->SetQuery($sql);
$dsql->Execute();
$items = array();
while ($row = $dsql->GetArray()) {
$items[] = $row;
}
}
{/dede:php}
{dede:loop name='items' item='field'}
<div class="liuyan-item">
<p><strong>留言人:</strong> {$field.name} </p>
<p><strong>联系电话:</strong> {$field.tel} </p>
<p><strong>留言内容:</strong> {$field.content} </p>
<p><strong>提交时间:</strong> {dede:field name='dtime' function='MyDate("Y-m-d H:i:s",@me)'/}</p>
<hr>
</div>
{/dede:loop}
代码解释:
{dede:php}...{/dede:php}:执行 PHP 代码块。$formName = '留言反馈';:务必修改成你自己的表单名称。$sql = "SELECT * FROM$tableNameWHERE arcrank=0 ORDER BY id DESC LIMIT 10";:这是核心查询语句。SELECT *:查询所有字段。FROM $tableName:从我们动态获取的表名查询。WHERE arcrank=0:非常重要!arcrank是 DedeCMS 自定义表单的审核状态字段,0代表“已审核”,-1代表“待审核”,如果你想只显示已通过的留言,必须加上这个条件。ORDER BY id DESC:按id降序排列,即最新的留言在最前面。LIMIT 10:限制只显示10条记录。
{dede:loop name='items' item='field'}:这是一个循环标签,用来遍历我们上面 PHP 代码查询出的$items数组。{$field.name}:在循环内部,通过{$field.字段名}的方式来输出每个字段的值。
直接使用 PHP 查询(适用于二次开发)
如果你对 PHP 比较熟悉,或者这个调用逻辑比较复杂,可以直接在模板文件中使用 PHP 代码进行查询。
<h2>用户留言列表 (PHP直接查询)</h2>
<?php
// 1. 引入数据库配置文件,确保 $dsql 对象可用
// 在 DedeCMS 模板中,$dsql 全局对象已经存在,但如果不行,需要手动引入
// require_once(dirname(__FILE__)."/../include/common.inc.php");
// 2. 直接写死表名(不推荐,因为不灵活)
// $tableName = 'dede_addonfeedback';
// 3. 推荐方法:通过表单名称动态获取表名(与方法一相同)
$formName = '留言反馈';
$dsql->SetQuery("SELECT addtable FROM `dede_sysmodule` WHERE mid = (SELECT id FROM `dede_sys_module` WHERE name='$formName')");
$dsql->Execute();
$addtable = $dsql->GetOne();
$tableName = $addtable['addtable'];
// 4. 执行查询
if ($tableName) {
$sql = "SELECT * FROM `$tableName` WHERE arcrank=0 ORDER BY id DESC";
$dsql->SetQuery($sql);
$dsql->Execute();
// 5. 循环输出结果
while($row = $dsql->GetArray())
{
echo '<div class="liuyan-item">';
echo '<p><strong>留言人:</strong> ' . $row['name'] . '</p>';
echo '<p><strong>联系电话:</strong> ' . $row['tel'] . '</p>';
echo '<p><strong>留言内容:</strong> ' . $row['content'] . '</p>';
echo '<p><strong>提交时间:</strong> ' . date("Y-m-d H:i:s", $row['dtime']) . '</p>';
echo '<hr></div>';
}
}
?>
两种方法的对比:
- 方法一(标签调用):更符合 DedeCMS 的设计思想,代码结构更清晰,易于维护。
- 方法二(直接PHP):更灵活,可以执行更复杂的逻辑,但如果模板中 PHP 代码过多,会使模板文件变得臃肿,不易于前端人员修改。
总结与常见问题
-
调不到数据?
- 检查表名:确认
dede_addonXXX是否正确。 - 检查审核状态:确认是否加了
WHERE arcrank=0条件,很多用户忘记这一点,导致调不出来“待审核”状态的数据。 - 检查字段名:在模板中调用时,
{$field.name}的name是否和数据库字段名一致。 - 检查权限:确保模板文件有读取数据库的权限。
- 检查表名:确认
-
如何分页?
- DedeCMS 的自定义表单默认不支持像文章那样的
{dede:pagelist}分页标签。 - 如果需要分页,你需要手动实现,可以使用
$dsql->GetTotalRow()获取总记录数,然后自己计算总页数,并构建LIMIT子句(如LIMIT 0, 10或LIMIT 10, 10),最后手动生成上一页/下一页的链接,这属于进阶开发。
- DedeCMS 的自定义表单默认不支持像文章那样的
-
如何调用单个表单详情页?
- 你需要通过一个链接传递
id,view.php?id=5。 - 在
view.php中,通过GET方式获取id,然后用$dsql->GetOne("SELECT * FROMdede_addonfeedbackWHERE id='$id'")查询并显示单条数据。
- 你需要通过一个链接传递
希望这份详细的教程能帮助你成功调用 DedeCMS 自定义表单的数据!
