diff --git a/auth.php b/auth.php index c1b6085..b8daedb 100644 --- a/auth.php +++ b/auth.php @@ -23,7 +23,8 @@ if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') { $result = store_login_user($_POST); if (!empty($result['success'])) { store_flash('success', (string)($result['message'] ?? 'Login berhasil.')); - header('Location: ' . $redirectTo); + $destination = store_resume_pending_cart_add($redirectTo); + header('Location: ' . $destination); exit; } @@ -37,7 +38,8 @@ if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') { $result = store_register_user($_POST); if (!empty($result['success'])) { store_flash('success', (string)($result['message'] ?? 'Akun berhasil dibuat.')); - header('Location: ' . $redirectTo); + $destination = store_resume_pending_cart_add($redirectTo); + header('Location: ' . $destination); exit; } @@ -51,10 +53,13 @@ if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') { $currentUser = store_current_user(); $summary = store_cart_summary(); $categories = store_categories(); +$pendingCartAdd = store_pending_cart_add(); $accountTitle = $currentUser ? 'Akun Saya' : 'Login / Register'; $accountDescription = $currentUser ? 'Ringkasan akun user untuk melanjutkan belanja, checkout, dan melacak pesanan.' - : 'Halaman login dan registrasi user untuk masuk ke sistem menggunakan email dan password.'; + : ($pendingCartAdd + ? 'Login atau register untuk melanjutkan produk yang dipilih ke keranjang belanja.' + : 'Halaman login dan registrasi user untuk masuk ke sistem menggunakan email dan password.'); store_page_start($accountTitle, $accountDescription, ['noindex' => true]); ?> @@ -62,12 +67,18 @@ store_page_start($accountTitle, $accountDescription, ['noindex' => true]);
Login User

- +

+ : ($pendingCartAdd + ? 'Produk yang tadi dipilih akan otomatis dimasukkan ke keranjang setelah login atau registrasi berhasil.' + : 'Masukkan email dan password pada form login, atau buat akun baru melalui form registrasi agar data pengguna tersimpan lebih rapi.') ?>

@@ -150,6 +161,16 @@ store_page_start($accountTitle, $accountDescription, ['noindex' => true]);
+ + +
Login Register @@ -164,7 +185,7 @@ store_page_start($accountTitle, $accountDescription, ['noindex' => true]);

Masuk dengan email dan password

-

Gunakan akun yang sudah terdaftar untuk mengakses alur pemesanan dengan lebih cepat.

+

@@ -197,7 +218,7 @@ store_page_start($accountTitle, $accountDescription, ['noindex' => true]);

Daftarkan akun pengguna

-

Setelah registrasi berhasil, akun akan langsung aktif pada sesi browser ini.

+

diff --git a/cart.php b/cart.php index fe77039..3c52ba5 100644 --- a/cart.php +++ b/cart.php @@ -5,6 +5,7 @@ require_once __DIR__ . '/store.php'; $summary = store_cart_summary(); $lines = $summary['lines']; +$currentUser = store_current_user(); store_page_start('Keranjang', 'Tinjau item, ubah quantity, dan lanjutkan checkout.', ['noindex' => true]); ?> @@ -15,6 +16,13 @@ store_page_start('Keranjang', 'Tinjau item, ubah quantity, dan lanjutkan checkou

Update quantity, cek ongkir, lalu lanjut ke checkout untuk menyimpan pesanan ke sistem.

+ + + +
Keranjang kosong @@ -99,9 +107,16 @@ store_page_start('Keranjang', 'Tinjau item, ubah quantity, dan lanjutkan checkou

Gratis ongkir otomatis untuk subtotal mulai Rp 250.000.

- Lanjut ke checkout + + Lanjut ke checkout + + Login untuk lanjut checkout + Sudah punya kode pesanan?
+ +

Setelah login berhasil, Anda bisa kembali ke keranjang dan meneruskan checkout.

+ diff --git a/cart_action.php b/cart_action.php index df0283f..b1f9e85 100644 --- a/cart_action.php +++ b/cart_action.php @@ -15,6 +15,18 @@ switch ($action) { case 'add': $slug = (string)($_POST['slug'] ?? ''); $quantity = (int)($_POST['quantity'] ?? 1); + + if (!store_is_logged_in()) { + if (store_queue_cart_add_after_login($slug, $quantity, $redirectTo)) { + store_flash('warning', 'Silakan login terlebih dahulu untuk menambahkan produk ke keranjang.'); + header('Location: auth.php?mode=login&redirect_to=' . rawurlencode($redirectTo)); + exit; + } + + store_flash('danger', 'Produk tidak ditemukan.'); + break; + } + if (store_add_to_cart($slug, $quantity)) { $product = store_product($slug); store_flash('success', ($product['name'] ?? 'Produk') . ' ditambahkan ke keranjang.'); diff --git a/checkout.php b/checkout.php index f5d6e02..fa03ef8 100644 --- a/checkout.php +++ b/checkout.php @@ -10,9 +10,15 @@ if (!$summary['lines']) { exit; } +$currentUser = store_current_user(); +if (!$currentUser) { + store_flash('warning', 'Silakan login terlebih dahulu untuk melanjutkan checkout.'); + header('Location: auth.php?mode=login&redirect_to=checkout.php'); + exit; +} + $formData = store_checkout_defaults(); $errors = []; -$currentUser = store_current_user(); if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') { $result = store_create_order($_POST); @@ -35,12 +41,6 @@ store_page_start('Checkout', 'Lengkapi data pelanggan, alamat, dan metode pembay

Status awal pesanan adalah Menunggu Pembayaran. Instruksi pembayaran akan tampil setelah order berhasil dibuat.

- - - - diff --git a/product.php b/product.php index a281e70..9a52b55 100644 --- a/product.php +++ b/product.php @@ -25,6 +25,7 @@ if (!$product) { } $relatedProducts = store_related_products($product['slug'], $product['category']); +$currentUser = store_current_user(); store_page_start($product['name'], $product['short_description']); ?> @@ -81,6 +82,11 @@ store_page_start($product['name'], $product['short_description']); +
+
Alur user
+

Halaman detail ini dapat diakses semua pengunjung. Saat tombol keranjang dipilih, sistem akan mengecek login terlebih dahulu sebelum produk dimasukkan ke keranjang.

+
+
@@ -95,6 +101,11 @@ store_page_start($product['name'], $product['short_description']); Lihat keranjang + +

Login wajib sebelum produk masuk ke keranjang. Setelah login berhasil, item ini akan langsung ditambahkan dan Anda kembali ke halaman detail produk.

+ +

Anda sudah login, jadi produk ini bisa langsung dimasukkan ke keranjang belanja.

+
diff --git a/store.php b/store.php index 697f98f..7ffbe70 100644 --- a/store.php +++ b/store.php @@ -16,6 +16,7 @@ const STORE_CART_KEY = 'sekut_cart'; const STORE_FLASH_KEY = 'sekut_flash'; const STORE_LAST_ORDER_KEY = 'sekut_last_order'; const STORE_USER_KEY = 'sekut_user'; +const STORE_PENDING_CART_ADD_KEY = 'sekut_pending_cart_add'; function app_env(string $key, string $fallback = ''): string { @@ -91,12 +92,71 @@ function store_set_user_session(array $user): void function store_logout_user(): void { - unset($_SESSION[STORE_USER_KEY]); + unset($_SESSION[STORE_USER_KEY], $_SESSION[STORE_PENDING_CART_ADD_KEY]); if (session_status() === PHP_SESSION_ACTIVE) { session_regenerate_id(true); } } +function store_queue_cart_add_after_login(string $slug, int $quantity = 1, string $redirectTo = 'index.php'): bool +{ + $product = store_product($slug); + if (!$product) { + return false; + } + + $_SESSION[STORE_PENDING_CART_ADD_KEY] = [ + 'slug' => (string)$product['slug'], + 'quantity' => max(1, min(20, $quantity)), + 'redirect_to' => store_safe_redirect($redirectTo, 'index.php'), + ]; + + return true; +} + +function store_pending_cart_add(): ?array +{ + $pending = $_SESSION[STORE_PENDING_CART_ADD_KEY] ?? null; + if (!is_array($pending)) { + return null; + } + + $slug = (string)($pending['slug'] ?? ''); + if ($slug === '') { + unset($_SESSION[STORE_PENDING_CART_ADD_KEY]); + return null; + } + + $product = store_product($slug); + if (!$product) { + unset($_SESSION[STORE_PENDING_CART_ADD_KEY]); + return null; + } + + return [ + 'slug' => (string)$product['slug'], + 'quantity' => max(1, min(20, (int)($pending['quantity'] ?? 1))), + 'redirect_to' => store_safe_redirect((string)($pending['redirect_to'] ?? 'index.php'), 'index.php'), + 'product' => $product, + ]; +} + +function store_consume_pending_cart_add(): ?array +{ + $pending = store_pending_cart_add(); + unset($_SESSION[STORE_PENDING_CART_ADD_KEY]); + + if (!$pending) { + return null; + } + + return [ + 'slug' => (string)$pending['slug'], + 'quantity' => (int)$pending['quantity'], + 'redirect_to' => (string)$pending['redirect_to'], + ]; +} + function store_auth_password_error(string $password): string { if (store_strlen($password) < 8) { @@ -437,6 +497,35 @@ function store_add_to_cart(string $slug, int $quantity = 1): bool return true; } +function store_resume_pending_cart_add(string $fallback = 'index.php'): string +{ + $pending = store_consume_pending_cart_add(); + if (!$pending) { + return store_safe_redirect($fallback, 'index.php'); + } + + $redirectTo = store_safe_redirect((string)($pending['redirect_to'] ?? $fallback), $fallback); + $product = store_product((string)$pending['slug']); + + if (!$product) { + store_flash('danger', 'Produk yang dipilih sudah tidak tersedia.'); + return $redirectTo; + } + + $quantity = (int)($pending['quantity'] ?? 1); + if (store_add_to_cart((string)$pending['slug'], $quantity)) { + $message = ($product['name'] ?? 'Produk') . ' ditambahkan ke keranjang.'; + if ($quantity > 1) { + $message = ($product['name'] ?? 'Produk') . ' ditambahkan ke keranjang sebanyak ' . $quantity . ' item.'; + } + store_flash('success', $message); + } else { + store_flash('danger', 'Produk tidak ditemukan.'); + } + + return $redirectTo; +} + function store_update_cart(array $quantities): void { $products = store_products();