File manager - Edit - /var/www/order.cmtc.ac.th/user/checkout_form.php
Back
<meta charset="UTF-8"> <!-- ✅ โหลด SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <!-- ✅ ส่วนเลือกวิธีรับเหรียญ --> <div id="checkoutSection"> <h4>📦 เลือกวิธีรับเหรียญ</h4> <div class="mb-3"> <select name="receive_method" id="receiveMethod" class="form-control" required> <option value="">-- เลือกวิธีรับเหรียญ --</option> <option value="รับเหรียญด้วยตนเอง" <?=($checkout_old['receive_method']=='รับเหรียญด้วยตนเอง'?'selected':'')?>> รับเหรียญด้วยตนเอง </option> <option value="จัดส่งทางไปรษณีย์" <?=($checkout_old['receive_method']=='จัดส่งทางไปรษณีย์'?'selected':'')?>> จัดส่งทางไปรษณีย์ </option> </select> </div> <div id="customerInfo" class="border rounded p-3 bg-white" style="display:none;"> <h6 class="text-secondary mb-2">ข้อมูลผู้จอง / ผู้รับเหรียญ</h6> <div class="row"> <div class="col-md-6 mb-3"> <label>ชื่อ-นามสกุล</label> <input type="text" name="fullname" id="fullname" class="form-control" value="<?=htmlspecialchars($checkout_old['fullname'])?>"> </div> <div class="col-md-6 mb-3"> <label>เบอร์โทรศัพท์มือถือ</label> <input type="text" name="phone" id="phone" class="form-control" maxlength="10" pattern="[0-9]{10}" placeholder="เช่น 0812345678" value="<?=htmlspecialchars($checkout_old['phone'])?>"> <div class="form-text text-muted">* กรอกเฉพาะตัวเลข 10 หลัก</div> </div> </div> <div class="mb-3"> <label>ที่อยู่จัดส่ง</label> <textarea name="address" id="address" class="form-control" rows="2"><?=htmlspecialchars($checkout_old['address'])?></textarea> </div> <div class="col-md-4 mb-3"> <label>รหัสไปรษณีย์</label> <input type="text" name="zipcode" id="zipcode" class="form-control" maxlength="5" pattern="[0-9]{5}" placeholder="เช่น 50200" value="<?=htmlspecialchars($checkout_old['zipcode'])?>"> <div class="form-text text-muted">* กรอกเฉพาะตัวเลข 5 หลัก</div> </div> <!-- ✅ ส่วนเลือกธนาคาร --> <div class="mt-4"> <h4 class="text-secondary mb-2">💳 เลือกวิธีการชำระเงิน</h4> <div class="mb-3"> <div class="form-check"> <input class="form-check-input" type="radio" name="payment_bank" id="bankKTB" value="ธนาคารกรุงไทย" <?= (($_SESSION['checkout']['payment_bank'] ?? '') == 'ธนาคารกรุงไทย') ? 'checked' : '' ?> required> <label class="form-check-label" for="bankKTB">QR ธนาคารกรุงไทย</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="payment_bank" id="bankOther" value="ธนาคารอื่น ๆ (โปรดระบุยอดชำระ)" <?= (($_SESSION['checkout']['payment_bank'] ?? '') == 'ธนาคารอื่น ๆ (โปรดระบุยอดชำระ)') ? 'checked' : '' ?>> <label class="form-check-label" for="bankOther">QR ธนาคารอื่น ๆ (โปรดระบุยอดชำระ)</label> </div> </div> </div> </div> <div class="text-end mt-3"> <button type="submit" class="btn btn-success px-4 py-2">ดำเนินการต่อ ➜</button> </div> </div> <script> // ✅ แสดงฟอร์มเมื่อเลือกวิธีรับเหรียญ document.getElementById('receiveMethod')?.addEventListener('change', function() { document.getElementById('customerInfo').style.display = (this.value !== '') ? 'block' : 'none'; }); // ✅ ถ้ามีค่าเก่าจาก session ให้แสดงฟอร์มอัตโนมัติ document.addEventListener('DOMContentLoaded', function() { const oldMethod = "<?= $checkout_old['receive_method'] ?>"; if(oldMethod !== '') { document.getElementById('receiveMethod').value = oldMethod; document.getElementById('customerInfo').style.display = 'block'; } }); // ✅ จำกัดให้กรอกได้เฉพาะตัวเลข (เบอร์โทร และ รหัสไปรษณีย์) const phoneInput = document.getElementById('phone'); const zipInput = document.getElementById('zipcode'); phoneInput.addEventListener('input', function() { this.value = this.value.replace(/[^0-9]/g, '').slice(0, 10); this.classList.toggle('is-invalid', this.value.length !== 10); }); zipInput.addEventListener('input', function() { this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5); this.classList.toggle('is-invalid', this.value.length !== 5); }); // ✅ ตรวจสอบฟอร์มก่อนส่ง พร้อม SweetAlert Preview document.getElementById('cartForm').addEventListener('submit', function(e){ e.preventDefault(); // หยุดส่งฟอร์มก่อนตรวจสอบ const method = document.getElementById('receiveMethod').value; const name = document.getElementById('fullname').value.trim(); const phone = document.getElementById('phone').value.trim(); const address = document.getElementById('address').value.trim(); const zipcode = document.getElementById('zipcode').value.trim(); const paymentBank = document.querySelector('input[name="payment_bank"]:checked')?.value || ''; const phoneRegex = /^[0-9]{10}$/; const zipRegex = /^[0-9]{5}$/; const showAlert = (title, text, icon='warning') => { Swal.fire({ title, text, icon, confirmButtonText: 'ตกลง', confirmButtonColor: '#28a745' }); }; // ✅ ตรวจสอบตามเงื่อนไขเดิม if(method === ''){ showAlert('กรุณาเลือกวิธีรับเหรียญ', 'โปรดเลือกวิธีการรับเหรียญก่อนดำเนินการต่อ'); return; } if(method === 'รับเหรียญด้วยตนเอง'){ if(name === '' || !phoneRegex.test(phone)){ showAlert('ข้อมูลไม่ครบถ้วน', 'กรุณากรอกชื่อ และเบอร์โทรศัพท์มือถือให้ถูกต้อง (10 หลัก)'); return; } } if(method === 'จัดส่งทางไปรษณีย์'){ if(name === '' || !phoneRegex.test(phone) || address === '' || !zipRegex.test(zipcode)){ showAlert('ข้อมูลไม่ครบถ้วน', 'กรุณากรอกข้อมูลให้ครบและถูกต้อง: ชื่อ, เบอร์โทร, ที่อยู่, และรหัสไปรษณีย์'); return; } } if(paymentBank === ''){ showAlert('กรุณาเลือกวิธีการชำระเงิน', 'โปรดเลือกธนาคารสำหรับการชำระเงิน'); return; } // ✅ ดึงรายการสินค้าจากตะกร้า let items = []; document.querySelectorAll('#cartTable tr[data-id]').forEach(tr => { let name = tr.querySelector('td:nth-child(2)').textContent.trim(); let qty = tr.querySelector('.qty-input')?.value || '1'; let subtotal = tr.querySelector('.subtotal')?.textContent.trim() || '0'; items.push(`<tr><td>${name}</td><td class="text-end">${qty}</td><td class="text-end">${subtotal}</td></tr>`); }); let total = document.getElementById('cartTotal')?.textContent || '0.00'; // ✅ Preview ยืนยันข้อมูล let summaryHtml = ` <div style="text-align:left;line-height:1.6;font-size:1rem;"> <b>📛 ชื่อ-นามสกุล:</b> ${name}<br> <b>📞 เบอร์โทรศัพท์:</b> ${phone}<br> <b>📦 วิธีรับเหรียญ:</b> ${method}<br> ${method === 'จัดส่งทางไปรษณีย์' ? `<b>🏠 ที่อยู่จัดส่ง:</b> ${address}<br><b>📮 รหัสไปรษณีย์:</b> ${zipcode}<br>` : ''} <b>💳 วิธีชำระเงิน:</b> ${paymentBank} </div> <hr> <div style="max-height:300px;overflow-y:auto;"> <table class="table table-sm table-bordered"> <thead class="table-secondary"> <tr><th>ชื่อเหรียญ</th><th class="text-end">จำนวน</th><th class="text-end">รวม (บาท)</th></tr> </thead> <tbody>${items.join('')}</tbody> <tfoot> <tr><th colspan="2" class="text-end">ยอดรวมทั้งหมด</th><th class="text-end text-success">${total}</th></tr> </tfoot> </table> </div> `; Swal.fire({ title: 'โปรดยืนยันข้อมูลก่อนดำเนินการต่อ', html: summaryHtml, width: 700, icon: 'info', showCancelButton: true, confirmButtonText: 'ยืนยันข้อมูลถูกต้อง ➜', cancelButtonText: 'แก้ไขข้อมูล', confirmButtonColor: '#28a745', cancelButtonColor: '#6c757d', }).then((result) => { if (result.isConfirmed) { // ✅ บันทึกข้อมูลลง session ผ่าน AJAX fetch('save_checkout_session.php', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: new URLSearchParams({ fullname: name, phone: phone, address: address, zipcode: zipcode, receive_method: method, payment_bank: paymentBank }) }).then(() => { e.target.submit(); // ✅ ส่งฟอร์มต่อไป checkout.php }); } }); }); </script> <style> .is-invalid { border-color: #dc3545 !important; box-shadow: 0 0 0 0.2rem rgba(220,53,69,.25); } .form-text { font-size: 0.85rem; } .swal2-popup { font-family: 'Kanit', sans-serif; } </style>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.42 |
proxy
|
phpinfo
|
Settings