40) { $err = '分组名称过长(最多 40 字)'; } else { // 重名检查(排除自身) $dup = $db->prepare('SELECT COUNT(*) FROM ' . tn('product_groups') . ' WHERE name = ? AND id <> ?'); $dup->execute([$name, $id]); if ((int) $dup->fetchColumn() > 0) { $err = '已存在同名分组,请换一个名称'; } } if ($err === '') { if ($id > 0) { $db->prepare('UPDATE ' . tn('product_groups') . ' SET name=?, icon=?, sort_order=? WHERE id=?') ->execute([$name, $icon, $sort, $id]); $msg = '分组已更新'; } else { $db->prepare('INSERT INTO ' . tn('product_groups') . ' (name, icon, sort_order, created_at) VALUES (?,?,?,NOW())') ->execute([$name, $icon, $sort]); $msg = '分组已添加'; } } } // ---------- 删除 ---------- if (isset($_POST['delete'])) { verifyCsrf(); $id = (int) $_POST['delete']; $row = $db->prepare('SELECT name FROM ' . tn('product_groups') . ' WHERE id = ?'); $row->execute([$id]); $g = $row->fetch(); if ($g) { // 将该分组下的商品归为「其他」,避免孤儿数据 $db->prepare('UPDATE ' . tn('products') . ' SET category = ? WHERE category = ?') ->execute(['其他', $g['name']]); $db->prepare('DELETE FROM ' . tn('product_groups') . ' WHERE id = ?')->execute([$id]); $msg = '分组「' . $g['name'] . '」已删除,相关商品已归为「其他」'; } } // ---------- 编辑回填 ---------- $edit = null; if (isset($_GET['edit'])) { $stmt = $db->prepare('SELECT * FROM ' . tn('product_groups') . ' WHERE id = ?'); $stmt->execute([(int) $_GET['edit']]); $edit = $stmt->fetch(); } $showForm = ($edit !== null) || (isset($_GET['act']) && $_GET['act'] === 'add'); // ---------- 列表(含商品计数) ---------- $list = $db->query( 'SELECT g.*, (SELECT COUNT(*) FROM ' . tn('products') . ' p WHERE p.category = g.name) AS cnt FROM ' . tn('product_groups') . ' g ORDER BY g.sort_order ASC, g.id ASC' )->fetchAll(); adminHeader('商品分组', 'groups'); ?>
分组用于首页分类筛选与商品归类。删除分组会将其下商品自动归为「其他」,不会丢失商品数据。
= h($err) ?>
还没有分组,点上方「新增分组」添加吧。
| ID | 图标 | 名称 | 排序 | 商品数 | 操作 |
|---|---|---|---|---|---|
| = (int) $g['id'] ?> | = h($g['name']) ?> | = (int) $g['sort_order'] ?> | = (int) $g['cnt'] ?> |