File manager - Edit - /home/webapp69.cm.in.th/u69319090039/Shop39/public/app/Views/layouts/navbar.php
Back
<nav class="navbar navbar-expand-lg navbar-light sticky-top shadow-sm" style="background-color: #fff;"> <div class="container"> <div class="d-flex align-items-center gap-2"> <!-- Offcanvas Sidebar Menu Trigger Button --> <button class="btn text-dark border-0 fs-4 py-0 px-2 d-flex align-items-center" type="button" data-bs-toggle="offcanvas" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" title="เปิดเมนูด้านข้าง"> <i class="bi bi-list"></i> </button> <a class="navbar-brand fw-bold fs-4 d-flex align-items-center gap-2 m-0 logo-text" href="<?= APP_URL ?>"> <span class="logo-main">SHOP</span><span class="logo-sub">39</span> </a> </div> <button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarMain"> <!-- Search Bar in Header --> <!-- Search Bar with Autocomplete --> <div class="mx-auto my-2 my-lg-0 position-relative search-bar-header" style="min-width:420px;max-width:580px;" id="searchWrapper"> <form class="d-flex" action="<?= APP_URL ?>/products" method="GET" id="searchForm" autocomplete="off"> <div class="input-group border border-2 border-primary-subtle rounded-pill overflow-hidden bg-light w-100"> <input class="form-control border-0 shadow-none bg-transparent px-4" type="search" name="q" id="searchInput" placeholder="ค้นหาสินค้า ร้านค้า หรือหมวดหมู่..." value="<?= Security::e($_GET['q'] ?? '') ?>" role="combobox" aria-expanded="false" aria-autocomplete="list" aria-controls="searchDropdown"> <button class="btn btn-primary px-4 rounded-0" type="submit" id="searchBtn"><i class="bi bi-search"></i></button> </div> </form> <!-- Autocomplete Dropdown --> <div id="searchDropdown" class="position-absolute start-0 end-0 bg-white border rounded-3 shadow-lg mt-1 overflow-hidden d-none" style="z-index:9999;top:100%;"> <div id="searchResults"></div> </div> </div> <!-- Navigation Links & User Menu --> <ul class="navbar-nav ms-auto align-items-lg-center gap-2"> <li class="nav-item"> <a class="nav-link text-dark fw-semibold" href="<?= APP_URL ?>">หน้าแรก</a> </li> <li class="nav-item"> <a class="nav-link text-dark fw-semibold" href="<?= APP_URL ?>/products">สินค้าทั้งหมด</a> </li> <?php if (Auth::isApprovedSeller()): ?> <li class="nav-item"> <a class="nav-link text-warning fw-bold" href="<?= APP_URL ?>/store/<?= Security::e(Auth::sellerProfile()['slug']) ?>"><i class="bi bi-shop me-1"></i>หน้าร้านของฉัน</a> </li> <?php endif; ?> <li class="nav-item"> <a class="nav-link text-dark position-relative" href="<?= APP_URL ?>/wishlist"> <i class="bi bi-heart fs-5"></i> </a> </li> <li class="nav-item"> <a class="nav-link text-dark position-relative" href="<?= APP_URL ?>/cart"> <i class="bi bi-cart3 fs-5"></i> <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger" id="cartBadge"> <?= isset($_SESSION['cart']) ? count($_SESSION['cart']) : 0 ?> </span> </a> </li> <?php if (Auth::check()): ?> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle text-dark d-flex align-items-center gap-2 fw-bold ms-lg-2" href="#" role="button" data-bs-toggle="dropdown"> <?php if (!empty(Auth::user()['avatar']) && file_exists(SITE_ROOT . '/public/' . Auth::user()['avatar'])): ?> <img src="<?= APP_URL . '/public/' . Auth::user()['avatar'] ?>" alt="Avatar" class="rounded-circle border border-white" style="width: 28px; height: 28px; object-fit: cover;"> <?php else: ?> <i class="bi bi-person-circle fs-5"></i> <?php endif; ?> <?= Security::e(Auth::user()['full_name']) ?> </a> <ul class="dropdown-menu dropdown-menu-end shadow border-0 mt-2"> <li><a class="dropdown-item" href="<?= APP_URL ?>/profile"><i class="bi bi-person me-2"></i>ข้อมูลส่วนตัว</a></li> <li><a class="dropdown-item" href="<?= APP_URL ?>/orders"><i class="bi bi-box-seam me-2"></i>คำสั่งซื้อของฉัน</a></li> <li><a class="dropdown-item" href="<?= APP_URL ?>/wishlist"><i class="bi bi-heart me-2"></i>รายการที่ชอบ</a></li> <?php if (Auth::isAdmin()): ?> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item text-danger fw-bold" href="<?= APP_URL ?>/admin/dashboard"><i class="bi bi-speedometer2 me-2"></i>ผู้ดูแลระบบ (Admin)</a></li> <?php endif; ?> <?php if (Auth::isApprovedSeller()): ?> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item text-success fw-bold" href="<?= APP_URL ?>/store/<?= Security::e(Auth::sellerProfile()['slug']) ?>"><i class="bi bi-shop me-2"></i>หน้าร้านของฉัน</a></li> <li><a class="dropdown-item text-primary" href="<?= APP_URL ?>/seller/dashboard"><i class="bi bi-speedometer2 me-2"></i>Seller Dashboard</a></li> <?php else: ?> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item text-primary" href="<?= APP_URL ?>/seller/apply"><i class="bi bi-shop me-2"></i>สมัครเปิดร้านค้า</a></li> <?php endif; ?> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item text-danger" href="<?= APP_URL ?>/logout"><i class="bi bi-box-arrow-right me-2"></i>ออกจากระบบ</a></li> </ul> </li> <?php else: ?> <li class="nav-item ms-lg-2"> <a class="btn btn-outline-primary btn-sm px-3 rounded-pill me-1" href="<?= APP_URL ?>/login">เข้าสู่ระบบ</a> </li> <li class="nav-item"> <a class="btn btn-primary text-white btn-sm px-3 rounded-pill fw-bold" href="<?= APP_URL ?>/register">สมัครสมาชิก</a> </li> <?php endif; ?> </ul> </div> </div> </nav> <!-- Offcanvas Sidebar Navigation (เมนูด้านข้าง) --> <div class="offcanvas offcanvas-start" tabindex="-1" id="sidebarMenu" aria-labelledby="sidebarMenuLabel"> <div class="offcanvas-header bg-primary text-white"> <h5 class="offcanvas-title fw-bold" id="sidebarMenuLabel"><i class="bi bi-bag-check-fill me-2"></i>เมนูหลัก</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button> </div> <div class="offcanvas-body p-0"> <div class="list-group list-group-flush"> <div class="p-3 bg-light text-uppercase fw-bold text-muted small border-bottom"><i class="bi bi-compass me-2"></i>เมนูลัด</div> <a href="<?= APP_URL ?>" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-house-door me-3 text-primary fs-5"></i>หน้าแรก</a> <a href="<?= APP_URL ?>/products" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-grid me-3 text-primary fs-5"></i>สินค้ารวม</a> <a href="<?= APP_URL ?>/categories" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-tags me-3 text-primary fs-5"></i>หมวดหมู่สินค้า</a> <a href="<?= APP_URL ?>/cart" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-cart3 me-3 text-primary fs-5"></i>ตะกร้าสินค้า</a> <?php if (!Auth::isApprovedSeller()): ?> <div class="p-3 bg-light text-uppercase fw-bold text-muted small border-bottom"><i class="bi bi-people me-2"></i>สำหรับผู้ขาย</div> <a href="<?= APP_URL ?>/seller/apply" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-shop me-3 text-success fs-5"></i>สมัครเป็นผู้ขาย</a> <?php endif; ?> <div class="p-3 bg-light text-uppercase fw-bold text-muted small border-bottom"><i class="bi bi-box-seam me-2"></i>การสั่งซื้อ & สิ่งที่ชอบ</div> <a href="<?= APP_URL ?>/orders" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-bag-check me-3 text-info fs-5"></i>ติดตามคำสั่งซื้อ</a> <a href="<?= APP_URL ?>/wishlist" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-heart me-3 text-danger fs-5"></i>รายการที่ชอบ</a> <?php if (Auth::check()): ?> <div class="p-3 bg-light text-uppercase fw-bold text-muted small border-bottom"><i class="bi bi-person-gear me-2"></i>บัญชีผู้ใช้</div> <a href="<?= APP_URL ?>/profile" class="list-group-item list-group-item-action py-3 border-bottom"><i class="bi bi-person me-3 text-secondary fs-5"></i>ข้อมูลส่วนตัว</a> <?php if (Auth::isAdmin()): ?> <a href="<?= APP_URL ?>/admin/dashboard" class="list-group-item list-group-item-action py-3 border-bottom text-danger fw-bold"><i class="bi bi-speedometer2 me-3 fs-5"></i>ผู้ดูแลระบบ (Admin)</a> <?php endif; ?> <a href="<?= APP_URL ?>/logout" class="list-group-item list-group-item-action py-3 border-bottom text-danger"><i class="bi bi-box-arrow-right me-3 fs-5"></i>ออกจากระบบ</a> <?php endif; ?> </div> </div> </div> <!-- Flash Alerts Notification Container --> <div class="container mt-3"> <?php if ($msg = Session::getFlash('success')): ?> <div class="alert alert-success alert-dismissible fade show border-0 shadow-sm" role="alert"> <i class="bi bi-check-circle-fill me-2"></i><?= Security::e($msg) ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <?php if ($msg = Session::getFlash('danger')): ?> <div class="alert alert-danger alert-dismissible fade show border-0 shadow-sm" role="alert"> <i class="bi bi-exclamation-triangle-fill me-2"></i><?= Security::e($msg) ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <?php if ($msg = Session::getFlash('warning')): ?> <div class="alert alert-warning alert-dismissible fade show border-0 shadow-sm" role="alert"> <i class="bi bi-exclamation-circle-fill me-2"></i><?= Security::e($msg) ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> </div> <script> (function () { const input = document.getElementById('searchInput'); const dropdown = document.getElementById('searchDropdown'); const resultsBox = document.getElementById('searchResults'); const BASE_URL = '<?= APP_URL ?>'; if (!input || !dropdown || !resultsBox) return; let debounceTimer = null; let activeIndex = -1; let currentItems = []; function closeDropdown() { dropdown.classList.add('d-none'); input.setAttribute('aria-expanded', 'false'); activeIndex = -1; } function openDropdown() { dropdown.classList.remove('d-none'); input.setAttribute('aria-expanded', 'true'); } function renderResults(items) { currentItems = items; activeIndex = -1; if (items.length === 0) { resultsBox.innerHTML = '<div class="px-4 py-3 text-muted small"><i class="bi bi-search me-2"></i>ไม่พบสินค้าที่ค้นหา</div>'; openDropdown(); return; } resultsBox.innerHTML = items.map((item, i) => ` <a href="${item.url}" class="d-flex align-items-center gap-3 px-3 py-2 text-decoration-none text-dark search-suggest-item border-bottom" data-index="${i}" style="transition: background .15s;"> <img src="${item.image}" alt="${escHtml(item.title)}" style="width:48px;height:48px;object-fit:cover;border-radius:8px;flex-shrink:0;border:1px solid #eee;" onerror="this.src='${BASE_URL}/public/assets/images/sample-headphone.jpg'"> <div class="flex-grow-1 overflow-hidden"> <div class="fw-semibold text-truncate" style="font-size:14px;">${escHtml(item.title)}</div> <div class="small text-muted text-truncate">${escHtml(item.shop_name)}</div> </div> <div class="fw-bold text-primary flex-shrink-0" style="font-size:14px;">฿${item.price}</div> </a>`).join(''); openDropdown(); } function setActive(idx) { const els = resultsBox.querySelectorAll('.search-suggest-item'); els.forEach((el, i) => { el.style.backgroundColor = i === idx ? '#f0f4ff' : ''; }); activeIndex = idx; } function escHtml(str) { return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); } function fetchSuggestions(q) { if (q.trim().length < 1) { closeDropdown(); return; } fetch(`${BASE_URL}/api/search-suggest?q=${encodeURIComponent(q)}`) .then(r => r.json()) .then(data => renderResults(data)) .catch(() => closeDropdown()); } input.addEventListener('input', function () { clearTimeout(debounceTimer); debounceTimer = setTimeout(() => fetchSuggestions(this.value), 250); }); input.addEventListener('keydown', function (e) { const els = resultsBox.querySelectorAll('.search-suggest-item'); if (e.key === 'ArrowDown') { e.preventDefault(); setActive(Math.min(activeIndex + 1, els.length - 1)); } else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(Math.max(activeIndex - 1, -1)); } else if (e.key === 'Enter') { if (activeIndex >= 0 && els[activeIndex]) { e.preventDefault(); window.location.href = els[activeIndex].href; } // else let form submit naturally } else if (e.key === 'Escape') { closeDropdown(); } }); document.addEventListener('click', function (e) { if (!document.getElementById('searchWrapper').contains(e.target)) { closeDropdown(); } }); })(); </script>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings