dede datalist复选框如何实现批量操作?

99ANYc3cd6
预计阅读时长 38 分钟
位置: 首页 DEDE建站 正文

核心思路

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

dede datalist 复选框
(图片来源网络,侵删)
  1. 使用 {dede:datalist} 遍历你的数据(如文章、软件、商品等)。
  2. 在循环内部,使用 <input type="checkbox"> 标签来创建一个复选框。
  3. 关键一步:为每个复选框设置一个唯一的 value 值,这个值通常是当前数据项的主键ID(如 id)。
  4. 可选但推荐:为所有复选框设置一个统一的 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"> 按钮用于触发表单提交。

更完整的列表页实现(推荐)

这是一个更完整、更规范的列表页实现,包含了分页、搜索和批量操作按钮。

dede datalist 复选框
(图片来源网络,侵删)

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底层 特殊数据结构或复杂业务逻辑

对于绝大多数用户来说,强烈推荐使用方法二,它已经是一个非常标准和完善的实现方案了。

-- 展开阅读全文 --
头像
织梦搜索页pagelist标签如何实现分页?
« 上一篇 今天
dede友情链接nofollow怎么设置?
下一篇 » 今天

相关文章

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

目录[+]