织梦dedecms会员列表如何实现联动效果?

99ANYc3cd6
预计阅读时长 26 分钟
位置: 首页 织梦建站 正文

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

织梦dedecms会员列表联动
(图片来源网络,侵删)

我们将以最常见的 “按会员等级筛选” 为例,为您提供一个完整、详细的实现步骤。


核心思路

实现联动列表的核心思路是利用织梦的 自定义表单自定义SQL查询 结合。

  1. 创建筛选表单:在会员列表页的上方,放置一个 <form> 表单,里面包含一个 <select> 下拉菜单,这个下拉菜单的选项就是我们的筛选条件(如:普通会员, VIP会员, 企业会员)。
  2. 获取筛选值:当用户提交表单时,获取用户在下拉菜单中选择的值。
  3. 构建动态SQL:根据获取到的筛选值,动态修改查询会员数据的SQL语句。
    • 如果用户选择了某个等级,SQL语句就加上 WHERE m.mtype = '选中的值' 的条件。
    • 如果用户没有选择(即选择“全部”),SQL语句就不加WHERE条件,查询所有会员。
  4. 执行查询并显示:使用织梦的 dsqldedesql 类执行这个动态SQL,然后将查询结果循环输出,显示在页面上。

详细实现步骤

假设我们要在 member/ 目录下的 list.php 页面实现这个功能。

第1步:准备会员等级数据

在织梦后台,会员等级通常存储在 dede_arctype 表中(如果用栏目管理等级)或者自定义表中,为了简单起见,我们假设会员等级信息是硬编码在筛选下拉菜单里的,并且会员数据表 dede_member 中有一个字段 mtype 来存储会员的等级标识。

织梦dedecms会员列表联动
(图片来源网络,侵删)

会员等级对照表:

  • 普通会员: normal
  • VIP会员: vip
  • 企业会员: company

第2步:修改会员列表模板文件 member/list.php

这是最关键的一步,我们需要直接修改PHP文件,而不是通过后台模板编辑器。

  1. 找到文件/member/list.php
  2. 备份原文件:在修改之前,务必备份原始的 list.php 文件。
  3. 修改文件内容:用代码编辑器打开 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();
?>

代码解释

织梦dedecms会员列表联动
(图片来源网络,侵删)
  • 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步:创建或修改会员列表模板文件

这个模板文件用于控制会员列表的显示样式。

  1. 文件位置/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代码中获取的变量名一致(mtypesmt)。
  • 会员列表循环{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.phpDataListCP 对象创建之后,添加如下代码来设置全局变量:

// 在 $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”的提示。


总结与注意事项

  1. 安全性:直接操作SQL有注入风险,代码中 $dsql->FilterSearch($sql) 是一个很好的防护习惯,对于用户输入的变量,最好也进行过滤,$mtype = $dsql->GetOne("SELECT id FROM dede_member_type WHERE id = '".$dsql->EscapeString($mtype)."'"); 这样可以确保 $mtype 是一个合法的等级ID。
  2. 字段名:请确保你的数据库中 dede_member 表里有 mtype 这个字段,并且字段类型和值与你的筛选条件匹配,如果你的字段名是 typeid 或其他,请相应地修改SQL语句中的 m.mtype
  3. 模板路径$list->SetTemplate() 中的路径要写对,确保能正确找到你的模板文件。
  4. 调试:如果出现问题,可以在 list.php 中使用 echo $sql; die; 来打印出生成的SQL语句,看看是否符合预期,然后复制到数据库管理工具中执行,检查是否有语法错误或逻辑错误。
  5. 扩展性:这个方法可以轻松扩展到其他筛选条件,比如按性别、按城市、按注册时间范围等,只需在表单中增加相应的输入控件,然后在PHP中增加对应的SQL构建逻辑即可。

通过以上步骤,你就成功地为织梦DedeCMS的会员列表页添加了联动筛选功能。

-- 展开阅读全文 --
头像
百度 dede swfupload如何配置使用?
« 上一篇 今天
织梦搜索页pagelist标签如何实现分页?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]