核心思路
- 创建会员筛选表单:在前台页面放置一个表单,包含筛选条件(如会员名、会员组、注册时间等)。
- 处理筛选请求:当用户提交表单时,接收筛选参数。
- 编写自定义SQL:根据接收到的筛选参数,动态构建一个SQL查询语句,从
dede_member和dede_member_space等表中查询符合条件的会员数据。 - 显示筛选结果:将查询到的会员数据通过循环列表的方式展示在页面上。
准备工作
请确保你已经了解织梦的基本模板制作和标签调用,我们假设你要将这个筛选页面放在一个自定义的页面中,member_list.php。

(图片来源网络,侵删)
第一步:创建筛选表单 (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):

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