这是一种非常常见且实用的功能,能极大地提升用户体验和网站的交互性。

(图片来源网络,侵删)
我们将以最常见的 “按会员等级筛选” 为例,为您提供一个完整、详细的实现步骤。
核心思路
实现联动列表的核心思路是利用织梦的 自定义表单 和 自定义SQL查询 结合。
- 创建筛选表单:在会员列表页的上方,放置一个
<form>表单,里面包含一个<select>下拉菜单,这个下拉菜单的选项就是我们的筛选条件(如:普通会员, VIP会员, 企业会员)。 - 获取筛选值:当用户提交表单时,获取用户在下拉菜单中选择的值。
- 构建动态SQL:根据获取到的筛选值,动态修改查询会员数据的SQL语句。
- 如果用户选择了某个等级,SQL语句就加上
WHERE m.mtype = '选中的值'的条件。 - 如果用户没有选择(即选择“全部”),SQL语句就不加WHERE条件,查询所有会员。
- 如果用户选择了某个等级,SQL语句就加上
- 执行查询并显示:使用织梦的
dsql或dedesql类执行这个动态SQL,然后将查询结果循环输出,显示在页面上。
详细实现步骤
假设我们要在 member/ 目录下的 list.php 页面实现这个功能。
第1步:准备会员等级数据
在织梦后台,会员等级通常存储在 dede_arctype 表中(如果用栏目管理等级)或者自定义表中,为了简单起见,我们假设会员等级信息是硬编码在筛选下拉菜单里的,并且会员数据表 dede_member 中有一个字段 mtype 来存储会员的等级标识。

(图片来源网络,侵删)
会员等级对照表:
- 普通会员:
normal - VIP会员:
vip - 企业会员:
company
第2步:修改会员列表模板文件 member/list.php
这是最关键的一步,我们需要直接修改PHP文件,而不是通过后台模板编辑器。
- 找到文件:
/member/list.php - 备份原文件:在修改之前,务必备份原始的
list.php文件。 - 修改文件内容:用代码编辑器打开
list.php,找到生成会员列表的核心代码段,通常是在//获得一个列表或类似的注释之后,我们将用新的逻辑替换掉它。
以下是修改后的 list.php 完整代码,请仔细比对并替换:
<?php
/**
* 会员列表
*
* @version $Id: list.php $
* @package DedeBIZ.Site
* @copyright Copyright (c) 2025, DedeBIZ.COM
* @license https://www.dedebiz.com/license
* @link https://www.dedebiz.com
*/
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/datalistcp.class.php");
// 如果用户提交了筛选表单
if (isset($_POST['smt'])) {
$mtype = isset($_POST['mtype']) ? trim($_POST['mtype']) : '';
// 构建基础查询SQL
$sql = "SELECT m.*, mt.* FROM `dede_member` m LEFT JOIN `dede_member_type` mt ON m.mtype = mt.id WHERE 1=1";
// 如果用户选择了等级,则添加筛选条件
if (!empty($mtype)) {
$sql .= " AND m.mtype = '{$mtype}'";
}
// 为了安全,对变量进行转义
$sql = $dsql->FilterSearch($sql);
} else {
// 如果是首次进入页面,不进行筛选,查询所有会员
$sql = "SELECT m.*, mt.* FROM `dede_member` m LEFT JOIN `dede_member_type` mt ON m.mtype = mt.id";
}
// 执行查询
$dsql->SetQuery($sql);
$dsql->Execute();
// 创建一个数据列表对象
$list = new DataListCP();
$list->pageSize = 20; // 每页显示会员数
// 获取分页和数据
$list->SetTemplate($cfg_basedir . $cfg_memberdir . '/list-template.htm'); // 指定列表模板
$list->SetSource($dsql->GetTotalRow(), $dsql);
$list->Display();
?>
代码解释:

(图片来源网络,侵删)
if (isset($_POST['smt'])):检查是否提交了我们的筛选表单。smt是我们给提交按钮设置的name属性。$mtype = isset($_POST['mtype']) ? trim($_POST['mtype']) : '';:获取下拉菜单的值,并进行简单的处理。$sql = "SELECT ... WHERE 1=1";:这是一个技巧,方便后续用AND添加条件,而不用担心第一个条件前没有WHERE。if (!empty($mtype)) { $sql .= " AND m.mtype = '{$mtype}'"; }:这是核心的动态SQL构建逻辑。$mtype不为空,就在SQL语句后追加筛选条件。$dsql->FilterSearch($sql);:这是一个安全措施,对SQL语句进行过滤,防止SQL注入。new DataListCP():创建织梦的数据列表处理对象。$list->pageSize = 20;:设置每页显示的数量。$list->SetTemplate(...):指定会员列表的模板文件,我们稍后需要创建或修改这个模板。$list->SetSource(...):将我们构建的SQL和总记录数传递给列表对象。$list->Display();:执行查询并显示列表。
第3步:创建或修改会员列表模板文件
这个模板文件用于控制会员列表的显示样式。
- 文件位置:
/member/list-template.htm - :
<form name="form1" action="" method="post">
<select name="mtype" id="mtype">
<option value="">-- 按等级筛选 --</option>
<option value="normal">普通会员</option>
<option value="vip">VIP会员</option>
<option value="company">企业会员</option>
</select>
<button type="submit" name="smt">筛选</button>
</form>
<hr style="margin: 20px 0;">
<div class="member-list">
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#e9f2f7">
<tr align="center" bgcolor="#F9F9F9" height="24">
<td width="26%">会员昵称</td>
<td width="20%">等级</td>
<td width="30%">注册时间</td>
<td width="24%">操作</td>
</tr>
{dede:datalist}
<tr align="center" bgcolor="#FFFFFF" onMouseMove="javascript:this.bgColor='#FCFDEE';" onMouseOut="javascript:this.bgColor='#FFFFFF';" height="24">
<td>
<a href='view.php?uid={dede:field.userid/}'><img src='{dede:field.face/}' width='45' height='45' border='0' style='border:1px solid #ccc' /></a>
<a href='view.php?uid={dede:field.userid/}'>{dede:field.uname/}</a>
</td>
<td>{dede:field.mtype /}</td>
<td>{dede:field.regdate function="MyDate('Y-m-d H:i',@me)"/}</td>
<td><a href='view.php?uid={dede:field.userid/}'>查看详情</a></td>
</tr>
{/dede:datalist}
</table>
</div>
<!-- 分页 -->
<div class="page">
{dede:pagelist listsize=4 listitem="info,index,end,pre,next,pageno"}
</div>
模板代码解释:
- 筛选表单:
<form>和<select>部分就是我们新增的联动筛选界面,注意name属性要和PHP代码中获取的变量名一致(mtype和smt)。 - 会员列表循环:
{dede:datalist}...{/dede:datalist}是织梦的列表循环标签,循环体内的{dede:field.xxx/}用于输出当前会员的各个字段信息。 - 分页:
{dede:pagelist}用于生成分页导航。
第4步:创建筛选结果的提示(可选,但推荐)
为了在用户筛选后能清楚地看到当前筛选条件,可以在列表上方添加一行提示。
修改 member/list-template.htm,在 <hr> 标签后面添加如下代码:
<div class="filter-tip">
{dede:global name='get'/}
</div>
在 member/list.php 的 DataListCP 对象创建之后,添加如下代码来设置全局变量:
// 在 $list = new DataListCP(); 之后添加
// 生成筛选提示
if (isset($_POST['smt']) && !empty($_POST['mtype'])) {
$type_name = '';
switch ($_POST['mtype']) {
case 'normal':
$type_name = '普通会员';
break;
case 'vip':
$type_name = 'VIP会员';
break;
case 'company':
$type_name = '企业会员';
break;
}
$GLOBALS['get'] = "当前筛选条件:{$type_name}";
} else {
$GLOBALS['get'] = '';
}
这样,当用户筛选后,就会在列表上方显示“当前筛选条件:XXX”的提示。
总结与注意事项
- 安全性:直接操作SQL有注入风险,代码中
$dsql->FilterSearch($sql)是一个很好的防护习惯,对于用户输入的变量,最好也进行过滤,$mtype = $dsql->GetOne("SELECT id FROM dede_member_type WHERE id = '".$dsql->EscapeString($mtype)."'");这样可以确保$mtype是一个合法的等级ID。 - 字段名:请确保你的数据库中
dede_member表里有mtype这个字段,并且字段类型和值与你的筛选条件匹配,如果你的字段名是typeid或其他,请相应地修改SQL语句中的m.mtype。 - 模板路径:
$list->SetTemplate()中的路径要写对,确保能正确找到你的模板文件。 - 调试:如果出现问题,可以在
list.php中使用echo $sql; die;来打印出生成的SQL语句,看看是否符合预期,然后复制到数据库管理工具中执行,检查是否有语法错误或逻辑错误。 - 扩展性:这个方法可以轻松扩展到其他筛选条件,比如按性别、按城市、按注册时间范围等,只需在表单中增加相应的输入控件,然后在PHP中增加对应的SQL构建逻辑即可。
通过以上步骤,你就成功地为织梦DedeCMS的会员列表页添加了联动筛选功能。
