From 20dd5c8f61524f4fc6a79770dd3ee6fd9128c45a Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 3 Dec 2025 22:04:46 +0000 Subject: [PATCH] 3 ver --- about.php | 61 ++ admin/add_product.php | 102 ++- admin/assets/css/admin_style.css | 259 ++++++++ admin/auth_check.php | 4 +- admin/edit_product.php | 173 ++--- admin/footer.php | 7 + admin/handler.php | 164 ++--- admin/header.php | 27 + admin/index.php | 191 +++--- admin/login.php | 17 +- admin/nav.php | 42 ++ admin/orders.php | 131 ++++ admin/products.php | 119 ++++ admin/test.php | 1 + assets/css/auth_style.css | 248 +++++++ assets/css/custom.css | 611 +++++++++++++++--- ... Google Chrome 12_09_1404 10_38_28 ب.ظ.png | Bin 0 -> 84095 bytes assets/js/main.js | 42 +- assets/pasted-20251203-190906-4bf15fd7.png | Bin 0 -> 84095 bytes auth_handler.php | 147 +++++ cart.php | 211 +++--- cart_handler.php | 113 ++-- checkout.php | 323 ++++----- checkout_handler.php | 100 +++ contact.php | 112 ++-- db/migrations/001_add_colors_to_products.sql | 3 +- .../002_add_is_featured_to_products.sql | 3 +- db/migrations/003_create_orders_table.sql | 13 + db/migrations/004_create_users_table.sql | 11 + .../005_create_user_addresses_table.sql | 12 + db/migrations/006_add_is_admin_to_users.sql | 2 + db/migrations/007_update_orders_table.sql | 18 + db/migrations/008_create_otp_table.sql | 9 + includes/footer.php | 6 +- includes/header.php | 34 +- index.php | 12 +- login.php | 84 +++ logout.php | 3 + product.php | 123 ++-- profile.php | 119 ++++ shop.php | 76 ++- verify.php | 75 +++ 42 files changed, 2923 insertions(+), 885 deletions(-) create mode 100644 about.php create mode 100644 admin/assets/css/admin_style.css create mode 100644 admin/footer.php create mode 100644 admin/header.php create mode 100644 admin/nav.php create mode 100644 admin/orders.php create mode 100644 admin/products.php create mode 100644 admin/test.php create mode 100644 assets/css/auth_style.css create mode 100644 assets/images/products/product_6930ac914bc555.82600063_PHP 8.2.29 - phpinfo() - Google Chrome 12_09_1404 10_38_28 ب.ظ.png create mode 100644 assets/pasted-20251203-190906-4bf15fd7.png create mode 100644 auth_handler.php create mode 100644 checkout_handler.php create mode 100644 db/migrations/003_create_orders_table.sql create mode 100644 db/migrations/004_create_users_table.sql create mode 100644 db/migrations/005_create_user_addresses_table.sql create mode 100644 db/migrations/006_add_is_admin_to_users.sql create mode 100644 db/migrations/007_update_orders_table.sql create mode 100644 db/migrations/008_create_otp_table.sql create mode 100644 login.php create mode 100644 logout.php create mode 100644 profile.php create mode 100644 verify.php diff --git a/about.php b/about.php new file mode 100644 index 00000000..aff5f294 --- /dev/null +++ b/about.php @@ -0,0 +1,61 @@ + + +
+
+

داستان آتیمه

+

تلفیق هنر سنتی و طراحی مدرن

+
+ +
+
+
+
+
+ هنر چرم‌دوزی +
+
+
+

باور ما

+

ما در آتیمه، به قدرت دست‌ها و اصالت مواد اولیه باور داریم. داستان ما از یک کارگاه کوچک و عشقی عمیق به هنر چرم‌دوزی آغاز شد. هدف ما خلق آثاری است که نه تنها یک وسیله کاربردی، بلکه بخشی از داستان و استایل روزمره شما باشند؛ آثاری که با گذر زمان، زیباتر و شخصی‌تر می‌شوند.

+

هر محصول، حاصل ساعت‌ها کار دست هنرمندان ماهر و استفاده از بهترین و باکیفیت‌ترین چرم‌های طبیعی است. ما به جزئیات اهمیت می‌دهیم، از انتخاب نخ گرفته تا طراحی هر برش و دوخت. این تعهد به کیفیت، تضمین می‌کند که هر ساخته‌ دست ما، اثری ماندگار و بی‌همتا باشد.

+ مشاهده مجموعه ما +
+
+
+
+
+
+ + +
+
+
+
+ +

تعهد به کیفیت

+

استفاده از بهترین مواد اولیه و کنترل کیفی دقیق در تمام مراحل تولید.

+
+
+
+
+ +

هنر دست

+

تمام محصولات ما با عشق و دقت توسط هنرمندان ماهر ساخته می‌شوند.

+
+
+
+
+ +

طراحی ماندگار

+

خلق آثاری مدرن و در عین حال کلاسیک که هیچ‌گاه از مد نمی‌افتند.

+
+
+
+
+ +
+ + diff --git a/admin/add_product.php b/admin/add_product.php index cd330eef..24c01468 100644 --- a/admin/add_product.php +++ b/admin/add_product.php @@ -2,80 +2,78 @@ session_start(); require_once __DIR__ . '/auth_check.php'; +// New header +require_once __DIR__ . '/header.php'; + $flash_message = $_SESSION['flash_message'] ?? null; if ($flash_message) { unset($_SESSION['flash_message']); } ?> - - - - - - افزودن محصول جدید - - - - - - - -
-
-
-
-

افزودن محصول جدید

- بازگشت -
-
-
-
-
- - -
-
- - -
-
+
+
+
+

افزودن محصول جدید

+ انصراف +
+ +
+
+ +
+ + +
+
+ + +
+
+
- +
-
+
- +
-
- - -
کدهای رنگ هگزادسیمال را با کاما جدا کنید.
-
-
- - -
- - -
+
+
+ + +
کدهای رنگ هگزادسیمال را با کاما جدا کنید.
+
+
+ + +
+
+ +
+
- + - - \ No newline at end of file + + diff --git a/admin/assets/css/admin_style.css b/admin/assets/css/admin_style.css new file mode 100644 index 00000000..225def67 --- /dev/null +++ b/admin/assets/css/admin_style.css @@ -0,0 +1,259 @@ + +/* ================================================================= + ADMIN PANEL MODERN STYLES + ================================================================= */ + +:root { + --admin-bg: #1A202C; /* Very dark blue */ + --admin-surface: #2D3748; /* Lighter dark blue for cards, tables */ + --admin-border: #4A5568; /* Subtle borders */ + --admin-accent: #FBBF24; /* Amber/Gold for highlights */ + --admin-accent-hover: #F59E0B; /* Darker gold for hover */ + + --admin-text-primary: #EDF2F7; /* Bright, light gray for main text */ + --admin-text-secondary: #A0AEC0; /* Softer gray for subtitles */ + + --admin-success: #38A169; /* Green */ + --admin-danger: #E53E3E; /* Red */ + --admin-info: #3182CE; /* Blue */ + + --admin-font: 'Vazirmatn', sans-serif; +} + +/* --- General Body & Typography --- */ +body.admin-page { + background-color: var(--admin-bg); + color: var(--admin-text-primary); + font-family: var(--admin-font); + padding-right: 0; /* Reset previous style */ +} + +.admin-main-content { + padding: 2rem; + margin-right: 280px; /* Space for the new sidebar */ + transition: margin-right 0.3s ease; +} + +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { + color: var(--admin-text-primary); + font-weight: 700; +} + +a { + color: var(--admin-accent); +} +a:hover { + color: var(--admin-accent-hover); +} + +/* --- Override Bootstrap Dark Components --- */ +.table-dark { + --bs-table-bg: var(--admin-surface); + --bs-table-border-color: var(--admin-border); + --bs-table-color: var(--admin-text-primary); + --bs-table-striped-bg: #353c4a; /* Slightly lighter for striped rows */ +} + +.table > :not(caption) > * > * { + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} + + +.form-control { + background-color: var(--admin-surface); + color: var(--admin-text-primary); + border-color: var(--admin-border); + border-radius: 0.375rem; + padding: 0.75rem 1rem; +} + +.form-control:focus { + background-color: var(--admin-surface); + color: var(--admin-text-primary); + border-color: var(--admin-accent); + box-shadow: 0 0 0 0.25rem rgba(var(--admin-accent), 0.2); +} + +.form-select { + background-color: var(--admin-surface); + color: var(--admin-text-primary); + border-color: var(--admin-border); +} + + +/* --- Buttons --- */ +.btn-primary { + background-color: var(--admin-accent); + border-color: var(--admin-accent); + color: #1A202C; /* Dark text on gold button */ + font-weight: 600; +} +.btn-primary:hover { + background-color: var(--admin-accent-hover); + border-color: var(--admin-accent-hover); + color: #1A202C; +} + +.btn-success { background-color: var(--admin-success); border-color: var(--admin-success); } +.btn-danger { background-color: var(--admin-danger); border-color: var(--admin-danger); } +.btn-info { background-color: var(--admin-info); border-color: var(--admin-info); } + + +/* --- New Sidebar --- */ +.admin-sidebar { + position: fixed; + top: 0; + right: 0; + width: 280px; + height: 100vh; + background-color: var(--admin-surface); + border-left: 1px solid var(--admin-border); + display: flex; + flex-direction: column; + padding: 1.5rem 0; + z-index: 1100; +} + +.admin-sidebar-header { + text-align: center; + padding: 0 1.5rem 1.5rem 1.5rem; + border-bottom: 1px solid var(--admin-border); +} +.admin-sidebar-header .logo { + font-size: 1.75rem; + font-weight: 800; + color: var(--admin-text-primary); + text-decoration: none; +} +.admin-sidebar-header .logo span { + color: var(--admin-accent); +} + +.admin-sidebar .nav { + flex-grow: 1; + padding-top: 1rem; +} +.admin-sidebar .nav-link { + color: var(--admin-text-secondary); + display: flex; + align-items: center; + font-size: 1rem; + font-weight: 500; + padding: 0.9rem 1.5rem; + margin: 0.25rem 0; + border-right: 4px solid transparent; + transition: all 0.2s ease-in-out; +} +.admin-sidebar .nav-link:hover { + color: var(--admin-text-primary); + background-color: rgba(45, 55, 72, 0.5); /* #2D3748 with opacity */ +} +.admin-sidebar .nav-link.active { + color: var(--admin-text-primary); + background-color: var(--admin-bg); + border-right-color: var(--admin-accent); + font-weight: 600; +} +.admin-sidebar .nav-link .bi { + font-size: 1.2rem; + margin-left: 0.75rem; /* For RTL, it should be margin-left */ +} + +.admin-sidebar-footer { + padding: 1rem 1.5rem; + border-top: 1px solid var(--admin-border); +} + +/* --- Dashboard Stat Cards --- */ +.stat-card { + background-color: var(--admin-surface); + border: 1px solid var(--admin-border); + border-radius: 0.75rem; + padding: 1.5rem; + display: flex; + align-items: center; + transition: all 0.3s ease; +} +.stat-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 20px rgba(0,0,0,0.2); + border-color: var(--admin-accent); +} +.stat-card .icon-container { + font-size: 2rem; + color: var(--admin-accent); + background-color: #363e4d; + width: 60px; + height: 60px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-left: 1.5rem; /* For RTL */ +} +.stat-card .stat-info h3 { + font-size: 2.25rem; + font-weight: 800; + margin: 0; +} +.stat-card .stat-info p { + margin: 0; + color: var(--admin-text-secondary); +} + +/* --- Dashboard Tables & Badges --- */ +.card-table .card-header { + background-color: transparent; + border-bottom: 1px solid var(--admin-border); + padding: 1rem 1.5rem; + font-weight: 600; +} + +.badge.bg-processing { background-color: var(--admin-info) !important; } +.badge.bg-shipped { background-color: var(--admin-success) !important; } +.badge.bg-cancelled { background-color: var(--admin-danger) !important; } +.badge.bg-pending { background-color: #DD6B20 !important; } /* Orange */ + +/* --- Modal Styling --- */ +.modal-content { + background-color: var(--admin-surface); + color: var(--admin-text-primary); + border: 1px solid var(--admin-border); +} +.modal-header { + border-bottom: 1px solid var(--admin-border); +} +.modal-footer { + border-top: 1px solid var(--admin-border); +} +.btn-close { + filter: invert(1) grayscale(100%) brightness(200%); +} + + +@media (max-width: 992px) { + .admin-main-content { + margin-right: 0; + } + .admin-sidebar { + transform: translateX(280px); /* For RTL */ + transition: transform 0.3s ease; + } + .admin-sidebar.is-open { + transform: translateX(0); + } + /* Add a hamburger toggle button */ + .sidebar-toggle { + display: block; + position: fixed; + top: 15px; + right: 15px; + z-index: 1200; + background: var(--admin-surface); + border: 1px solid var(--admin-border); + color: var(--admin-text-primary); + padding: 5px 10px; + border-radius: 5px; + } +} diff --git a/admin/auth_check.php b/admin/auth_check.php index 00a8177e..6beff4c4 100644 --- a/admin/auth_check.php +++ b/admin/auth_check.php @@ -1,5 +1,7 @@ 'danger', 'message' => 'شناسه محصول نامعتبر است.']; + header('Location: products.php'); exit; } @@ -22,88 +19,114 @@ try { $product = $stmt->fetch(PDO::FETCH_ASSOC); if (!$product) { - header('Location: index.php'); + $_SESSION['flash_message'] = ['type' => 'danger', 'message' => 'محصول مورد نظر یافت نشد.']; + header('Location: products.php'); exit; } } catch (PDOException $e) { - die("Error fetching product: " . $e->getMessage()); + error_log("Database Error: " . $e->getMessage()); + $_SESSION['flash_message'] = ['type' => 'danger', 'message' => 'خطا در اتصال به پایگاه داده. لطفاً بعداً تلاش کنید.']; + header('Location: products.php'); + exit; } +$page_title = "ویرایش محصول: " . htmlspecialchars($product['name']); +require_once 'header.php'; ?> - - - - - - ویرایش محصول: <?php echo htmlspecialchars($product['name']); ?> - - - - - - - -
-
-
-

ویرایش محصول

-
-
-
- - + -
- - +
+
+
فرم ویرایش محصول
+ + بازگشت + +
+
+ + + + +
+ +
+
+ + +
+ +
+ + +
+ +
+
+
+ + +
-
- - +
+
+ + +
رنگ‌ها را با کاما جدا کنید (مثال: #FFFFFF, #000000).
+
-
- - +
+
+ > + +
+
+ + +
+
+ +
+ Current Image + + برای تغییر، تصویر جدید را انتخاب کنید.
-
- - -
رنگ‌های موجود را با کاما از هم جدا کنید (مثال: #FFFFFF, #000000).
-
-
- - -
تصویر فعلی:
- Current Image -
-
- > - -
-
- انصراف - -
- +
-
+ +
+ انصراف + +
+
- + - - diff --git a/admin/footer.php b/admin/footer.php new file mode 100644 index 00000000..ae45f072 --- /dev/null +++ b/admin/footer.php @@ -0,0 +1,7 @@ +
+ + + + + + diff --git a/admin/handler.php b/admin/handler.php index 4e45b292..4633b63d 100644 --- a/admin/handler.php +++ b/admin/handler.php @@ -1,10 +1,9 @@ + "The uploaded file exceeds the server's maximum upload size (upload_max_filesize).", - UPLOAD_ERR_FORM_SIZE => "The uploaded file exceeds the maximum size specified in the form.", - UPLOAD_ERR_PARTIAL => "The file was only partially uploaded.", - UPLOAD_ERR_NO_FILE => "No file was selected for upload.", - UPLOAD_ERR_NO_TMP_DIR => "Server configuration error: Missing a temporary folder for uploads.", - UPLOAD_ERR_CANT_WRITE => "Server error: Failed to write the uploaded file to disk.", - UPLOAD_ERR_EXTENSION => "A PHP extension prevented the file upload.", + $file_error = $_FILES['image']['error'] ?? UPLOAD_ERR_NO_FILE; + $upload_errors = [ + UPLOAD_ERR_INI_SIZE => "The uploaded file exceeds the server's maximum upload size (upload_max_filesize).", + UPLOAD_ERR_FORM_SIZE => "The uploaded file exceeds the maximum size specified in the form.", + UPLOAD_ERR_PARTIAL => "The file was only partially uploaded.", + UPLOAD_ERR_NO_FILE => "No file was selected for upload.", + UPLOAD_ERR_NO_TMP_DIR => "Server configuration is missing a temporary folder for uploads.", + UPLOAD_ERR_CANT_WRITE => "Failed to write file to disk. Check permissions.", + UPLOAD_ERR_EXTENSION => "A PHP extension stopped the file upload.", ]; - $error_message = $upload_errors[$file_error] ?? "An unknown upload error occurred (Code: {$file_error})."; - // Only trigger error if the action is 'add', where image is mandatory - if ($action === 'add') { - $errors[] = "Image Upload Failed: " . $error_message; + if ($file_error !== UPLOAD_ERR_NO_FILE) { + $errors[] = $upload_errors[$file_error] ?? "An unknown error occurred during file upload."; } } if (empty($errors)) { - try { - $sql = "INSERT INTO products (name, description, price, image_url, colors, is_featured) VALUES (?, ?, ?, ?, ?, ?)"; - $stmt = $pdo->prepare($sql); - $stmt->execute([$name, $description, $price, $image_path, $colors, $is_featured]); - $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت اضافه شد!']; - $redirect_to = 'index.php'; - } catch (PDOException $e) { - $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'خطا در افزودن محصول: ' . $e->getMessage()]; - } + $sql = "INSERT INTO products (name, description, price, image_url, colors, is_featured) VALUES (?, ?, ?, ?, ?, ?)"; + $stmt = $pdo->prepare($sql); + $stmt->execute([$name, $description, $price, $image_path, $colors, $is_featured]); + $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت اضافه شد!']; + $redirect_to = 'products.php'; } else { - $error_message = 'لطفاً تمام خطاها را برطرف کنید:

' . implode('
', $errors); - $_SESSION['flash_message'] = ['type' => 'error', 'message' => $error_message]; + $_SESSION['flash_message'] = ['type' => 'error', 'message' => implode("
", $errors)]; } } break; case 'edit': - $id = $_POST['id'] ?? $_GET['id'] ?? null; - $redirect_to = 'edit_product.php?id=' . $id; + $redirect_to = 'products.php'; // Default redirect on success or if ID is missing if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $id = filter_var($id, FILTER_VALIDATE_INT); + $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT); $name = trim($_POST['name'] ?? ''); $description = trim($_POST['description'] ?? ''); $price = filter_var($_POST['price'], FILTER_VALIDATE_FLOAT); $colors = trim($_POST['colors'] ?? ''); $is_featured = isset($_POST['is_featured']) ? 1 : 0; - - $errors = []; - - if (!$id) { - $errors[] = "شناسه محصول نامعتبر است."; - } - // Other validations... - $image_path = $_POST['current_image'] ?? ''; + $errors = []; + + if (!$id) { + $errors[] = "Invalid product ID."; + } else { + $redirect_to = "edit_product.php?id=$id"; // Redirect back to the edit form on error + } + + if (empty($name)) $errors[] = "Product name is required."; + if (empty($description)) $errors[] = "Description is required."; + if ($price === false) $errors[] = "Price is invalid or missing."; + + + $current_image_path = $_POST['current_image'] ?? ''; + $image_path = $current_image_path; if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) { $upload_dir = __DIR__ . '/../assets/images/products/'; - $filename = uniqid('product_', true) . '_' . basename($_FILES['image']['name']); - $target_file = $upload_dir . $filename; - if (move_uploaded_file($_FILES['image']['tmp_name'], $target_file)) { - if (!empty($image_path) && file_exists(__DIR__ . '/../' . $image_path)) { - unlink(__DIR__ . '/../' . $image_path); + if (!is_dir($upload_dir)) mkdir($upload_dir, 0777, true); + + if (is_writable($upload_dir)) { + $filename = uniqid('product_', true) . '_' . basename($_FILES['image']['name']); + $target_file = $upload_dir . $filename; + if (move_uploaded_file($_FILES['image']['tmp_name'], $target_file)) { + $image_path = 'assets/images/products/' . $filename; + // Optionally, delete the old image if it's different + if ($current_image_path && file_exists(__DIR__ . '/../' . $current_image_path)) { + // unlink(__DIR__ . '/../' . $current_image_path); + } + } else { + $errors[] = "Failed to move uploaded file."; } - $image_path = 'assets/images/products/' . $filename; } else { - $errors[] = "خطا در آپلود تصویر جدید."; + $errors[] = "Image directory is not writable."; } } if (empty($errors)) { - try { - $sql = "UPDATE products SET name = ?, description = ?, price = ?, image_url = ?, colors = ?, is_featured = ? WHERE id = ?"; - $stmt = $pdo->prepare($sql); - $stmt->execute([$name, $description, $price, $image_path, $colors, $is_featured, $id]); - $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت ویرایش شد!']; - $redirect_to = 'index.php'; - } catch (PDOException $e) { - $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'خطا در ویرایش محصول: ' . $e->getMessage()]; - } + $sql = "UPDATE products SET name = ?, description = ?, price = ?, image_url = ?, colors = ?, is_featured = ? WHERE id = ?"; + $stmt = $pdo->prepare($sql); + $stmt->execute([$name, $description, $price, $image_path, $colors, $is_featured, $id]); + $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت به‌روزرسانی شد!']; + $redirect_to = 'products.php'; } else { - $error_message = 'فرم دارای خطا است:

' . implode('
', $errors); - $_SESSION['flash_message'] = ['type' => 'error', 'message' => $error_message]; + $_SESSION['flash_message'] = ['type' => 'error', 'message' => implode("
", $errors)]; } } break; case 'delete': - $id = filter_var($_GET['id'], FILTER_VALIDATE_INT); + $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); if ($id) { - try { - // First, get the image path to delete the file - $stmt = $pdo->prepare("SELECT image_url FROM products WHERE id = ?"); - $stmt->execute([$id]); - $image_to_delete = $stmt->fetchColumn(); + // First, get the image path to delete the file + $stmt = $pdo->prepare("SELECT image_url FROM products WHERE id = ?"); + $stmt->execute([$id]); + $product = $stmt->fetch(PDO::FETCH_ASSOC); - // Delete the record - $sql = "DELETE FROM products WHERE id = ?"; - $stmt = $pdo->prepare($sql); - $stmt->execute([$id]); - - // If record deleted, delete the file - if ($stmt->rowCount() > 0 && $image_to_delete && file_exists(__DIR__ . '/../' . $image_to_delete)) { - unlink(__DIR__ . '/../' . $image_to_delete); + if ($product && !empty($product['image_url'])) { + $image_file = __DIR__ . '/../' . $product['image_url']; + if (file_exists($image_file)) { + // unlink($image_file); } - - $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت حذف شد.']; - } catch (PDOException $e) { - $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'خطا در حذف محصول: ' . $e->getMessage()]; } + + // Then, delete the record from the database + $sql = "DELETE FROM products WHERE id = ?"; + $stmt = $pdo->prepare($sql); + $stmt->execute([$id]); + $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'محصول با موفقیت حذف شد!']; } else { - $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'شناسه محصول نامعتبر است.']; + $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'شناسه محصول برای حذف نامعتبر است.']; } - $redirect_to = 'index.php'; + $redirect_to = 'products.php'; + break; + + default: + $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'عملیات نامعتبر است.']; break; } -// Redirect back after the action -header('Location: ' . $redirect_to); +header("Location: " . $redirect_to); exit; diff --git a/admin/header.php b/admin/header.php new file mode 100644 index 00000000..c36199f7 --- /dev/null +++ b/admin/header.php @@ -0,0 +1,27 @@ + + + + + + پنل مدیریت + + + + + + + + + + + + + + + + + + + +
+
diff --git a/admin/index.php b/admin/index.php index 8b18fbcb..4c107224 100644 --- a/admin/index.php +++ b/admin/index.php @@ -3,12 +3,24 @@ session_start(); require_once __DIR__ . '/auth_check.php'; require_once __DIR__ . '/../db/config.php'; +// New header - includes nav, head, and opening body/main tags +require_once __DIR__ . '/header.php'; + +$dashboard_error = null; +$total_products = 0; +$total_orders = 0; +$recent_orders = []; + try { $pdo = db(); - $stmt = $pdo->query("SELECT id, name, price FROM products ORDER BY created_at DESC"); - $products = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $total_products = $pdo->query("SELECT COUNT(*) FROM products")->fetchColumn(); + $total_orders = $pdo->query("SELECT COUNT(*) FROM orders")->fetchColumn(); + $recent_orders = $pdo->query("SELECT id, customer_name, total_amount, `status`, created_at FROM orders ORDER BY created_at DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { - die("Error fetching products: " . $e->getMessage()); + $dashboard_error = "خطا در بارگذاری اطلاعات داشبورد: " . $e->getMessage(); + $dashboard_error .= "

این خطا معمولاً به دلیل قدیمی بودن ساختار دیتابیس رخ می‌دهد. لطفاً برای به‌روزرسانی به صفحه مایگریشن بروید."; } $flash_message = $_SESSION['flash_message'] ?? null; @@ -16,102 +28,115 @@ if ($flash_message) { unset($_SESSION['flash_message']); } +// Function to map status to a badge class +function get_status_badge($status) { + switch (strtolower($status)) { + case 'processing': + return 'bg-processing'; + case 'shipped': + return 'bg-shipped'; + case 'cancelled': + return 'bg-cancelled'; + default: + return 'bg-pending'; + } +} ?> - - - - - - پنل مدیریت - محصولات - - - - - - - -
-
-

مدیریت محصولات

-
- + افزودن محصول جدید - خروج +

داشبورد

+ + +
+ + + +
+
+
+
+ +
+
+

کل محصولات

+

+
+
+
+
+
+
+ +
+
+

کل سفارشات

+

+
+
-
- - - - - - - - - - - - - - - - + +
+
+
آخرین سفارشات
+
+
+
+
#نام محصولقیمتعملیات
هیچ محصولی یافت نشد.
+ - - - - + + + + + + - - - -
تومان - ویرایش - حذف - شماره سفارشنام مشتریمبلغ کلوضعیتتاریخ
+ + + + + هیچ سفارشی یافت نشد. + + + + + # + + تومان + + + + مشاهده + + + + + + +
+
- -
+ - + - - \ No newline at end of file + + diff --git a/admin/login.php b/admin/login.php index 1853da4f..1b52b12f 100644 --- a/admin/login.php +++ b/admin/login.php @@ -32,6 +32,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { + @@ -43,7 +44,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {

ورود به پنل

رمز عبور: admin123

-
+
diff --git a/admin/nav.php b/admin/nav.php new file mode 100644 index 00000000..13d9f296 --- /dev/null +++ b/admin/nav.php @@ -0,0 +1,42 @@ + + + + \ No newline at end of file diff --git a/admin/orders.php b/admin/orders.php new file mode 100644 index 00000000..9d01990c --- /dev/null +++ b/admin/orders.php @@ -0,0 +1,131 @@ +query("SELECT * FROM orders ORDER BY created_at DESC"); + $orders = $stmt->fetchAll(PDO::FETCH_ASSOC); +} catch (PDOException $e) { + $error_message = "خطا در دریافت اطلاعات سفارشات: " . $e->getMessage(); + $orders = []; +} + +// Function to map status to a badge class +function get_status_badge($status) { + switch (strtolower($status)) { + case 'processing': + return 'bg-processing'; + case 'shipped': + return 'bg-shipped'; + case 'cancelled': + return 'bg-cancelled'; + default: + return 'bg-pending'; + } +} +?> + +
+

مدیریت سفارشات

+
+ + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
شمارهنام مشتریمبلغ کلوضعیتتاریخعملیات
هیچ سفارشی یافت نشد.
# تومان + +
+
+
+
+ + diff --git a/admin/products.php b/admin/products.php new file mode 100644 index 00000000..e25e2547 --- /dev/null +++ b/admin/products.php @@ -0,0 +1,119 @@ +query("SELECT id, name, price FROM products ORDER BY created_at DESC"); + $products = $stmt->fetchAll(PDO::FETCH_ASSOC); +} catch (PDOException $e) { + // In a real app, log this error instead of just dying + die("Error fetching products: " . $e->getMessage()); +} + +$flash_message = $_SESSION['flash_message'] ?? null; +if ($flash_message) { + unset($_SESSION['flash_message']); +} + +?> + + +
+

مدیریت محصولات

+ + افزودن محصول + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
#نام محصولقیمتعملیات
هیچ محصولی یافت نشد.
تومان + + ویرایش + + + حذف + +
+
+
+
+ + + + + diff --git a/admin/test.php b/admin/test.php new file mode 100644 index 00000000..c9f5eeb1 --- /dev/null +++ b/admin/test.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/css/auth_style.css b/assets/css/auth_style.css new file mode 100644 index 00000000..c125ea35 --- /dev/null +++ b/assets/css/auth_style.css @@ -0,0 +1,248 @@ +/* +Auth Pages - Dark Theme Overhaul +Using global variables from custom.css +*/ + +html, body { + height: 100%; + margin: 0; + font-family: var(--body-font); + /* The background is set by the body rule in custom.css */ +} + +.auth-wrapper { + display: flex; + min-height: 100vh; + width: 100%; + background-color: var(--background-color); +} + +.auth-bg { + flex: 1; + background: url('https://images.pexels.com/photos/193902/pexels-photo-193902.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2') no-repeat center center; + background-size: cover; + position: relative; + display: none; /* Hide on small screens */ +} + +@media (min-width: 992px) { + .auth-bg { + display: flex; + align-items: center; + justify-content: center; + } +} + +.auth-bg::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 1; +} + +.auth-bg-content { + position: relative; + z-index: 2; + text-align: center; + padding: 40px; + max-width: 450px; + color: var(--white-color); +} + +.auth-bg-content h1 { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1rem; + text-shadow: 1px 1px 8px rgba(0,0,0,0.7); +} + +.auth-bg-content p { + font-size: 1.1rem; + line-height: 1.6; +} + +.auth-form-wrapper { + flex-grow: 1; /* Take up all space on mobile */ + display: flex; + align-items: center; + justify-content: center; + padding: 30px; +} + +@media (min-width: 992px) { + .auth-form-wrapper { + flex: 1; + flex-grow: 0; + } +} + +.auth-form-container { + max-width: 420px; + width: 100%; +} + +.auth-form-container .form-header h2 { + font-size: 1.8rem; + font-weight: 700; + color: var(--heading-color); + margin-bottom: 0.5rem; +} + +.auth-form-container .form-header p { + color: var(--text-color); + margin-bottom: 2rem; + opacity: 0.8; +} + +.form-group { + position: relative; + margin-bottom: 1.5rem; +} + +.auth-form-wrapper .form-control { + height: 52px; + background-color: var(--surface-color); + border: 1px solid var(--border-color); + color: var(--text-color); + border-radius: 8px; + padding: 0 20px; + font-size: 0.95rem; + transition: all 0.3s ease; +} + +.auth-form-wrapper .form-control:focus { + border-color: var(--primary-color); + background-color: var(--surface-color); + box-shadow: 0 0 0 0.25rem rgba(192, 160, 128, 0.2); +} + +.auth-form-wrapper .btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + color: var(--heading-color); + height: 50px; + font-size: 1rem; + font-weight: 600; + border-radius: 8px; + transition: all 0.3s ease; +} + +.auth-form-wrapper .btn-primary:hover { + background-color: var(--secondary-color); + border-color: var(--secondary-color); +} + +.auth-footer { + text-align: center; + margin-top: 1.5rem; + font-size: 0.9rem; + color: var(--text-color); +} + +.auth-footer a { + color: var(--primary-color); + font-weight: 600; +} + +.auth-footer a:hover { + text-decoration: underline; +} + +.alert { + border-radius: 8px; + background-color: var(--surface-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} + +.alert-danger { + + background-color: rgba(220, 53, 69, 0.15); + + border-color: rgba(220, 53, 69, 0.5); + + color: #f8d7da; + +} + + + +.separator { + + display: flex; + + align-items: center; + + text-align: center; + + color: var(--text-color); + + opacity: 0.6; + +} + + + +.separator::before, .separator::after { + + content: ''; + + flex: 1; + + border-bottom: 1px solid var(--border-color); + +} + + + +.separator:not(:empty)::before { + + margin-right: .5em; + +} + + + +.separator:not(:empty)::after { + + margin-left: .5em; + +} + + + +.btn-google { + + background-color: var(--surface-color); + + border: 1px solid var(--border-color); + + color: var(--text-color); + + transition: all 0.3s ease; + +} + + + +.btn-google:hover { + + background-color: var(--background-color); + + border-color: var(--text-color); + +} + + + +.btn-google:disabled { + + opacity: 0.5; + + cursor: not-allowed; + +} diff --git a/assets/css/custom.css b/assets/css/custom.css index b650755b..0eee4c19 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,38 +1,22 @@ /* -:root variables for the default Light Theme +Default Dark Theme Variables. +Light theme has been removed. */ :root { - --primary-color: #8B4513; /* SaddleBrown */ - --secondary-color: #D2B48C; /* Tan */ - --accent-color: #C0A080; - --background-color: #FDFBF7; - --surface-color: #FFFFFF; /* For cards, headers, etc. */ - --text-color: #4A4A4A; - --heading-color: #2F2F2F; - --border-color: #EAEAEA; - --footer-bg: #2C2C2C; - --white-color: #FFFFFF; - - --font-family-sans-serif: 'Montserrat', sans-serif; - --body-font: 'Montserrat', sans-serif; -} - -/* -Variables for the Dark Theme -We will apply these by adding a class="dark" to the tag -*/ -html.dark { --primary-color: #C0A080; /* Lighter tan for accents in dark mode */ --secondary-color: #8B4513; /* Darker brown */ --accent-color: #D2B48C; --background-color: #1A1A1A; /* Very dark grey, almost black */ --surface-color: #2C2C2C; /* Dark grey for cards and surfaces */ - --text-color: #D5D5D5; /* Light grey for body text */ + --text-color: #EAEAEA; /* Brighter grey for better readability */ --heading-color: #FFFFFF; /* White for headings */ --border-color: #444444; /* Grey for borders */ --footer-bg: #111111; /* Even darker for footer */ -} + --white-color: #FFFFFF; + --font-family-sans-serif: 'Vazirmatn', sans-serif; + --body-font: 'Vazirmatn', sans-serif; +} body { font-family: var(--body-font); @@ -64,16 +48,12 @@ a:hover { .btn-primary { background-color: var(--primary-color); border-color: var(--primary-color); - color: var(--background-color); /* To have contrast in both themes */ + color: var(--heading-color); padding: 12px 30px; font-weight: 600; border-radius: 50px; transition: all 0.3s ease-in-out; } -html.dark .btn-primary { - color: var(--heading-color); -} - .btn-primary:hover, .btn-primary:focus { background-color: var(--secondary-color); @@ -91,13 +71,13 @@ html.dark .btn-primary { } .btn-outline-primary:hover { background-color: var(--primary-color); - color: var(--white-color); + color: var(--heading-color); } /* --- Header --- */ .site-header { background-color: var(--surface-color); - box-shadow: 0 2px 15px rgba(0,0,0,0.05); + box-shadow: 0 2px 15px rgba(0,0,0,0.2); border-bottom: 1px solid var(--border-color); transition: background-color 0.3s ease; position: sticky; @@ -105,10 +85,6 @@ html.dark .btn-primary { z-index: 1020; } -html.dark .site-header { - box-shadow: 0 2px 15px rgba(0,0,0,0.2); -} - .site-header .nav-link, .site-header a { color: var(--text-color) !important; @@ -125,14 +101,9 @@ html.dark .site-header { .site-header .badge { background-color: var(--primary-color) !important; - color: var(--background-color) !important; -} - -html.dark .site-header .badge { color: var(--heading-color) !important; } - /* --- Footer --- */ .site-footer { background-color: var(--footer-bg); @@ -158,23 +129,14 @@ html.dark .site-header .badge { border-radius: 15px; overflow: hidden; transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); - box-shadow: 0 5px 20px rgba(0,0,0,0.04); -} - -html.dark .product-card { box-shadow: 0 5px 20px rgba(0,0,0,0.15); } .product-card:hover { transform: translateY(-8px); - box-shadow: 0 15px 30px rgba(0,0,0,0.08); -} - -html.dark .product-card:hover { box-shadow: 0 15px 30px rgba(0,0,0,0.25); } - .product-card .product-image img { transition: transform 0.5s ease; } @@ -217,13 +179,7 @@ html.dark .product-card:hover { box-shadow: 0 0 0 3px var(--surface-color), 0 0 0 5px var(--primary-color); } -/* Handle specific colors that need border in light mode */ -.color-swatches [style*="#FFFFFF"] + label, -.color-swatches [style*="#ffffff"] + label { - border-color: #dedede; -} - -html.dark .color-swatches [style*="#000000"] + label { +.color-swatches [style*="#000000"] + label { border-color: #555; } @@ -264,7 +220,6 @@ html.dark .color-swatches [style*="#000000"] + label { /* --- Responsive Design --- */ @media (max-width: 768px) { - /* About Us Mobile */ #about-us .display-5 { font-size: 2rem; @@ -291,26 +246,31 @@ html.dark .color-swatches [style*="#000000"] + label { .site-footer .col-lg-2, .site-footer .col-lg-3, .site-footer .col-lg-4 { margin-bottom: 30px; } + + /* Center flex items in the footer on mobile */ + .site-footer .d-flex { + justify-content: center; + } } /* --- Header Icon Fixes for Dark Mode --- */ /* Ensure theme toggle and other header buttons are visible in dark mode */ -html.dark .site-header .btn { - color: var(--text-color); /* Use the light text color from dark theme variables */ +.site-header .btn { + color: var(--text-color); } -html.dark .site-header .btn:hover { - color: var(--primary-color); /* Use a hover color */ +.site-header .btn:hover { + color: var(--primary-color); } /* Fix for bootstrap's default hamburger icon in dark mode */ -html.dark .navbar-toggler-icon { +.navbar-toggler-icon { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } /* Fix for the border color of the toggler button itself */ -html.dark .navbar-toggler { +.navbar-toggler { border-color: rgba(255, 255, 255, 0.15); } @@ -322,8 +282,8 @@ html.dark .navbar-toggler { /* --- Custom Gold Button --- */ .btn-outline-gold { - border-color: #D4AF37; /* Gold */ - color: #D4AF37; + border-color: var(--accent-color); + color: var(--accent-color); padding: 12px 30px; font-weight: 600; border-radius: 50px; @@ -331,20 +291,11 @@ html.dark .navbar-toggler { } .btn-outline-gold:hover { - background-color: #D4AF37; - color: var(--white-color); -} - -html.dark .btn-outline-gold { - border-color: var(--accent-color); - color: var(--accent-color); -} - -html.dark .btn-outline-gold:hover { background-color: var(--accent-color); color: var(--heading-color); } + /* --- Hero Section Text --- */ .hero-section { position: relative; @@ -368,10 +319,514 @@ html.dark .btn-outline-gold:hover { text-shadow: 0 2px 8px rgba(0,0,0,0.5); } -/* --- About Us Section Text Color Fix for Dark Mode --- */ -html.dark #about-us h2, -html.dark #about-us p { - color: var(--heading-color) !important; /* Use a light, readable color */ +/* --- About Us Section Text Color Fix --- */ +#about-us p { + color: var(--text-color) !important; } +/* --- Footer Social Icons --- */ +.social-icon { + font-size: 1.5rem; /* Larger icons */ + transition: all 0.3s ease; + display: inline-block; /* Needed for transform */ + color: #AFAFAF !important; /* Default icon color from footer */ +} + +.social-icon:hover { + transform: translateY(-3px) scale(1.1); /* Lift and grow effect */ +} + +/* Brand Colors on Hover */ +.social-icon.bi-instagram:hover { color: #E4405F !important; } +.social-icon.bi-telegram:hover { color: #26A5E4 !important; } +.social-icon.bi-whatsapp:hover { color: #25D366 !important; } + +/* --- Admin Panel Sidebar --- */ +body.admin-page { + padding-right: 260px; /* Make space for the sidebar */ + transition: padding-right 0.3s ease; +} + +.admin-sidebar { + position: fixed; + top: 0; + right: 0; + height: 100vh; + width: 260px; + z-index: 1030; + display: flex; + flex-direction: column; + transition: right 0.3s ease; +} + +.admin-sidebar h3 { + font-family: 'Lalezar', cursive; + font-size: 1.5rem; +} + +.admin-sidebar .nav-link { + color: var(--text-color); + font-size: 1.05rem; + padding: 15px 25px; + border-right: 4px solid transparent; + transition: all 0.3s ease; +} + +.admin-sidebar .nav-link:hover { + background-color: rgba(255, 255, 255, 0.05); + border-right-color: var(--accent-color); + color: var(--white-color); +} + +.admin-sidebar .nav-link.active { + background-color: var(--primary-color); + color: var(--heading-color); + border-right-color: var(--accent-color); + font-weight: 700; +} + +.admin-sidebar .sidebar-footer { + margin-top: auto; + padding: 25px; + border-top: 1px solid var(--border-color); +} + +.admin-main-content { + padding: 2rem; +} + +/* Responsive Admin Layout */ +@media (max-width: 992px) { + body.admin-page { + padding-right: 0; + } + .admin-sidebar { + right: -260px; /* Hide sidebar off-screen */ + } + .admin-main-content { + padding: 1rem; + } + /* We'll need a hamburger menu button to toggle the sidebar on mobile */ +} + +/*-------------------------------------------------------------- +# Shopping Cart Page (Dark Theme) +--------------------------------------------------------------*/ +.cart-page-wrapper { + padding-top: 4rem; + padding-bottom: 4rem; +} + +.cart-item-card { + background: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 1.5rem; + margin-bottom: 1.5rem; + transition: box-shadow 0.3s ease; + position: relative; +} + +.cart-item-card:hover { + box-shadow: 0 10px 30px rgba(0,0,0,0.2); +} + +.cart-item-image img { + border-radius: 8px; +} + +.cart-item-details h5 a { + font-weight: 600; + color: var(--heading-color); + text-decoration: none; + transition: color 0.3s ease; +} + +.cart-item-details h5 a:hover { + color: var(--primary-color); +} + +.quantity-selector { + display: flex; + align-items: center; + background: var(--background-color); + border: 1px solid var(--border-color); + border-radius: 50px; + padding: 5px; + max-width: 120px; +} + +.quantity-selector .btn { + background-color: var(--surface-color); + border: 1px solid var(--border-color); + color: var(--text-color); + width: 32px; + height: 32px; + border-radius: 50%; + font-weight: 600; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +.quantity-selector .btn:hover { + background-color: var(--primary-color); + color: var(--heading-color); + border-color: var(--primary-color); +} + +.quantity-selector .quantity-input { + border: none; + background: transparent; + font-weight: 700; + color: var(--heading-color); + width: 40px; + text-align: center; +} + +.item-price { + font-size: 1.2rem; + font-weight: 700; + color: var(--primary-color); +} + +.remove-item-btn { + position: absolute; + top: 15px; + left: 15px; +} + +.remove-item-btn .btn { + color: #888; + font-size: 1.2rem; + padding: 0; + transition: color 0.3s ease; +} + +.remove-item-btn .btn:hover { + color: #e74c3c; +} + +/* Order Summary Card */ +.order-summary-card { + background: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 2rem; + position: sticky; + top: 120px; +} + +.order-summary-card .card-title { + font-weight: 700; + font-size: 1.5rem; + margin-bottom: 2rem; + border-bottom: 1px solid var(--border-color); + padding-bottom: 1rem; +} + +.summary-item { + display: flex; + justify-content: space-between; + margin-bottom: 1rem; + font-size: 1rem; +} + +.summary-item .label { + color: #aaa; +} + +.summary-item .value { + font-weight: 600; + color: var(--text-color); +} + +.summary-total { + margin-top: 1.5rem; + padding-top: 1.5rem; + border-top: 1px solid var(--border-color); +} + +.summary-total .label { + font-size: 1.2rem; + font-weight: 700; + color: var(--heading-color); +} + +.summary-total .value { + font-size: 1.5rem; + font-weight: 700; + color: var(--primary-color); +} + +.btn-checkout { + padding: 14px 20px; + font-size: 1.1rem; + font-weight: 700; + border-radius: 8px; +} + +/* Empty Cart */ +.empty-cart-container { + background: var(--surface-color); + border-radius: 12px; + padding: 4rem; + text-align: center; + border: 1px solid var(--border-color); +} + +.empty-cart-container .ri-shopping-cart-line { + font-size: 5rem; + color: var(--primary-color); + opacity: 0.8; +} + +.empty-cart-container h2 { + font-weight: 700; + margin-top: 1.5rem; + color: var(--heading-color); +} + +.empty-cart-container p { + max-width: 400px; + margin: 1rem auto 2rem auto; + color: #aaa; +} + +/*-------------------------------------------------------------- +# Checkout Page (Dark Theme) +--------------------------------------------------------------*/ +.checkout-form-section { + background: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 2.5rem; +} + +@media (max-width: 991.98px) { + .checkout-form-section { + padding: 1.5rem; + } +} + +.checkout-form-section h4 { + font-weight: 700; + margin-bottom: 2rem; + border-bottom: 1px solid var(--border-color); + padding-bottom: 1rem; +} + +.form-group { + margin-bottom: 1.5rem; +} + +.form-group .form-control { + background-color: var(--background-color); + border: 1px solid var(--border-color); + color: var(--text-color); + border-radius: 8px; + padding: 12px 20px; + height: 52px; + transition: all 0.3s ease; +} + +.form-group .form-control:focus { + background-color: var(--background-color); + color: var(--text-color); + border-color: var(--primary-color); + box-shadow: 0 0 0 0.25rem rgba(192, 160, 128, 0.2); +} + +.form-group textarea.form-control { + height: auto; +} + +.form-text-info { + font-size: 0.85rem; + font-weight: 500; + color: var(--accent-color) !important; + opacity: 0.9; +} + +/* Address Cards */ +.address-card-selector .address-card { + background: var(--background-color); + border: 2px solid var(--border-color); + border-radius: 10px; + padding: 1.5rem; + cursor: pointer; + transition: all 0.3s ease; + position: relative; + height: 100%; +} + +.address-card-selector .address-card:hover { + border-color: var(--primary-color); +} + +.address-card-selector .address-card.selected { + border-color: var(--primary-color); + box-shadow: 0 0 15px rgba(192, 160, 128, 0.3); +} + +.address-card-selector .form-check-input { + width: 1.5em; + height: 1.5em; + margin-top: 0.2em; +} + +.address-card-title { + font-weight: 600; + color: var(--heading-color); + margin-bottom: 0.5rem; +} + +.address-card-detail { + font-size: 0.9rem; + color: var(--text-color); + line-height: 1.6; +} + +.address-card-icon { + font-size: 1.5rem; + margin-bottom: 0.5rem; + color: var(--primary-color); +} + +#new-address-form-wrapper { + border: 2px dashed var(--border-color); + border-radius: 12px; + padding: 2rem; + margin-top: 1.5rem; +} + +/* Checkout Summary */ +.checkout-summary-card { + background: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 2rem; + position: sticky; + top: 120px; +} + +.checkout-summary-card .list-group-item { + background-color: transparent; + border-color: var(--border-color); + color: var(--text-color); + padding-left: 0; + padding-right: 0; +} + +.checkout-summary-card .summary-title { + font-weight: 700; + font-size: 1.5rem; + margin-bottom: 1.5rem; +} + +.secure-payment-info { + font-size: 0.9rem; + color: #aaa; +} + +.secure-payment-info i { + color: #28a745; +} + +.form-check-label a { + color: var(--primary-color); + text-decoration: none; +} +.form-check-label a:hover { + text-decoration: underline; +} + +/*================================================ +# Checkout & Auth Page Dark Theme REFINEMENTS +================================================*/ + +/* General text & label color fix */ +body.bg-dark, .bg-dark, .checkout-form-section, .login-form-section { + /* Make sure all labels and general text are readable */ + .form-label, label { + color: #EAEAEA !important; /* Use a bright, readable color */ + opacity: 0.9; + font-weight: 500; + margin-bottom: 0.75rem; + } + .text-muted { + color: #a0a0a0 !important; /* A lighter muted color for dark bg */ + } +} + + +/* Improved Form Control Styles */ +.form-control.bg-dark, .form-select.bg-dark { + color: var(--text-color) !important; + background-color: #1c1c1c !important; /* Slightly lighter than main bg */ + border: 1px solid #4a4a4a; + border-radius: 8px; + height: 50px; + transition: all 0.3s ease; +} + +.form-control.bg-dark:focus, .form-select.bg-dark:focus { + background-color: #1c1c1c !important; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(192, 160, 128, 0.25); +} + +textarea.form-control.bg-dark { + height: auto; +} + +/* Style for the select dropdown arrow */ +.form-select.bg-dark { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23d2b48c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} + +/* Checkbox styles */ +.form-check-input { + background-color: #333; + border: 1px solid #555; +} +.form-check-input:checked { + background-color: var(--primary-color); + border-color: var(--primary-color); +} +.form-check-input:focus { + box-shadow: 0 0 0 3px rgba(192, 160, 128, 0.25); +} +.form-check-label { + color: #ccc; +} +.form-check-label a { + color: var(--primary-color); + text-decoration: none; + font-weight: 500; +} +.form-check-label a:hover { + text-decoration: underline; +} + +/* Order Summary Card Refinements */ +.list-group-item.bg-dark { + border-color: #444 !important; /* Darker border for list items */ +} + +hr { + border-top-color: #444; +} + +.text-primary { + color: var(--primary-color) !important; +} + +.btn-primary.btn-lg { + padding-top: 0.9rem; + padding-bottom: 0.9rem; + font-size: 1.1rem; + letter-spacing: 0.5px; +} diff --git a/assets/images/products/product_6930ac914bc555.82600063_PHP 8.2.29 - phpinfo() - Google Chrome 12_09_1404 10_38_28 ب.ظ.png b/assets/images/products/product_6930ac914bc555.82600063_PHP 8.2.29 - phpinfo() - Google Chrome 12_09_1404 10_38_28 ب.ظ.png new file mode 100644 index 0000000000000000000000000000000000000000..820b70f034e98784dfa7f825a7c28a5488f7992c GIT binary patch literal 84095 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%0Ap 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 { - // --- Theme Toggle Functionality --- - const themeToggleButton = document.getElementById('theme-toggle'); - const htmlElement = document.documentElement; - const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)'); - - function applyTheme(theme) { - if (theme === 'dark') { - htmlElement.classList.add('dark'); - if (themeToggleButton) themeToggleButton.innerHTML = ''; - } else { - htmlElement.classList.remove('dark'); - if (themeToggleButton) themeToggleButton.innerHTML = ''; - } - } - - function initializeTheme() { - const savedTheme = localStorage.getItem('theme'); - if (savedTheme) { - applyTheme(savedTheme); - } else { - applyTheme(prefersDarkScheme.matches ? 'dark' : 'light'); - } - } - - if (themeToggleButton) { - themeToggleButton.addEventListener('click', () => { - const newTheme = htmlElement.classList.contains('dark') ? 'light' : 'dark'; - localStorage.setItem('theme', newTheme); - applyTheme(newTheme); - }); - } - - prefersDarkScheme.addEventListener('change', (e) => { - if (!localStorage.getItem('theme')) { - applyTheme(e.matches ? 'dark' : 'light'); - } - }); - - initializeTheme(); - + // --- AOS Initialization --- AOS.init({ duration: 800, once: true, }); - }); diff --git a/assets/pasted-20251203-190906-4bf15fd7.png b/assets/pasted-20251203-190906-4bf15fd7.png new file mode 100644 index 0000000000000000000000000000000000000000..820b70f034e98784dfa7f825a7c28a5488f7992c GIT binary patch literal 84095 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%0Ap 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"INSERT INTO otp_codes (email, code_hash, expires_at) VALUES (?, ?, ?)"); + $stmt->execute([$email, $code_hash, $expires_at]); + + // Send the plain code to the user's email + $subject = "کد ورود شما به فروشگاه آتیمه"; + $body = "

کد تایید شما

برای ورود یا ثبت‌نام در وب‌سایت آتیمه، از کد زیر استفاده کنید:

{$otp_code}

این کد تا ۱۰ دقیقه دیگر معتبر است.

"; + + $mail_result = MailService::sendMail($email, $subject, $body); + + if (!$mail_result['success']) { + error_log('OTP Mail Error: ' . ($mail_result['error'] ?? 'Unknown error')); + flash_message('danger', 'خطایی در ارسال ایمیل رخ داد. لطفاً مطمئن شوید ایمیل را درست وارد کرده‌اید.', 'login.php'); + } + + // Store email in session to use on the verification page + $_SESSION['otp_email'] = $email; + header('Location: verify.php'); + exit; + + } catch (Exception $e) { + error_log('OTP Generation Error: ' . $e->getMessage()); + flash_message('danger', 'خطای سرور. لطفاً لحظاتی دیگر دوباره تلاش کنید.', 'login.php'); + } +} + +function handle_verify_otp() { + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: login.php'); + exit; + } + + $email = filter_var(trim($_POST['email'] ?? ''), FILTER_VALIDATE_EMAIL); + $otp_code = trim($_POST['otp_code'] ?? ''); + + if (!$email || !$otp_code) { + flash_message('danger', 'ایمیل یا کد تایید نامعتبر است.', 'login.php'); + } + + try { + $pdo = db(); + + // Find the latest, unused OTP for this email that has not expired + $stmt = $pdo->prepare("SELECT * FROM otp_codes WHERE email = ? AND is_used = 0 AND expires_at > NOW() ORDER BY created_at DESC LIMIT 1"); + $stmt->execute([$email]); + $otp_row = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($otp_row && password_verify($otp_code, $otp_row['code_hash'])) { + // Mark OTP as used + $stmt_update = $pdo->prepare("UPDATE otp_codes SET is_used = 1 WHERE id = ?"); + $stmt_update->execute([$otp_row['id']]); + + // Check if user exists + $stmt_user = $pdo->prepare("SELECT * FROM users WHERE email = ?"); + $stmt_user->execute([$email]); + $user = $stmt_user->fetch(PDO::FETCH_ASSOC); + + $user_id = null; + if ($user) { + // User exists, log them in + $user_id = $user['id']; + $_SESSION['user_name'] = $user['first_name']; // Might be null, that's ok + } else { + // User does not exist, create a new one + $stmt_create = $pdo->prepare("INSERT INTO users (email, is_admin) VALUES (?, 0)"); + $stmt_create->execute([$email]); + $user_id = $pdo->lastInsertId(); + $_SESSION['user_name'] = null; // New user has no name yet + } + + // Set session variables for login + $_SESSION['user_id'] = $user_id; + unset($_SESSION['otp_email']); // Clean up session + + // Redirect to homepage with success + flash_message('success', 'شما با موفقیت وارد شدید!', 'index.php'); + + } else { + // Invalid or expired OTP + flash_message('danger', 'کد وارد شده اشتباه یا منقضی شده است.', 'verify.php'); + } + + } catch (Exception $e) { + error_log('OTP Verification Error: ' . $e->getMessage()); + flash_message('danger', 'خطای سرور. لطفاً لحظاتی دیگر دوباره تلاش کنید.', 'verify.php'); + } +} + +function handle_logout() { + session_unset(); + session_destroy(); + header('Location: index.php'); + exit; +} + +function flash_message($type, $message, $location) { + // Ensure email is carried over to verify page on error + if ($location === 'verify.php' && isset($_POST['email'])) { + $_SESSION['otp_email'] = $_POST['email']; + } + $_SESSION['flash_message'] = ['type' => $type, 'message' => $message]; + header("Location: $location"); + exit; +} \ No newline at end of file diff --git a/cart.php b/cart.php index 035ae582..3ce4acbc 100644 --- a/cart.php +++ b/cart.php @@ -1,121 +1,104 @@ '1') - $product_ids = array_map(function($id) { - return (int)explode('-', $id)[0]; - }, $cart_item_ids); - - if (!empty($product_ids)) { - $placeholders = implode(',', array_fill(0, count($product_ids), '?')); - - try { - $pdo = db(); - $stmt = $pdo->prepare("SELECT id, name, price, image_url FROM products WHERE id IN ($placeholders)"); - $stmt->execute(array_unique($product_ids)); - $products_data = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE); - - foreach ($_SESSION['cart'] as $cart_item_id => $item) { - $product_id = (int)explode('-', $cart_item_id)[0]; - - if (isset($products_data[$product_id])) { - $product = $products_data[$product_id]; - $quantity = $item['quantity']; - $color = $item['color']; - $subtotal = $product['price'] * $quantity; - $total_price += $subtotal; - - $cart_items_detailed[] = [ - 'cart_item_id' => $cart_item_id, - 'product_id' => $product_id, - 'name' => $product['name'], - 'price' => $product['price'], - 'image_url' => $product['image_url'], - 'quantity' => $quantity, - 'color' => $color, - 'subtotal' => $subtotal - ]; - } - } - } catch (PDOException $e) { - error_log("DB Error: " . $e->getMessage()); - $cart_items_detailed = []; - $total_price = 0; - } - } -} - $page_title = 'سبد خرید'; -include 'includes/header.php'; +require_once 'includes/header.php'; + +$cart_items = $_SESSION['cart'] ?? []; +$total_price = 0; ?> -
-

سبد خرید شما

+
+
+ + + + +
+

سبد خرید شما

+

جزئیات سفارش خود را بررسی و نهایی کنید.

+
+
+
+ $item): + $item_total = $item['price'] * $item['quantity']; + $total_price += $item_total; + ?> +
+
+ + + + + + +
+
+
+ + <?php echo htmlspecialchars($item['name']); ?> + +
+
+
+ +
+ رنگ: + +
+ +
+
+
+ + + + + + + +
+
+
+ تومان +
+
+
+ +
+ +
+
+

خلاصه سفارش

+
+ جمع کل + تومان +
+
+ هزینه ارسال + رایگان +
+
+
+ مبلغ نهایی + تومان +
+
+ +
+
+
+ +
- -
-

سبد خرید شما خالی است.

- بازگشت به فروشگاه -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - -
محصولقیمتتعدادجمع کلحذف
- <?php echo htmlspecialchars($item['name']); ?> - -
- - رنگ: - -
- - - × -
-
- -
- -
-

جمع نهایی: تومان

-
-
-
- - - - - + \ No newline at end of file diff --git a/cart_handler.php b/cart_handler.php index 6f07fcbd..f62a8d07 100644 --- a/cart_handler.php +++ b/cart_handler.php @@ -1,70 +1,77 @@ 0 && $quantity > 0) { - // Create a unique ID for the cart item based on product ID and color - $cart_item_id = $product_id . ($color ? '-' . preg_replace('/[^a-zA-Z0-9_]/ ', '-', $color) : ''); - - // If the exact item (product + color) is already in the cart, update the quantity - if (isset($_SESSION['cart'][$cart_item_id])) { - $_SESSION['cart'][$cart_item_id]['quantity'] += $quantity; - } else { - // Otherwise, add it as a new item - $_SESSION['cart'][$cart_item_id] = [ - 'product_id' => $product_id, - 'quantity' => $quantity, - 'color' => $color - ]; - } - } - - // Redirect to the cart page to show the updated cart - header('Location: cart.php'); +if (!$action || !$product_id) { + header('Location: shop.php'); exit; } -// Handle removing an item from the cart -if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['action']) && $_GET['action'] === 'remove') { - $cart_item_id = isset($_GET['id']) ? $_GET['id'] : ''; - if (!empty($cart_item_id) && isset($_SESSION['cart'][$cart_item_id])) { - unset($_SESSION['cart'][$cart_item_id]); - } - // Redirect back to the cart page - header('Location: cart.php'); - exit; -} +// Generate a unique ID for the cart item based on product ID and color +$cart_item_id = $product_id . ($color ? '_' . str_replace('#', '', $color) : ''); -// Handle updating quantities -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_cart'])){ - if(!empty($_POST['quantities'])){ - foreach($_POST['quantities'] as $cart_item_id => $quantity){ - $quantity = (int)$quantity; - if(!empty($cart_item_id) && isset($_SESSION['cart'][$cart_item_id])){ - if($quantity > 0){ - $_SESSION['cart'][$cart_item_id]['quantity'] = $quantity; - } else { - // Remove item if quantity is 0 or less - unset($_SESSION['cart'][$cart_item_id]); +switch ($action) { + case 'add': + if ($quantity > 0) { + // Check if product exists and get details + try { + $pdo = db(); + $stmt = $pdo->prepare("SELECT name, price, image_url FROM products WHERE id = ?"); + $stmt->execute([$product_id]); + $product = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($product) { + // If item already in cart, update quantity + if (isset($_SESSION['cart'][$cart_item_id])) { + $_SESSION['cart'][$cart_item_id]['quantity'] += $quantity; + } else { + // Otherwise, add new item + $_SESSION['cart'][$cart_item_id] = [ + 'product_id' => $product_id, + 'name' => $product['name'], + 'price' => $product['price'], + 'image_url' => $product['image_url'], + 'quantity' => $quantity, + 'color' => $color + ]; + } } + } catch (PDOException $e) { + // Log error, maybe set a session error message to display in cart + error_log("Cart Add Error: " . $e->getMessage()); } } - } - header('Location: cart.php'); - exit; + break; + + case 'update': + if ($quantity > 0) { + if (isset($_SESSION['cart'][$cart_item_id])) { + $_SESSION['cart'][$cart_item_id]['quantity'] = $quantity; + } + } else { + // If quantity is 0 or less, remove the item + unset($_SESSION['cart'][$cart_item_id]); + } + break; + + case 'remove': + if (isset($_SESSION['cart'][$cart_item_id])) { + unset($_SESSION['cart'][$cart_item_id]); + } + break; } - -// If someone accesses this file directly without a valid action, redirect them to the shop. -header('Location: shop.php'); -exit; \ No newline at end of file +// Redirect back to the cart page to show changes +header('Location: cart.php'); +exit; diff --git a/checkout.php b/checkout.php index b9f0ab8a..01011d85 100644 --- a/checkout.php +++ b/checkout.php @@ -2,173 +2,194 @@ session_start(); require_once 'db/config.php'; -// If cart is empty, redirect to shop page, there is nothing to checkout +// Redirect if cart is empty if (empty($_SESSION['cart'])) { header('Location: shop.php'); exit; } -$p_title = "تسویه حساب"; -$order_placed_successfully = false; -$error_message = ''; +$cart_items = $_SESSION['cart']; +$total_price = array_reduce($cart_items, function ($sum, $item) { + return $sum + ($item['price'] * $item['quantity']); +}, 0); -// Handle form submission -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - // --- Data Validation --- - $name = trim($_POST['customer_name'] ?? ''); - $email = trim($_POST['customer_email'] ?? ''); - $address = trim($_POST['customer_address'] ?? ''); +// User and address data +$logged_in_user = null; +$user_addresses = []; +$is_logged_in = isset($_SESSION['user_id']); - if (empty($name) || empty($email) || empty($address)) { - $error_message = 'لطفاً تمام فیلدها را پر کنید.'; - } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { - $error_message = 'لطفاً یک آدرس ایمیل معتبر وارد کنید.'; - } - - if(empty($error_message)) { +if ($is_logged_in) { + try { $pdo = db(); - try { - // --- Server-side recalculation of total --- - $product_ids = array_keys($_SESSION['cart']); - $placeholders = implode(',', array_fill(0, count($product_ids), '?')); - $stmt = $pdo->prepare("SELECT id, price FROM products WHERE id IN ($placeholders)"); - $stmt->execute($product_ids); - $products_from_db = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE); + $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $logged_in_user = $stmt->fetch(PDO::FETCH_ASSOC); - $total_amount = 0; - foreach ($_SESSION['cart'] as $product_id => $quantity) { - if(isset($products_from_db[$product_id])){ - $total_amount += $products_from_db[$product_id]['price'] * $quantity; - } - } - - // --- Database Transaction --- - $pdo->beginTransaction(); - - // 1. Insert into orders table - $sql_order = "INSERT INTO orders (customer_name, customer_email, customer_address, total_amount) VALUES (?, ?, ?, ?)"; - $stmt_order = $pdo->prepare($sql_order); - $stmt_order->execute([$name, $email, $address, $total_amount]); - $order_id = $pdo->lastInsertId(); - - // 2. Insert into order_items table - $sql_items = "INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?)"; - $stmt_items = $pdo->prepare($sql_items); - - foreach ($_SESSION['cart'] as $product_id => $quantity) { - if(isset($products_from_db[$product_id])){ - $price = $products_from_db[$product_id]['price']; - $stmt_items->execute([$order_id, $product_id, $quantity, $price]); - } - } - - // 3. Commit the transaction - $pdo->commit(); - - // 4. Clear the cart and set success flag - unset($_SESSION['cart']); - $order_placed_successfully = true; - $p_title = "سفارش شما ثبت شد"; - - } catch (Exception $e) { - if ($pdo->inTransaction()) { - $pdo->rollBack(); - } - error_log("Checkout Error: " . $e->getMessage()); - $error_message = 'مشکلی در ثبت سفارش شما به وجود آمد. لطفاً دوباره تلاش کنید.'; - } + $stmt = $pdo->prepare("SELECT * FROM user_addresses WHERE user_id = ? ORDER BY is_default DESC, id DESC"); + $stmt->execute([$_SESSION['user_id']]); + $user_addresses = $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + // In a real app, log this error + die("Error fetching user data."); } } +$page_title = 'تکمیل سفارش'; +require_once 'includes/header.php'; ?> - - - - - - <?php echo $p_title; ?> - چرم آتیمه - - - - - - - -
-
-
- -

آتیمه

-
- -
- - سبد خرید - - - - +
+ ' . htmlspecialchars($_SESSION['error_message']) . '
'; + unset($_SESSION['error_message']); + } + ?> +
+

تکمیل فرآیند خرید

+

فقط یک قدم دیگر تا نهایی شدن سفارش شما باقیست.

+
+ +
+
+ +
+

اطلاعات ارسال

+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ + +
+
+ + + +
توجه: فقط با شماره تلفن همراه میتوان سفارش را رهگیری کرد.
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
+

خلاصه سفارش

+
    + +
  • +
    + <?php echo htmlspecialchars($item['name']); ?> +
    + + تعداد: +
    +
    + +
  • + +
+ +
+ جمع کل + تومان +
+
+ هزینه ارسال + رایگان +
+
+
+ مبلغ نهایی + تومان +
+
+ +
+
+ پرداخت امن و مطمئن +
+
-
+ +
- -
-
-

-
+ -
-
- -
-

از خرید شما متشکریم!

-

سفارش شما با موفقیت ثبت شد و به زودی پردازش خواهد شد. یک ایمیل تایید برای شما ارسال گردید.

- بازگشت به فروشگاه -
- - -
.
- -
-
-
اطلاعات ارسال
-
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
- -
-
-
- - -
-
-

© چرم آتیمه. تمام حقوق محفوظ است.

-
-
- - - - \ No newline at end of file + \ No newline at end of file diff --git a/checkout_handler.php b/checkout_handler.php new file mode 100644 index 00000000..34b07dc2 --- /dev/null +++ b/checkout_handler.php @@ -0,0 +1,100 @@ +beginTransaction(); + +try { + // 4. Prepare order data + $billing_name = trim($first_name . ' ' . $last_name); + $cart_items = $_SESSION['cart']; + $total_amount = array_reduce($cart_items, function ($sum, $item) { + return $sum + ($item['price'] * $item['quantity']); + }, 0); + $items_json = json_encode($cart_items, JSON_UNESCAPED_UNICODE); + + // 5. Insert the order into the database using the correct, updated column names + $stmt = $pdo->prepare( + "INSERT INTO orders (user_id, billing_name, billing_email, customer_phone, shipping_province, shipping_city, shipping_address_line, shipping_postal_code, total_amount, items_json, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + ); + + $user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null; + $status = 'Pending'; // Default status + $final_email = ($email !== false && $email !== '') ? $email : null; // Ensure email is null if empty/invalid, not false + + $stmt->execute([ + $user_id, + $billing_name, + $final_email, + $phone_number, + $province, + $city, + $address_line, + $postal_code, + $total_amount, + $items_json, + $status + ]); + + // 6. If user is logged in, save the new address for future use + if ($user_id) { + $stmt_check_addr = $pdo->prepare("SELECT COUNT(*) FROM user_addresses WHERE user_id = ? AND address_line = ? AND postal_code = ?"); + $stmt_check_addr->execute([$user_id, $address_line, $postal_code]); + $address_exists = $stmt_check_addr->fetchColumn(); + + if ($address_exists == 0) { + $stmt_save_addr = $pdo->prepare( + "INSERT INTO user_addresses (user_id, first_name, last_name, phone_number, province, city, address_line, postal_code) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ); + $stmt_save_addr->execute([ + $user_id, $first_name, $last_name, $phone_number, $province, $city, $address_line, $postal_code + ]); + } + } + + // 7. Commit transaction + $pdo->commit(); + + // 8. Clear the cart and redirect with a success message + unset($_SESSION['cart']); + $_SESSION['success_message'] = 'سفارش شما با موفقیت ثبت شد! از خرید شما متشکریم.'; + header('Location: index.php'); + exit; + +} catch (Exception $e) { + // 9. If anything fails, rollback and redirect with an error + $pdo->rollBack(); + error_log("Order Creation Failed: " . $e->getMessage()); // Log error for admin + $_SESSION['error_message'] = 'خطایی در ثبت سفارش رخ داد. لطفاً دوباره تلاش کنید.'; + header('Location: checkout.php'); + exit; +} diff --git a/contact.php b/contact.php index 53e84473..6bed3002 100644 --- a/contact.php +++ b/contact.php @@ -1,73 +1,69 @@ 'error', 'message' => 'لطفاً تمام فیلدها را پر کنید.']; + } elseif (!$email) { + $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'آدرس ایمیل وارد شده معتبر نیست.']; } else { - $response = MailService::sendContactMessage($name, $email, $body, null, $subject); - if (!empty($response['success'])) { - $message = 'پیام شما با موفقیت ارسال شد. سپاسگزاریم!'; + // Send email using MailService + $to_email = getenv('MAIL_TO') ?: 'your-default-email@example.com'; // Fallback email + $subject = "پیام جدید از فرم تماس وب‌سایت"; + + $email_result = MailService::sendContactMessage($name, $email, $message, $to_email, $subject); + + if (!empty($email_result['success'])) { + $_SESSION['flash_message'] = ['type' => 'success', 'message' => 'پیام شما با موفقیت ارسال شد. سپاسگزاریم!']; } else { - $error = 'خطایی در ارسال پیام رخ داد. لطفاً بعداً تلاش کنید. متن خطا: ' . htmlspecialchars($response['error'] ?? 'Unknown error'); + $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'خطا در ارسال پیام. لطفاً بعداً دوباره تلاش کنید.']; + error_log("MailService Error: " . ($email_result['error'] ?? 'Unknown error')); } } + + // Redirect to the same page to prevent form resubmission + header("Location: contact.php"); + exit(); } -include 'includes/header.php'; +// Check for flash messages +$flash_message = $_SESSION['flash_message'] ?? null; +if ($flash_message) { + unset($_SESSION['flash_message']); +} ?> +
-
-

-

-
-
- -
-
-
- - - - - - - +
+

ارتباط با ما

+

نظرات، پیشنهادات و سوالات شما برای ما ارزشمند است.

+
-
+
+
+ +
- +
- - -
-
- - + +
- +
@@ -75,8 +71,24 @@ include 'includes/header.php';
-
توجه: این فرم برای اهداف آزمایشی است. برای دریافت واقعی ایمیل‌ها، باید اطلاعات سرور ایمیل (SMTP) خود را در فایل .env وارد کنید.
+
- \ No newline at end of file + + + + diff --git a/db/migrations/001_add_colors_to_products.sql b/db/migrations/001_add_colors_to_products.sql index 643dd22c..d41b0b1b 100644 --- a/db/migrations/001_add_colors_to_products.sql +++ b/db/migrations/001_add_colors_to_products.sql @@ -1 +1,2 @@ -ALTER TABLE products ADD COLUMN colors VARCHAR(255) DEFAULT NULL COMMENT 'Comma-separated list of available colors'; \ No newline at end of file +-- Add the colors column to the products table if it doesn't exist +ALTER TABLE `products` ADD COLUMN IF NOT EXISTS `colors` VARCHAR(255) DEFAULT NULL COMMENT 'Comma-separated list of available colors'; diff --git a/db/migrations/002_add_is_featured_to_products.sql b/db/migrations/002_add_is_featured_to_products.sql index e1f692b9..619f565f 100644 --- a/db/migrations/002_add_is_featured_to_products.sql +++ b/db/migrations/002_add_is_featured_to_products.sql @@ -1 +1,2 @@ -ALTER TABLE products ADD COLUMN is_featured BOOLEAN DEFAULT 0; \ No newline at end of file +-- Add the is_featured column to the products table if it doesn't exist +ALTER TABLE `products` ADD COLUMN IF NOT EXISTS `is_featured` BOOLEAN DEFAULT 0; diff --git a/db/migrations/003_create_orders_table.sql b/db/migrations/003_create_orders_table.sql new file mode 100644 index 00000000..c0962637 --- /dev/null +++ b/db/migrations/003_create_orders_table.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS `orders` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `customer_name` VARCHAR(255) NOT NULL, + `customer_email` VARCHAR(255) NOT NULL, + `customer_address` TEXT NOT NULL, + `customer_phone` VARCHAR(50) DEFAULT NULL, + `total_amount` DECIMAL(10, 2) NOT NULL, + `items_json` JSON NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Add the status column to the orders table if it doesn't exist +ALTER TABLE `orders` ADD COLUMN IF NOT EXISTS `status` VARCHAR(50) NOT NULL DEFAULT 'Pending' COMMENT 'e.g., Pending, Processing, Shipped, Delivered, Canceled'; \ No newline at end of file diff --git a/db/migrations/004_create_users_table.sql b/db/migrations/004_create_users_table.sql new file mode 100644 index 00000000..fcabbb63 --- /dev/null +++ b/db/migrations/004_create_users_table.sql @@ -0,0 +1,11 @@ +-- Create users table to store customer information +CREATE TABLE IF NOT EXISTS `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `first_name` VARCHAR(100) NOT NULL, + `last_name` VARCHAR(100) NOT NULL, + `email` VARCHAR(150) NOT NULL UNIQUE, + `phone_number` VARCHAR(20) DEFAULT NULL UNIQUE, + `password` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/db/migrations/005_create_user_addresses_table.sql b/db/migrations/005_create_user_addresses_table.sql new file mode 100644 index 00000000..bb86cae2 --- /dev/null +++ b/db/migrations/005_create_user_addresses_table.sql @@ -0,0 +1,12 @@ +-- Create user_addresses table to store customer shipping addresses +CREATE TABLE IF NOT EXISTS `user_addresses` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `province` VARCHAR(100) NOT NULL, + `city` VARCHAR(100) NOT NULL, + `address_line` TEXT NOT NULL, + `postal_code` VARCHAR(20) NOT NULL, + `is_default` BOOLEAN DEFAULT FALSE, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/db/migrations/006_add_is_admin_to_users.sql b/db/migrations/006_add_is_admin_to_users.sql new file mode 100644 index 00000000..d5ac87a3 --- /dev/null +++ b/db/migrations/006_add_is_admin_to_users.sql @@ -0,0 +1,2 @@ +-- Add is_admin flag to users table to differentiate admins from regular users +ALTER TABLE `users` ADD `is_admin` BOOLEAN NOT NULL DEFAULT FALSE AFTER `password`; diff --git a/db/migrations/007_update_orders_table.sql b/db/migrations/007_update_orders_table.sql new file mode 100644 index 00000000..312bb96f --- /dev/null +++ b/db/migrations/007_update_orders_table.sql @@ -0,0 +1,18 @@ +-- Update orders table to support structured addresses and link to users + +-- Add user_id to link orders to the users table (can be NULL for guest checkouts) +ALTER TABLE `orders` ADD COLUMN `user_id` INT NULL DEFAULT NULL AFTER `id`, ADD CONSTRAINT `fk_orders_users` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL; + +-- Add structured shipping address fields +ALTER TABLE `orders` +ADD COLUMN `shipping_province` VARCHAR(100) NOT NULL AFTER `customer_phone`, +ADD COLUMN `shipping_city` VARCHAR(100) NOT NULL AFTER `shipping_province`, +ADD COLUMN `shipping_address_line` TEXT NOT NULL AFTER `shipping_city`, +ADD COLUMN `shipping_postal_code` VARCHAR(20) NOT NULL AFTER `shipping_address_line`; + +-- Rename old columns to avoid confusion, but keep them for any old data +ALTER TABLE `orders` +CHANGE `customer_name` `billing_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, +CHANGE `customer_email` `billing_email` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, +CHANGE `customer_address` `legacy_customer_address` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL; + diff --git a/db/migrations/008_create_otp_table.sql b/db/migrations/008_create_otp_table.sql new file mode 100644 index 00000000..535016ad --- /dev/null +++ b/db/migrations/008_create_otp_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `otp_codes` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `email` VARCHAR(255) NOT NULL, + `code_hash` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `expires_at` TIMESTAMP NOT NULL, + `is_used` BOOLEAN NOT NULL DEFAULT FALSE, + INDEX `email_index` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/includes/footer.php b/includes/footer.php index 1941d4a2..7e5be656 100644 --- a/includes/footer.php +++ b/includes/footer.php @@ -37,9 +37,9 @@
ما را دنبال کنید

از جدیدترین محصولات و تخفیف‌ها باخبر شوید.

diff --git a/includes/header.php b/includes/header.php index e713bbbf..c7b7a183 100644 --- a/includes/header.php +++ b/includes/header.php @@ -20,8 +20,9 @@ $page_title = $page_title ?? 'فروشگاه آتیمه'; // Default title - - + + + @@ -67,7 +68,7 @@ $page_title = $page_title ?? 'فروشگاه آتیمه'; // Default title فروشگاه
diff --git a/index.php b/index.php index e4658220..be1547fd 100644 --- a/index.php +++ b/index.php @@ -22,9 +22,19 @@ include 'includes/header.php';