File manager - Edit - /home/webapp69.cm.in.th/u69319090024/Shop24/cart.php
Back
<?php require_once __DIR__ . '/header.php'; $message = ''; $message_type = ''; // ------------------------------------------------------------ // จัดการการอัปเดต / ลบ สินค้าในตะกร้า // ------------------------------------------------------------ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $action = $_POST['action']; // 1. เพิ่มสินค้าลงตะกร้า (จากหน้า product_detail.php) if ($action === 'add_to_cart') { $p_id = filter_input(INPUT_POST, 'product_id', FILTER_VALIDATE_INT); $qty = filter_input(INPUT_POST, 'quantity', FILTER_VALIDATE_INT) ?: 1; $color = trim($_POST['color'] ?? ''); $size = trim($_POST['size'] ?? ''); if ($p_id && $qty > 0) { $stmt = $pdo->prepare("SELECT stock, name FROM products WHERE id = ?"); $stmt->execute([$p_id]); $prod = $stmt->fetch(); if ($prod) { // สร้าง key ที่เป็นเอกลักษณ์ $cart_key = $p_id . '_' . $color . '_' . $size; $current_qty = 0; if (isset($_SESSION['cart'][$cart_key])) { if (is_array($_SESSION['cart'][$cart_key])) { $current_qty = $_SESSION['cart'][$cart_key]['quantity']; } else { $current_qty = (int)$_SESSION['cart'][$cart_key]; } } $new_qty = $current_qty + $qty; if ($new_qty <= $prod['stock']) { $_SESSION['cart'][$cart_key] = [ 'product_id' => $p_id, 'quantity' => $new_qty, 'color' => $color, 'size' => $size ]; $message = "เพิ่ม <strong>" . htmlspecialchars($prod['name']) . "</strong> ลงในตะกร้าเรียบร้อยแล้ว!"; $details = []; if (!empty($color) && $color !== 'เริ่มต้น') $details[] = "สี: " . $color; if (!empty($size)) $details[] = "ไซส์: " . $size; if (!empty($details)) { $message .= " (" . implode(', ', $details) . ")"; } $message_type = "success"; } else { $message = "ขออภัย สต็อกสินค้าไม่เพียงพอ (มีจำหน่ายสูงสุด {$prod['stock']} ชิ้น)"; $message_type = "danger"; } } } } // 2. อัปเดตจำนวนสินค้าในตะกร้า if ($action === 'update') { $quantities = $_POST['quantity'] ?? []; foreach ($quantities as $cart_key => $qty) { $qty = (int)$qty; if ($qty <= 0) { unset($_SESSION['cart'][$cart_key]); } else { $parts = explode('_', $cart_key); $p_id = (int)$parts[0]; $stmt = $pdo->prepare("SELECT stock FROM products WHERE id = ?"); $stmt->execute([$p_id]); $stock = $stmt->fetchColumn(); if ($qty <= $stock) { if (isset($_SESSION['cart'][$cart_key]) && is_array($_SESSION['cart'][$cart_key])) { $_SESSION['cart'][$cart_key]['quantity'] = $qty; } else { // fallback $_SESSION['cart'][$cart_key] = [ 'product_id' => $p_id, 'quantity' => $qty, 'color' => $parts[1] ?? '', 'size' => $parts[2] ?? '' ]; } } else { if (isset($_SESSION['cart'][$cart_key]) && is_array($_SESSION['cart'][$cart_key])) { $_SESSION['cart'][$cart_key]['quantity'] = $stock; } else { $_SESSION['cart'][$cart_key] = [ 'product_id' => $p_id, 'quantity' => $stock, 'color' => $parts[1] ?? '', 'size' => $parts[2] ?? '' ]; } $message = "ปรับจำนวนสินค้าตามสต็อกที่มีอยู่จริงเรียบร้อยแล้ว"; $message_type = "warning"; } } } if (empty($message)) { $message = "อัปเดตจำนวนสินค้าในตะกร้าเรียบร้อยแล้ว"; $message_type = "success"; } } // 3. ลบสินค้าออกจากตะกร้า if ($action === 'remove' && isset($_POST['cart_key'])) { $cart_key = $_POST['cart_key']; unset($_SESSION['cart'][$cart_key]); $message = "ลบรายการสินค้าออกจากตะกร้าเรียบร้อยแล้ว"; $message_type = "info"; } // 4. ล้างสินค้าทั้งหมดในตะกร้า if ($action === 'clear') { unset($_SESSION['cart']); $message = "ล้างรายการสินค้าในตะกร้าทั้งหมดเรียบร้อยแล้ว"; $message_type = "info"; } } // ------------------------------------------------------------ // ดึงรายละเอียดสินค้าที่อยู่ในตะกร้าจาก DB // ------------------------------------------------------------ $cart_items = []; $total_price = 0; if (isset($_SESSION['cart']) && !empty($_SESSION['cart'])) { $product_ids = []; foreach ($_SESSION['cart'] as $cart_key => $item) { if (is_array($item)) { $product_ids[] = (int)$item['product_id']; } else { $parts = explode('_', $cart_key); $product_ids[] = (int)$parts[0]; } } $product_ids = array_unique($product_ids); if (!empty($product_ids)) { $placeholders = implode(',', array_fill(0, count($product_ids), '?')); $stmt = $pdo->prepare("SELECT * FROM products WHERE id IN ($placeholders)"); $stmt->execute($product_ids); $products_db = $stmt->fetchAll(); $products_map = []; foreach ($products_db as $p) { $products_map[$p['id']] = $p; } foreach ($_SESSION['cart'] as $cart_key => $item) { if (is_array($item)) { $p_id = $item['product_id']; $qty = $item['quantity']; $color = $item['color']; $size = $item['size']; } else { $parts = explode('_', $cart_key); $p_id = (int)$parts[0]; $qty = (int)$item; $color = $parts[1] ?? ''; $size = $parts[2] ?? ''; } if (isset($products_map[$p_id])) { $prod = $products_map[$p_id]; $display_image = $prod['image']; if (!empty($color) && $color !== 'เริ่มต้น') { $stmt_v = $pdo->prepare("SELECT image_front FROM product_variants WHERE product_id = ? AND color_name = ?"); $stmt_v->execute([$p_id, $color]); $var_img = $stmt_v->fetchColumn(); if ($var_img) { $display_image = $var_img; } } $subtotal = $prod['price'] * $qty; $total_price += $subtotal; $cart_items[] = [ 'cart_key' => $cart_key, 'id' => $p_id, 'name' => $prod['name'], 'price' => $prod['price'], 'image' => $display_image, 'stock' => $prod['stock'], 'color' => $color, 'size' => $size, 'quantity' => $qty, 'subtotal' => $subtotal ]; } } } } ?> <div class="row mb-4"> <div class="col-12"> <h3 class="fw-bold mb-1"><i class="fa-solid fa-cart-shopping text-primary me-2"></i>ตะกร้าสินค้าของคุณ</h3> <p class="text-muted small">ตรวจสอบรายการสินค้าและจำนวนก่อนดำเนินการชำระเงิน</p> </div> </div> <!-- Alert Message --> <?php if (!empty($message)): ?> <div class="alert alert-<?= $message_type ?> alert-dismissible fade show rounded-3 shadow-sm d-flex align-items-center mb-4" role="alert"> <i class="fa-solid fa-circle-info me-3 fs-5"></i> <div><?= $message ?></div> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <?php if (empty($cart_items)): ?> <!-- Empty Cart View --> <div class="card border-0 shadow-sm rounded-4 text-center py-5"> <div class="card-body"> <div class="mb-3 text-muted"> <i class="fa-solid fa-basket-shopping display-1 opacity-50"></i> </div> <h4 class="fw-bold">ยังไม่มีสินค้าในตะกร้า</h4> <p class="text-muted">เลือกซื้อสินค้าไอทีที่น่าสนใจในร้านค้าของเราได้ทันที</p> <a href="index.php" class="btn btn-primary-custom rounded-pill px-4 py-2 mt-2"> <i class="fa-solid fa-store me-2"></i> ไปหน้าเลือกซื้อสินค้า </a> </div> </div> <?php else: ?> <!-- Cart Table View --> <form method="POST" action="cart.php"> <input type="hidden" name="action" value="update"> <div class="row g-4"> <div class="col-lg-8"> <div class="card border-0 shadow-sm rounded-4 overflow-hidden mb-3"> <div class="card-body p-0"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th style="width: 40%;" class="ps-4">สินค้า</th> <th style="width: 18%;">ราคาต่อชิ้น</th> <th style="width: 18%;">จำนวน</th> <th style="width: 18%;">ราคารวม</th> <th style="width: 6%;" class="text-center pe-4">ลบ</th> </tr> </thead> <tbody> <?php foreach ($cart_items as $item): ?> <tr> <td class="ps-4"> <div class="d-flex align-items-center gap-3 py-2"> <?php $img = get_product_image_url($item['image']); ?> <img src="<?= htmlspecialchars($img) ?>" class="rounded-3 border" style="width: 60px; height: 60px; object-fit: cover;" alt=""> <div> <h6 class="mb-0 fw-semibold text-dark"><?= htmlspecialchars($item['name']) ?></h6> <div class="d-flex flex-wrap gap-1 mt-1"> <?php if (!empty($item['color']) && $item['color'] !== 'เริ่มต้น'): ?> <span class="badge bg-light text-dark border rounded-pill px-2 py-1" style="font-size: 0.7rem;">สี: <?= htmlspecialchars($item['color']) ?></span> <?php endif; ?> <?php if (!empty($item['size'])): ?> <span class="badge bg-light text-dark border rounded-pill px-2 py-1" style="font-size: 0.7rem;">ไซส์: <?= htmlspecialchars($item['size']) ?></span> <?php endif; ?> </div> <small class="text-muted d-block mt-1" style="font-size: 0.75rem;">คงเหลือ: <?= $item['stock'] ?> ชิ้น</small> </div> </div> </td> <td class="fw-medium text-secondary"> <?= format_price($item['price']) ?> </td> <td> <input type="number" name="quantity[<?= $item['cart_key'] ?>]" value="<?= $item['quantity'] ?>" min="1" max="<?= $item['stock'] ?>" class="form-control form-control-sm text-center fw-semibold quantity-input" style="width: 70px;" onchange="this.form.submit();"> </td> <td class="fw-bold text-primary"> <?= format_price($item['subtotal']) ?> </td> <td class="text-center pe-4"> <button type="submit" name="action" value="remove" onclick="this.form.cart_key.value='<?= $item['cart_key'] ?>';" class="btn btn-outline-danger btn-sm rounded-circle p-0" style="width: 32px; height: 32px;" title="ลบรายการนี้"> <i class="fa-solid fa-trash-can"></i> </button> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <input type="hidden" name="cart_key" value=""> </div> <div class="card-footer bg-white d-flex justify-content-between align-items-center p-3"> <a href="index.php" class="btn btn-outline-secondary btn-sm rounded-pill px-3"> <i class="fa-solid fa-arrow-left me-1"></i> เลือกซื้อสินค้าเพิ่ม </a> <div class="d-flex gap-2"> <button type="submit" name="action" value="clear" onclick="return confirm('คุณต้องการล้างสินค้าในตะกร้าทั้งหมดใช่หรือไม่?');" class="btn btn-outline-danger btn-sm rounded-pill px-3"> <i class="fa-solid fa-rotate-left me-1"></i> ล้างตะกร้า </button> <button type="submit" class="btn btn-primary btn-sm rounded-pill px-3"> <i class="fa-solid fa-sync me-1"></i> อัปเดตคำนวณใหม่ </button> </div> </div> </div> </div> <!-- Summary Order Sidebar --> <div class="col-lg-4"> <div class="card border-0 shadow-sm rounded-4"> <div class="card-body p-4"> <h5 class="fw-bold mb-3">สรุปรายการสั่งซื้อ</h5> <div class="d-flex justify-content-between mb-2"> <span class="text-muted">จำนวนรวม</span> <span class="fw-semibold"><?= get_cart_count() ?> ชิ้น</span> </div> <div class="d-flex justify-content-between mb-3"> <span class="text-muted">ค่าจัดส่ง</span> <span class="text-success fw-semibold"><i class="fa-solid fa-truck-fast me-1"></i>ฟรีค่าจัดส่ง</span> </div> <hr> <div class="d-flex justify-content-between align-items-center mb-4"> <span class="fw-bold fs-5">ราคารวมสุทธิ</span> <span class="fw-bold fs-4 text-primary"><?= format_price($total_price) ?></span> </div> <?php if (is_logged_in()): ?> <a href="checkout.php" class="btn btn-primary-custom w-100 py-2.5 rounded-pill fw-semibold fs-6"> <i class="fa-solid fa-credit-card me-2"></i>ดำเนินการชำระเงิน </a> <?php else: ?> <div class="alert alert-warning py-2 small mb-3"> <i class="fa-solid fa-lock me-1"></i> กรุณาเข้าสู่ระบบก่อนทำการชำระเงิน </div> <a href="login.php" class="btn btn-primary-custom w-100 py-2.5 rounded-pill fw-semibold fs-6"> <i class="fa-solid fa-right-to-bracket me-2"></i>เข้าสู่ระบบเพื่อชำระเงิน </a> <?php endif; ?> </div> </div> </div> </div> </form> <?php endif; ?> <script> document.addEventListener('DOMContentLoaded', function() { const inputs = document.querySelectorAll('.quantity-input'); inputs.forEach(input => { // เมื่อเปลี่ยนค่าหรือกดปุ่มขึ้น-ลงให้ส่งฟอร์มคำนวณใหม่อัตโนมัติ input.addEventListener('input', function() { if (this.value !== '' && parseInt(this.value) >= 0) { // หน่วงเวลาเล็กน้อย 400ms เผื่อกรณีผู้ใช้พิมพ์ตัวเลขหลายหลัก clearTimeout(this.timer); this.timer = setTimeout(() => { this.form.submit(); }, 400); } }); }); }); </script> <?php require_once __DIR__ . '/footer.php'; ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.26 |
proxy
|
phpinfo
|
Settings