核心思路
无论采用哪种方法,核心思路都是一致的:

(图片来源网络,侵删)
- 使用
{dede:datalist}遍历你的数据(如文章、软件、商品等)。 - 在循环内部,使用
<input type="checkbox">标签来创建一个复选框。 - 关键一步:为每个复选框设置一个唯一的
value值,这个值通常是当前数据项的主键ID(如id)。 - 可选但推荐:为所有复选框设置一个统一的
name属性(如arcids[]),这样在提交表单时,PHP就能接收到一个包含所有选中项ID的数组。
最简单的静态实现(适用于初学者)
这种方法最直接,但缺点是复选框的 value 值是固定的,无法动态获取每条数据的ID,它只适用于展示,不适用于真正的批量操作。
代码示例:
<form action="batch_do.php" method="post">
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#e6e6e6">
<tr align="center" bgcolor="#f8f8f8" height="28">
<td width="5%">选择</td>
<td width="5%">ID</td>
<td width="45%">标题</td>
<td width="20%">发布时间</td>
<td width="25%">操作</td>
</tr>
{dede:datalist}
<tr align="center" bgcolor="#FFFFFF" height="26" onmousemove="javascript:this.bgColor='#f8f8f8';" onmouseout="javascript:this.bgColor='#FFFFFF';">
<!-- 1. 复选框 -->
<td>
<input type="checkbox" name="arcids[]" value="{dede:field.id/}" />
</td>
<!-- 2. ID -->
<td>{dede:field.id/}</td>
<!-- 3. 标题 -->
<td>
<a href="{dede:field name='arcurl'/}" target="_blank">{dede:field.title/}</a>
</td>
<!-- 4. 发布时间 -->
<td>{dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/}</td>
<!-- 5. 操作 -->
<td>
<a href="javascript:;" onclick="EditArc({dede:field.id/})">编辑</a> |
<a href="javascript:;" onclick="DelArc({dede:field.id/})">删除</a>
</td>
</tr>
{/dede:datalist}
<tr>
<td colspan="5" bgcolor="#f8f8f8">
<input type="submit" name="submit" value="批量删除" />
<input type="submit" name="submit" value="批量审核" />
</td>
</tr>
</table>
</form>
代码解析:
<form action="batch_do.php" method="post">:创建一个表单,action指向处理批量操作的PHP文件。<input type="checkbox" name="arcids[]" value="{dede:field.id/}" />:这是核心。type="checkbox":定义复选框。name="arcids[]":方括号[]是PHP中接收数组的关键,当你勾选多个复选框并提交时,PHP会收到一个名为arcids的数组,里面包含了所有被勾选项的value值。value="{dede:field.id/}":这是最关键的一步。{dede:field.id/}会自动获取当前循环到的那条数据的id字段值,并将其作为复选框的value,这样每个复选框的值就都是唯一的了。
- 底部的
<input type="submit">按钮用于触发表单提交。
更完整的列表页实现(推荐)
这是一个更完整、更规范的列表页实现,包含了分页、搜索和批量操作按钮。

(图片来源网络,侵删)
list_article.htm (模板文件)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">文章列表</title>
<style>
body { font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
.action-btn { margin-right: 10px; }
</style>
</head>
<body>
<h1>文章列表管理</h1>
<!-- 搜索表单 (可选) -->
<form name="search" action="list_article.php" method="get">
<input type="text" name="keyword" placeholder="输入关键字搜索" value="{dede:global.keyword/}" />
<button type="submit">搜索</button>
</form>
<hr>
<!-- 批量操作表单 -->
<form action="batch_do.php" method="post" onsubmit="return confirm('确定要执行此操作吗?');">
<table>
<thead>
<tr>
<th width="3%"><input type="checkbox" id="checkall" onclick="checkAll(this);"></th>
<th width="5%">ID</th>
<th width="45%">标题</th>
<th width="20%">栏目</th>
<th width="15%">发布时间</th>
<th width="12%">操作</th>
</tr>
</thead>
<tbody>
{dede:datalist}
<tr>
<!-- 单个复选框 -->
<td><input type="checkbox" name="arcids[]" value="{dede:field.id/}" /></td>
<td>{dede:field.id/}</td>
<td>
<a href="{dede:field name='arcurl'/}" target="_blank">{dede:field.title/}</a>
</td>
<td>{dede:field.typename/}</td>
<td>{dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/}</td>
<td>
<a href="javascript:;" class="action-btn" onclick="EditArc({dede:field.id/})">编辑</a>
<a href="javascript:;" class="action-btn" onclick="DelArc({dede:field.id/})">删除</a>
</td>
</tr>
{/dede:datalist}
</tbody>
</table>
<!-- 批量操作按钮 -->
<div style="margin-top: 10px;">
<button type="submit" name="submit" value="del">批量删除</button>
<button type="submit" name="submit" value="check">批量审核</button>
<button type="submit" name="submit" value="move">批量移动</button>
</div>
</form>
<!-- 分页 -->
{dede:pagelist listsize="5"/}
<script>
// 全选/反选功能
function checkAll(obj) {
var checkboxes = document.getElementsByName('arcids[]');
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].checked = obj.checked;
}
}
</script>
</body>
</html>
代码解析:
- 全选/反选:增加了一个
id="checkall"的全选复选框,并绑定了一个checkAll(this)JavaScript 函数,点击它,可以一键选中或取消选中下面所有的复选框,极大提升了用户体验。 - 批量操作按钮:将不同的操作放在同一个
name="submit"的按钮上,通过value值来区分,在PHP后端,你可以通过$_POST['submit']的值来判断用户点击的是哪个按钮。 - 确认提示:
onsubmit="return confirm('...')"在提交表单前会弹出一个确认框,防止误操作。
使用自定义函数(高级用法)
如果你的数据表中没有 id 字段,或者你想用其他字段(如文章的 aid)作为复选框的值,你可以使用自定义函数。
在 /include/extend.func.php 中添加函数:
/**
* 获取文章的ID (适用于不同表结构)
* @param string $fields 字段内容
* @return string
*/
function GetArcID($fields) {
// 假设你的主键字段是 'aid',或者通过其他方式获取
// 如果就是 'id',直接返回即可
// 这里以获取 'aid' 为例
global $dsql;
$aid = '';
// $fields 包含完整的行数据,可以解析
// 否则,你需要根据实际情况修改此函数
// 最简单的情况,直接返回一个固定的字段名
return $fields; // {dede:field.aid/} 可用,直接返回它
// 或者,如果你在 {dede:datalist} 循环外能获取到ID,可以在这里处理
// 这是一个更复杂的例子,通常不需要
// $query = "SELECT aid FROM dede_archives WHERE ...";
// $row = $dsql->GetOne($query);
// return $row['aid'];
}
在模板中调用函数:
<input type="checkbox" name="arcids[]" value="{dede:field.id function='GetArcID(@me)'/}" />
这种方式灵活性最高,但通常情况下,直接使用 {dede:field.id/} 就足够了。
后端处理 (batch_do.php) 示例
你的表单 action 会指向一个处理文件,batch_do.php,这个文件需要接收 arcids 数组并根据不同的操作执行相应的逻辑。
<?php
require_once(dirname(__FILE__)."/include/config_base.php");
require_once(DEDEINC."/datalistcp.class.php");
// 获取操作类型和选中的ID
$submit = isset($_POST['submit']) ? trim($_POST['submit']) : '';
$arcids = isset($_POST['arcids']) ? $_POST['arcids'] : array();
if (empty($arcids)) {
ShowMsg('请先选择要操作的文章!', '-1');
exit();
}
// 将ID数组用逗号连接成字符串,方便SQL的IN语句使用
$ids = implode(',', $arcids);
// 根据不同的操作执行不同的代码
switch ($submit) {
case 'del':
// 批量删除逻辑
// 注意:删除前最好先判断权限
$dsql->ExecuteNoneQuery("DELETE FROM `#@__archives` WHERE id IN ($ids)");
$dsql->ExecuteNoneQuery("DELETE FROM `#@__addonarticle` WHERE aid IN ($ids)"); // 如果有附加表
ShowMsg('批量删除成功!', 'list_article.php'); // 跳转回列表页
break;
case 'check':
// 批量审核逻辑
$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET arcrank=0 WHERE id IN ($ids)");
ShowMsg('批量审核成功!', 'list_article.php');
break;
case 'move':
// 批量移动逻辑(需要获取目标栏目ID)
$typeid = isset($_POST['typeid']) ? (int)$_POST['typeid'] : 0;
if ($typeid > 0) {
$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid=$typeid WHERE id IN ($ids)");
ShowMsg('批量移动成功!', 'list_article.php');
} else {
ShowMsg('请选择目标栏目!', '-1');
}
break;
default:
ShowMsg('未知操作!', '-1');
break;
}
exit();
?>
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一 | 简单直观,代码少 | 功能单一,无法实现真正的批量操作 | 快速测试或展示 |
| 方法二 | 功能完整,用户体验好,包含全选、分页、多种操作 | 代码稍长 | 绝大多数后台列表页 |
| 方法三 | 灵活性最高,可自定义数据源 | 实现复杂,需要懂PHP和DedeCMS底层 | 特殊数据结构或复杂业务逻辑 |
对于绝大多数用户来说,强烈推荐使用方法二,它已经是一个非常标准和完善的实现方案了。
