织梦cms调出会员列表筛选

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

核心思路

  1. 创建会员筛选表单:在前台页面放置一个表单,包含筛选条件(如会员名、会员组、注册时间等)。
  2. 处理筛选请求:当用户提交表单时,接收筛选参数。
  3. 编写自定义SQL:根据接收到的筛选参数,动态构建一个SQL查询语句,从 dede_memberdede_member_space 等表中查询符合条件的会员数据。
  4. 显示筛选结果:将查询到的会员数据通过循环列表的方式展示在页面上。

准备工作

请确保你已经了解织梦的基本模板制作和标签调用,我们假设你要将这个筛选页面放在一个自定义的页面中,member_list.php

织梦cms调出会员列表筛选
(图片来源网络,侵删)

第一步:创建筛选表单 (HTML部分)

在你的模板文件中,首先创建一个表单,用于用户输入筛选条件,这个表单可以放在会员列表的上方。

示例代码 (member_list.htm):

<form name="searchform" action="/member/list.php" method="get">
    <input type="hidden" name="dopost" value="search" />
    <!-- 会员名/昵称搜索 -->
    <div>
        <label>会员名/昵称:</label>
        <input type="text" name="keyword" value="{dede:global.keyword/}" placeholder="请输入关键词" />
    </div>
    <!-- 会员组筛选 -->
    <div>
        <label>会员组:</label>
        <select name="mtype">
            <option value="">全部</option>
            {dede:global.mtype option='yes'/}
            <!-- 这里的 {dede:global.mtype option='yes'/} 需要在PHP中赋值,下面会讲 -->
        </select>
    </div>
    <!-- 注册时间范围 -->
    <div>
        <label>注册时间:</label>
        <input type="date" name="startdate" value="{dede:global.startdate/}" /> 至
        <input type="date" name="enddate" value="{dede:global.enddate/}" />
    </div>
    <div>
        <button type="submit">筛选</button>
        <a href="/member/list.php">重置</a>
    </div>
</form>
<hr>
<!-- 会员列表将在这里显示 -->
<ul class="member-list">
    {dede:list}
    <li>
        <a href="[field:spaceurl/]">
            <img src="[field:face default='{dede:global.cfg_cmspath/}/images/defaultpic.gif']" alt="[field:uname/]">
            [field:uname/]
        </a>
        <span>注册时间:[field:jointime function="MyDate('Y-m-d H:i:s',@me)"/]</span>
    </li>
    {/dede:list}
</ul>
<!-- 分页 -->
<div class="dede_pages">
    <ul>{dede:pagelist listsize=4/}</ul>
</div>

第二步:处理筛选逻辑并查询数据 (PHP部分)

这是最关键的一步,你需要创建一个PHP文件(list.php)来处理表单提交,执行数据库查询,并将结果传递给模板。

示例代码 (list.php):

织梦cms调出会员列表筛选
(图片来源网络,侵删)
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
require_once(DEDEINC."/arc.partview.class.php");
// 初始化变量
$keyword = $mtype = $startdate = $enddate = '';
$whereSql = "1=1"; // SQL查询的WHERE子句
$addfields = ''; // 用于传递给模板的额外变量
// 1. 接收筛选参数
if (isset($_GET['dopost']) && $_GET['dopost'] == 'search') {
    $keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
    $mtype = isset($_GET['mtype']) ? trim($_GET['mtype']) : '';
    $startdate = isset($_GET['startdate']) ? trim($_GET['startdate']) : '';
    $enddate = isset($_GET['enddate']) ? trim($_GET['enddate']) : '';
    // 将筛选条件保存到全局变量,以便在模板中显示当前选中的值
    $GLOBALS['keyword'] = $keyword;
    $GLOBALS['mtype'] = $mtype;
    $GLOBALS['startdate'] = $startdate;
    $GLOBALS['enddate'] = $enddate;
}
// 2. 构建动态SQL WHERE子句
if (!empty($keyword)) {
    $whereSql .= " AND (m.uname LIKE '%$keyword%' OR m.spacekey LIKE '%$keyword%' OR m.mtype LIKE '%$keyword%')";
}
if (!empty($mtype)) {
    $whereSql .= " AND m.mtype = '$mtype'";
}
if (!empty($startdate)) {
    $whereSql .= " AND m.jointime >= '".strtotime($startdate)."'";
}
if (!empty($enddate)) {
    $whereSql .= " AND m.jointime <= '".strtotime($enddate." 23:59:59")."'";
}
// 3. 准备分页参数
$pageSize = 20; // 每页显示多少条
$currentPage = isset($_GET['page']) ? intval($_GET['page']) : 1;
$limit = " LIMIT ".($currentPage - 1) * $pageSize . ", $pageSize";
// 4. 编写完整的SQL查询
// 我们关联了 dede_member (m) 和 dede_member_space (ms) 表
$sql = "SELECT m.*, ms.spacesta, ms.spacepic, ms.spacename, ms.sign
        FROM `#@__member` m
        LEFT JOIN `#@__member_space` ms ON m.mid = ms.mid
        WHERE $whereSql
        ORDER BY m.jointime DESC
        $limit";
// 5. 执行查询并获取数据
$dsql->SetQuery($sql);
$dsql->Execute();
$memberList = array();
while ($row = $dsql->GetArray()) {
    // 对数据进行一些处理,比如格式化时间
    $row['jointime'] = MyDate('Y-m-d H:i:s', $row['jointime']);
    $memberList[] = $row;
}
// 6. 获取总记录数,用于分页
$countSql = "SELECT COUNT(*) as total FROM `#@__member` m WHERE $whereSql";
$row = $dsql->GetOne($countSql);
$totalResult = $row['total'];
// 7. 计算总页数
$totalPage = ceil($totalResult / $pageSize);
// 8. 将数据传递给模板
$addfields = array(
    'memberList' => $memberList,
    'totalResult' => $totalResult,
    'totalPage' => $totalPage,
    'pageSize' => $pageSize
);
// --- 生成会员组下拉列表 ---
$mtypes = array();
$dsql2 = new DedeSql(false);
$dsql2->SetQuery("SELECT typename FROM `#@__member_type` ORDER BY id asc");
$dsql2->Execute();
while ($row2 = $dsql2->GetArray()) {
    $mtypes[$row2['typename']] = $row2['typename'];
}
$GLOBALS['mtype_options'] = $mtypes; // 将选项传递给模板
// --- 调用模板并显示 ---
$tpl = new PartView();
$tpl->SetTemplet(DEDETEMPLATE.'/default/member_list.htm'); // 指向你的模板文件
$tpl->Display();
?>

第三步:修改模板以显示数据

你需要修改第一步创建的模板文件 (member_list.htm),让它能够正确地显示PHP传递过来的数据。

修改后的模板代码 (member_list.htm):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">会员列表</title>
</head>
<body>
    <!-- 筛选表单 -->
    <form name="searchform" action="/member/list.php" method="get">
        <input type="hidden" name="dopost" value="search" />
        <div>
            <label>会员名/昵称:</label>
            <input type="text" name="keyword" value="{dede:global.keyword/}" placeholder="请输入关键词" />
        </div>
        <div>
            <label>会员组:</label>
            <select name="mtype">
                <option value="">全部</option>
                {dede:global.mtype_options}
                <option value="[field:key/]" {dede:if field='key' option='eq' global.mtype}selected{/dede:if}>[field:value/]</option>
                {/dede:global.mtype_options}
            </select>
        </div>
        <div>
            <label>注册时间:</label>
            <input type="date" name="startdate" value="{dede:global.startdate/}" /> 至
            <input type="date" name="enddate" value="{dede:global.enddate/}" />
        </div>
        <div>
            <button type="submit">筛选</button>
            <a href="/member/list.php">重置</a>
        </div>
    </form>
    <hr>
    <!-- 会员列表显示 -->
    {dede:global.memberlist}
    <ul class="member-list">
        {dede:global.memberlist}
        <li>
            <a href="[field:spaceurl/]">
                <img src="[field:spacepic default='{dede:global.cfg_cmspath/}/images/defaultpic.gif']" alt="[field:spacename/]">
                [field:spacename/]
            </a>
            <span>注册时间:[field:jointime/]</span>
            <p>[field:sign/]</p>
        </li>
        {/dede:global.memberlist}
    </ul>
    {/dede:global.memberlist}
    {dede:if global.totalResult > 0}
    <!-- 分页 -->
    <div class="dede_pages">
        <ul>
            {dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="4" tagid="page"}
        </ul>
    </div>
    {/dede:if}
</body>
</html>

注意分页标签的修改: 因为我们是手动执行的SQL,所以默认的 {dede:pagelist} 无法工作,你需要修改 list.php 中的分页逻辑,或者使用一个更灵活的分页类,上面的代码保留了 {dede:pagelist} 作为占位符,你需要根据实际情况实现分页链接的生成。

一个简单的分页链接生成方法(在 list.php 中):

// 在 list.php 的最后,模板显示之前
$GLOBALS['page_links'] = '';
if ($totalPage > 1) {
    $page_links = '';
    for ($i = 1; $i <= $totalPage; $i++) {
        $page_links .= "<a href='/member/list.php?dopost=search&keyword=".urlencode($keyword)."&mtype=$mtype&startdate=$startdate&enddate=$enddate&page=$i'>$i</a> ";
    }
    $GLOBALS['page_links'] = $page_links;
}

然后在模板中这样调用:

<div class="dede_pages">
    <ul>{dede:global.page_links/}</ul>
</div>

总结与注意事项

  1. 安全性:上述代码中的 $keyword 变量直接拼接进了SQL,存在SQL注入风险,在实际项目中,请务必使用 $dsql->GetOne()$dsql->Execute() 的安全方式,或者对输入进行严格的过滤和转义。
  2. 性能:当会员数量非常大时,LIKE 查询和分页查询可能会很慢,可以考虑为 uname, mtype, jointime 等字段建立数据库索引来优化查询性能。
  3. 字段扩展:如果你想筛选会员的扩展信息(如性别、生日等),你需要关联 #@__member_addon_XXX 表(XXX是你模型名称),并在SQL中添加相应的JOIN条件和WHERE子句。
  4. URL重写:为了让URL更美观,你可以在织梦的后台开启“伪静态”,并将 /member/list.php 这样的地址重写为 /member/list/ 等形式。
  5. 模板标签:我们使用了 {dede:global.memberlist} 这样的方式来循环自定义数据,这是织梦模板引擎支持的一种方式。

这个方案提供了一个完整的框架,你可以根据自己的具体需求(比如要筛选哪些字段、如何展示等)进行修改和扩展。

-- 展开阅读全文 --
头像
c语言输出helloworld
« 上一篇 2025-12-30
C语言CORDIC算法如何实现反正切函数?
下一篇 » 2025-12-30

相关文章

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

目录[+]