在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进行二次处理后再输出。