在dedecms系统中,自定义表单是一个非常实用的功能,它允许网站管理员根据实际需求创建各种数据收集表单,如留言板、报名表、订单收集等,许多用户在创建自定义表单后,往往不知道如何正确调用这些表单数据以在前台页面展示,本文将详细介绍dedecms自定义表单的调用方法,包括基础调用、高级调用以及常见问题的解决方案。

我们需要了解dedecms自定义表单的基本结构,在dedecms后台,进入“核心”-“内容模型管理”-“自定义表单”,在这里可以创建新的表单,设置表单字段(如文本框、下拉框、单选按钮、复选框等),并配置表单的提交处理方式,创建完成后,表单数据会保存在数据库的dede_addonsoft表中(表名可能因版本不同而略有差异),调用表单数据本质上就是查询这个表并输出结果。
最基础的调用方式是使用dedecms的{dede:sql}标签,这个标签允许直接执行SQL语句并输出结果,如果要调用一个名为“feedback”的自定义表单中的所有数据,可以使用以下代码:
{dede:sql sql="SELECT * FROM dede_addonsoft WHERE aid = 'feedback' ORDER BY id DESC"}
<table border="1">
<tr>
<td>{dede:field.name/}</td>
<td>{dede:field.email/}</td>
<td>{dede:field.message/}</td>
<td>{dede:field.dtime function="MyDate('Y-m-d H:i:s',@me)"/}</td>
</tr>
</table>
{/dede:sql}
这段代码中,sql属性指定了查询语句,WHERE aid = 'feedback'限制了只调用“feedback”表单的数据(aid字段在创建表单时自动生成),ORDER BY id DESC表示按ID降序排列,即最新的数据显示在最前面,在循环体内,{dede:field.xxx/}用于输出每个字段的值,其中dtime字段通过function参数进行了日期格式化处理,使其更易读。
如果需要对调用数据进行更复杂的筛选或分页,可以使用{dede:list}标签结合自定义模型来实现,需要在后台为自定义表单创建一个对应的模型,然后在模板中使用{dede:list}标签进行调用。

{dede:list pagesize='10' titlelen='50'}
<div class="form-item">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>[field:description function='cn_substr(@me, 100)'/]...</p>
<span class="date">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</div>
{/dede:list}
<div class="page-link">
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
</div>
这里,pagesize='10'设置了每页显示10条数据,titlelen='50'显示长度为50个字符。[field:arcurl/]是文章链接,但对于自定义表单,可能需要手动设置链接或使用其他方式处理,分页功能通过{dede:pagelist}标签实现,listsize和listitem参数控制分页链接的显示样式和数量。
除了直接使用SQL标签,还可以通过dedecms的标签二次开发来实现更灵活的调用,可以创建一个自定义标签文件,在include/taglib目录下新建一个名为myform.lib.php的文件,内容如下:
<?php
function lib_myform(&$ctag, &$refObj)
{
global $dsql;
$attlist = "typeid|0,row|10,titlelen|50";
FillAttsDefault($ctag->CAttribute->Items, $attlist);
$typeid = $ctag->GetAtt('typeid');
$row = $ctag->GetAtt('row');
$titlelen = $ctag->GetAtt('titlelen');
$innertext = $ctag->GetInnertext();
$revalue = '';
$dsql->SetQuery("SELECT * FROM dede_addonsoft WHERE aid = '$typeid' ORDER BY id DESC LIMIT 0,$row");
$dsql->Execute();
while ($row = $dsql->GetArray()) {
$row['title'] = cn_substr($row['title'], $titlelen);
$revalue .= str_replace('~id~', $row['id'], str_replace('~title~', $row['title'], $innertext));
}
return $revalue;
}
?>
然后在模板中这样使用:
{dede:myform typeid='feedback' row='5'}
<div class="item">
<h4>~title~</h4>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/]</p>
</div>
{/dede:myform}
这种方式更加灵活,可以封装复杂的查询逻辑,并通过typeid参数指定不同的表单,row参数控制显示数量,titlelen参数控制标题长度。

在实际调用过程中,可能会遇到一些常见问题,调用出的数据显示乱码,这通常是由于数据库编码和页面编码不一致导致的,可以通过统一编码(如UTF-8)或使用iconv函数进行转换来解决,又如,调用数据时无法获取最新提交的数据,这可能是由于缓存问题,可以在后台清除缓存或使用{dede:sql}标签时添加cache='no'属性来禁用缓存。
如果需要对调用数据进行分页处理,可以使用{dede:pagelist}标签结合{dede:sql}标签来实现。
{dede:sql sql="SELECT COUNT(*) AS total FROM dede_addonsoft WHERE aid = 'feedback'"}
$total = [field:total/];
{/dede:sql}
{dede:sql sql="SELECT * FROM dede_addonsoft WHERE aid = 'feedback' ORDER BY id DESC LIMIT [field:total/], 10"}
<div>[field:name/]</div>
{/dede:sql}
<div class="page-link">
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
</div>
这里,首先通过一个SQL查询获取总记录数,然后在第二个SQL查询中使用LIMIT子句实现分页。{dede:pagelist}标签会自动根据当前页码和总记录数生成分页链接。
为了更直观地展示不同调用方式的适用场景,可以参考下表:
| 调用方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
{dede:sql}
| |||
{dede:list}
| |||
| 自定义标签文件 | 复杂查询逻辑,复用性高 | 灵活强大,可封装复杂逻辑 | 需要一定的PHP开发能力 |
dedecms自定义表单的调用方法多种多样,用户可以根据实际需求选择合适的方式,对于简单的数据展示,直接使用{dede:sql}标签即可;对于需要分页的场景,可以使用{dede:list}标签;而对于复杂的查询逻辑或需要高度复用的场景,则可以考虑开发自定义标签文件,掌握这些调用方法,可以充分发挥dedecms自定义表单的强大功能,为网站提供更丰富的数据交互体验。
相关问答FAQs
问题1:为什么使用{dede:sql}标签调用自定义表单数据时,部分字段显示为空?
解答:这通常是因为SQL查询语句中的字段名与数据库表中的字段名不匹配导致的,请检查{dede:field.xxx/}中的xxx是否与dede_addonsoft表中的字段名完全一致(注意区分大小写),还需要确认该字段在表单中是否设置为必填或允许为空,以及数据是否已正确提交到数据库中。
问题2:如何在调用自定义表单数据时实现条件筛选,例如只显示某个特定分类的数据?
解答:可以通过在SQL查询语句中添加WHERE条件来实现,如果自定义表单中有一个名为type的字段用于存储分类信息,要筛选出type为“报名”的数据,可以使用以下代码:
{dede:sql sql="SELECT * FROM dede_addonsoft WHERE aid = 'feedback' AND type = '报名' ORDER BY id DESC"}
<div>[field:name/]</div>
{/dede:sql}
如果需要更复杂的条件(如多条件组合、模糊查询等),可以在SQL语句中使用AND、OR、LIKE等逻辑运算符,或使用PHP进行二次处理后再输出。
