File manager - Edit - /home/webapp69.cm.in.th/u69319090039/Shop39/public/assets/app/Controllers/Admin/AdminStoreController.php
Back
<?php class AdminStoreController extends Controller { /** * List all active stores (not soft-deleted) */ public function index(): void { $db = Database::getInstance(); $search = trim(Security::sanitizeString($_GET['q'] ?? '')); $statusFilter = trim(Security::sanitizeString($_GET['status'] ?? '')); $sql = " SELECT sp.*, u.full_name, u.email, (SELECT COUNT(*) FROM products WHERE seller_id = sp.id) AS product_count, (SELECT COUNT(*) FROM orders WHERE seller_id = sp.id) AS order_count, (SELECT COALESCE(AVG(r.rating), 0) FROM reviews r JOIN products p ON r.product_id = p.id WHERE p.seller_id = sp.id) AS avg_rating, (SELECT COUNT(r.id) FROM reviews r JOIN products p ON r.product_id = p.id WHERE p.seller_id = sp.id) AS review_count FROM seller_profiles sp JOIN users u ON sp.user_id = u.id WHERE sp.deleted_at IS NULL "; $params = []; if (!empty($search)) { $sql .= " AND (sp.shop_name LIKE :search OR u.full_name LIKE :search OR u.email LIKE :search)"; $params['search'] = "%{$search}%"; } if (!empty($statusFilter) && in_array($statusFilter, ['approved', 'pending', 'rejected', 'suspended', 'banned'])) { $sql .= " AND sp.status = :status"; $params['status'] = $statusFilter; } $sql .= " ORDER BY sp.id DESC"; $stmt = $db->prepare($sql); $stmt->execute($params); $stores = $stmt->fetchAll(); // Count stats $countSql = " SELECT SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END) AS active_count, SUM(CASE WHEN status = 'suspended' THEN 1 ELSE 0 END) AS suspended_count, SUM(CASE WHEN status = 'banned' THEN 1 ELSE 0 END) AS banned_count, COUNT(*) AS total_count FROM seller_profiles WHERE deleted_at IS NULL "; $counts = $db->query($countSql)->fetch() ?: ['active_count' => 0, 'suspended_count' => 0, 'banned_count' => 0, 'total_count' => 0]; $this->render('admin/stores/index', [ 'title' => 'จัดการร้านค้า', 'stores' => $stores, 'search' => $search, 'statusFilter' => $statusFilter, 'counts' => $counts, 'csrf_token' => Session::getCsrfToken() ], 'admin'); } /** * Store detail page */ public function detail(string $id): void { $db = Database::getInstance(); $storeId = (int)$id; $stmt = $db->prepare(" SELECT sp.*, u.full_name, u.email, u.phone AS user_phone, u.created_at AS user_created_at, (SELECT COUNT(*) FROM products WHERE seller_id = sp.id) AS product_count, (SELECT COUNT(*) FROM orders WHERE seller_id = sp.id) AS order_count, (SELECT COALESCE(SUM(total_amount), 0) FROM orders WHERE seller_id = sp.id AND status = 'paid') AS total_sales, (SELECT COALESCE(AVG(r.rating), 0) FROM reviews r JOIN products p ON r.product_id = p.id WHERE p.seller_id = sp.id) AS avg_rating, (SELECT COUNT(r.id) FROM reviews r JOIN products p ON r.product_id = p.id WHERE p.seller_id = sp.id) AS review_count FROM seller_profiles sp JOIN users u ON sp.user_id = u.id WHERE sp.id = :id "); $stmt->execute(['id' => $storeId]); $store = $stmt->fetch(); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } // Get recent orders $orderStmt = $db->prepare(" SELECT o.*, u.full_name AS customer_name FROM orders o JOIN users u ON o.user_id = u.id WHERE o.seller_id = :sid ORDER BY o.created_at DESC LIMIT 10 "); $orderStmt->execute(['sid' => $storeId]); $recentOrders = $orderStmt->fetchAll(); // Get recent products $prodStmt = $db->prepare(" SELECT p.*, (SELECT image_path FROM product_images WHERE product_id = p.id ORDER BY is_primary DESC, id ASC LIMIT 1) AS primary_image FROM products p WHERE p.seller_id = :sid ORDER BY p.id DESC LIMIT 10 "); $prodStmt->execute(['sid' => $storeId]); $recentProducts = $prodStmt->fetchAll(); $this->render('admin/stores/detail', [ 'title' => 'รายละเอียดร้าน - ' . $store['shop_name'], 'store' => $store, 'recentOrders' => $recentOrders, 'recentProducts' => $recentProducts, 'csrf_token' => Session::getCsrfToken() ], 'admin'); } /** * Suspend a store */ public function suspend(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $reason = Security::sanitizeString($_POST['suspended_reason'] ?? 'ละเมิดกฎ Marketplace'); $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } $sellerModel->suspend($storeId, $reason); Session::setFlash('success', "ระงับร้านค้า \"{$store['shop_name']}\" เรียบร้อยแล้ว เหตุผล: {$reason}"); $this->redirect('admin/stores'); } /** * Unsuspend a store */ public function unsuspend(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } $sellerModel->unsuspend($storeId); Session::setFlash('success', "ปลดระงับร้านค้า \"{$store['shop_name']}\" เรียบร้อยแล้ว"); $this->redirect('admin/stores'); } /** * Ban a store */ public function ban(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } $sellerModel->ban($storeId); Session::setFlash('success', "แบนร้านค้า \"{$store['shop_name']}\" เรียบร้อยแล้ว"); $this->redirect('admin/stores'); } /** * Unban a store */ public function unban(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } $sellerModel->unban($storeId); Session::setFlash('success', "ปลดแบนร้านค้า \"{$store['shop_name']}\" เรียบร้อยแล้ว"); $this->redirect('admin/stores'); } /** * Soft delete a store (or hard delete if no orders) */ public function delete(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store) { Session::setFlash('danger', 'ไม่พบร้านค้า'); $this->redirect('admin/stores'); } if ($sellerModel->hasOrders($storeId)) { // Has orders — soft delete only $sellerModel->softDelete($storeId); Session::setFlash('success', "ลบร้านค้า \"{$store['shop_name']}\" แบบ Soft Delete เรียบร้อยแล้ว (ประวัติคำสั่งซื้อยังคงอยู่)"); } else { // No orders — hard delete allowed $sellerModel->delete($storeId); Session::setFlash('success', "ลบร้านค้า \"{$store['shop_name']}\" ถาวรเรียบร้อยแล้ว"); } $this->redirect('admin/stores'); } /** * List soft-deleted stores */ public function deleted(): void { $db = Database::getInstance(); $stmt = $db->prepare(" SELECT sp.*, u.full_name, u.email, (SELECT COUNT(*) FROM orders WHERE seller_id = sp.id) AS order_count FROM seller_profiles sp JOIN users u ON sp.user_id = u.id WHERE sp.deleted_at IS NOT NULL ORDER BY sp.deleted_at DESC "); $stmt->execute(); $stores = $stmt->fetchAll(); $this->render('admin/stores/deleted', [ 'title' => 'ร้านค้าที่ถูกลบ', 'stores' => $stores, 'csrf_token' => Session::getCsrfToken() ], 'admin'); } /** * Restore a soft-deleted store */ public function restore(string $id): void { $this->validateCsrf(); $storeId = (int)$id; $sellerModel = new SellerProfile(); $store = $sellerModel->findById($storeId); if (!$store || !$store['deleted_at']) { Session::setFlash('danger', 'ไม่พบร้านค้าที่ถูกลบ'); $this->redirect('admin/stores/deleted'); } $sellerModel->restore($storeId); Session::setFlash('success', "กู้คืนร้านค้า \"{$store['shop_name']}\" เรียบร้อยแล้ว"); $this->redirect('admin/stores'); } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings