File manager - Edit - /home/webapp69.cm.in.th/u69319090039/Shop39/app/Views/admin/stores/index.php
Back
<div class="d-flex justify-content-between align-items-center mb-4"> <h4 class="fw-bold m-0"><i class="bi bi-shop-window text-danger me-2"></i>จัดการร้านค้า</h4> <a href="<?= APP_URL ?>/admin/stores/deleted" class="btn btn-outline-secondary btn-sm rounded-pill"><i class="bi bi-trash me-1"></i>ร้านค้าที่ถูกลบ</a> </div> <!-- Stats Bar --> <div class="row g-3 mb-4"> <div class="col-md-3"> <div class="card border-0 shadow-sm p-3 bg-white"> <div class="text-muted small">ร้านค้าทั้งหมด</div> <h4 class="fw-bold m-0"><?= number_format($counts['total_count']) ?></h4> </div> </div> <div class="col-md-3"> <div class="card border-0 shadow-sm p-3 bg-white"> <div class="text-success small">Active</div> <h4 class="fw-bold m-0"><?= number_format($counts['active_count']) ?></h4> </div> </div> <div class="col-md-3"> <div class="card border-0 shadow-sm p-3 bg-white"> <div class="text-warning small">Suspended</div> <h4 class="fw-bold m-0"><?= number_format($counts['suspended_count']) ?></h4> </div> </div> <div class="col-md-3"> <div class="card border-0 shadow-sm p-3 bg-white"> <div class="text-danger small">Banned</div> <h4 class="fw-bold m-0"><?= number_format($counts['banned_count']) ?></h4> </div> </div> </div> <!-- Filter Box --> <div class="card border-0 shadow-sm p-3 mb-4"> <form method="GET" action="<?= APP_URL ?>/admin/stores" class="row g-3 align-items-center"> <div class="col-md-4"> <div class="input-group"> <span class="input-group-text bg-white border-end-0"><i class="bi bi-search text-muted"></i></span> <input type="text" name="q" value="<?= Security::e($search) ?>" class="form-control border-start-0" placeholder="ค้นหาชื่อร้าน, เจ้าของ, อีเมล..."> </div> </div> <div class="col-md-3"> <select name="status" class="form-select"> <option value="">-- ทุกสถานะ --</option> <option value="approved" <?= $statusFilter === 'approved' ? 'selected' : '' ?>>Active (Approved)</option> <option value="pending" <?= $statusFilter === 'pending' ? 'selected' : '' ?>>Pending Approval</option> <option value="rejected" <?= $statusFilter === 'rejected' ? 'selected' : '' ?>>Rejected</option> <option value="suspended" <?= $statusFilter === 'suspended' ? 'selected' : '' ?>>Suspended</option> <option value="banned" <?= $statusFilter === 'banned' ? 'selected' : '' ?>>Banned</option> </select> </div> <div class="col-md-2"> <button type="submit" class="btn btn-dark w-100 rounded-pill"><i class="bi bi-funnel me-1"></i>กรอง</button> </div> </form> </div> <!-- Stores Table --> <div class="card border-0 shadow-sm rounded-3"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th class="ps-4">ชื่อร้าน</th> <th>เจ้าของร้าน</th> <th class="text-center">จำนวนสินค้า</th> <th class="text-center">จำนวนคำสั่งซื้อ</th> <th class="text-center">คะแนนรีวิวเฉลี่ย</th> <th>วันที่สมัคร</th> <th>สถานะ</th> <th class="text-end pe-4">การจัดการ</th> </tr> </thead> <tbody> <?php if (empty($stores)): ?> <tr> <td colspan="8" class="text-center py-4 text-muted">ไม่พบข้อมูลร้านค้า</td> </tr> <?php endif; ?> <?php foreach ($stores as $s): ?> <?php $avg = (float)$s['avg_rating']; $ratingClass = ''; if ($avg > 0 && $avg < 2.0) { $ratingClass = 'table-danger'; // Critical highlighting } elseif ($avg > 0 && $avg < 2.5) { $ratingClass = 'table-warning'; // Warning highlighting } ?> <tr class="<?= $ratingClass ?>"> <td class="ps-4"> <div class="d-flex align-items-center"> <img src="<?= APP_URL ?>/public/uploads/<?= Security::e($s['logo'] ?? 'default-shop-logo.png') ?>" alt="logo" class="rounded-circle me-2" style="width: 40px; height: 40px; object-fit: cover; border: 1px solid #dee2e6;"> <div> <div class="fw-bold text-dark"><?= Security::e($s['shop_name']) ?></div> <div class="small text-muted"><?= Security::e($s['slug']) ?></div> </div> </div> </td> <td> <div class="fw-semibold"><?= Security::e($s['full_name']) ?></div> <div class="small text-muted"><?= Security::e($s['email']) ?></div> </td> <td class="text-center fw-bold"><?= number_format($s['product_count']) ?> ชิ้น</td> <td class="text-center fw-bold"><?= number_format($s['order_count']) ?> รายการ</td> <td class="text-center"> <?php if ($avg > 0): ?> <span class="fw-bold"><?= number_format($avg, 1) ?></span> <span class="text-warning">★</span> <div class="small text-muted">(<?= $s['review_count'] ?> รีวิว)</div> <?php else: ?> <span class="text-muted small">ไม่มีรีวิว</span> <?php endif; ?> </td> <td><?= date('d/m/Y', strtotime($s['created_at'])) ?></td> <td> <?php if ($s['status'] === 'approved') { $badge = 'bg-success'; $lbl = 'Active'; } elseif ($s['status'] === 'suspended') { $badge = 'bg-warning text-dark'; $lbl = 'Suspended'; } elseif ($s['status'] === 'banned') { $badge = 'bg-danger'; $lbl = 'Banned'; } elseif ($s['status'] === 'rejected') { $badge = 'bg-secondary'; $lbl = 'Rejected'; } else { $badge = 'bg-light text-dark'; $lbl = 'Pending'; } ?> <span class="badge <?= $badge ?> px-3 py-2 rounded-pill"><?= $lbl ?></span> <?php if ($s['status'] === 'suspended' && !empty($s['suspended_reason'])): ?> <div class="small text-muted mt-1" style="max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" title="<?= Security::e($s['suspended_reason']) ?>"> เหตุผล: <?= Security::e($s['suspended_reason']) ?> </div> <?php endif; ?> </td> <td class="text-end pe-4"> <div class="btn-group"> <a href="<?= APP_URL ?>/admin/stores/detail/<?= $s['id'] ?>" class="btn btn-sm btn-outline-primary"><i class="bi bi-eye"></i></a> <?php if ($s['status'] === 'approved'): ?> <button type="button" class="btn btn-sm btn-outline-warning" onclick="openSuspendModal(<?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')">ระงับ</button> <button type="button" class="btn btn-sm btn-outline-danger" onclick="confirmAction('ban', <?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')">แบน</button> <?php elseif ($s['status'] === 'suspended'): ?> <button type="button" class="btn btn-sm btn-outline-success" onclick="confirmAction('unsuspend', <?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')">ปลดระงับ</button> <button type="button" class="btn btn-sm btn-outline-danger" onclick="confirmAction('ban', <?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')">แบน</button> <?php elseif ($s['status'] === 'banned'): ?> <button type="button" class="btn btn-sm btn-outline-success" onclick="confirmAction('unban', <?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')">ปลดแบน</button> <?php endif; ?> <button type="button" class="btn btn-sm btn-danger" onclick="confirmAction('delete', <?= $s['id'] ?>, '<?= Security::e($s['shop_name']) ?>')"><i class="bi bi-trash"></i></button> </div> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> <!-- Forms for actions --> <form id="actionForm" method="POST" style="display:none;"> <input type="hidden" name="csrf_token" value="<?= $csrf_token ?>"> </form> <!-- Suspend Modal --> <div class="modal fade" id="suspendModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog"> <form id="suspendForm" method="POST"> <input type="hidden" name="csrf_token" value="<?= $csrf_token ?>"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title fw-bold">ระงับการทำงานร้านค้า: <span id="suspendShopName"></span></h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="mb-3"> <label class="form-label fw-bold">กรุณาเลือกหรือระบุเหตุผลในการระงับ</label> <select name="suspended_reason_select" id="suspended_reason_select" class="form-select mb-3" onchange="toggleCustomReason(this.value)"> <option value="ขายสินค้าปลอม">ขายสินค้าปลอม</option> <option value="หลอกลวงลูกค้า">หลอกลวงลูกค้า</option> <option value="รีวิวต่ำกว่ามาตรฐาน">รีวิวต่ำกว่ามาตรฐาน</option> <option value="ส่งสินค้าล่าช้าซ้ำซาก">ส่งสินค้าล่าช้าซ้ำซาก</option> <option value="ละเมิดกฎ Marketplace">ละเมิดกฎ Marketplace</option> <option value="other">อื่นๆ (โปรดระบุ)</option> </select> <textarea class="form-control" name="custom_reason" id="custom_reason" rows="3" placeholder="ระบุเหตุผลอื่นเพิ่มเติม..." style="display:none;"></textarea> <input type="hidden" name="suspended_reason" id="final_suspended_reason"> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary rounded-pill" data-bs-dismiss="modal">ยกเลิก</button> <button type="submit" class="btn btn-warning fw-bold rounded-pill px-4" onclick="submitSuspend()">ยืนยันการระงับ</button> </div> </div> </form> </div> </div> <script> function openSuspendModal(id, name) { document.getElementById('suspendShopName').innerText = name; document.getElementById('suspendForm').action = '<?= APP_URL ?>/admin/stores/suspend/' + id; var modal = new bootstrap.Modal(document.getElementById('suspendModal')); modal.show(); } function toggleCustomReason(val) { var ta = document.getElementById('custom_reason'); if (val === 'other') { ta.style.display = 'block'; ta.required = true; } else { ta.style.display = 'none'; ta.required = false; } } function submitSuspend() { var sel = document.getElementById('suspended_reason_select').value; var finalReason = document.getElementById('final_suspended_reason'); if (sel === 'other') { finalReason.value = document.getElementById('custom_reason').value; } else { finalReason.value = sel; } } function confirmAction(action, id, shopName) { let msg = ""; let url = ""; if (action === 'ban') { msg = `คุณแน่ใจหรือไม่ว่าต้องการแบนร้านค้า "${shopName}"? ร้านค้าจะไม่สามารถเข้าสู่ระบบ Seller Panel และสินค้าทั้งหมดจะถูกซ่อน`; url = `<?= APP_URL ?>/admin/stores/ban/${id}`; } else if (action === 'unban') { msg = `คุณต้องการปลดแบนร้านค้า "${shopName}" หรือไม่?`; url = `<?= APP_URL ?>/admin/stores/unban/${id}`; } else if (action === 'unsuspend') { msg = `คุณต้องการปลดระงับร้านค้า "${shopName}" หรือไม่?`; url = `<?= APP_URL ?>/admin/stores/unsuspend/${id}`; } else if (action === 'delete') { msg = `คุณแน่ใจหรือไม่ว่าต้องการลบร้านค้า "${shopName}"? (หากร้านมีประวัติคำสั่งซื้อ ระบบจะใช้ Soft Delete อัตโนมัติ เพื่อรักษาประวัติเดิม)`; url = `<?= APP_URL ?>/admin/stores/delete/${id}`; } if (confirm(msg)) { let form = document.getElementById('actionForm'); form.action = url; form.submit(); } } </script>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.25 |
proxy
|
phpinfo
|
Settings