From 6c608b6ba5d2f3830fc88b185ea45e0cca51f33c Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 6 Dec 2025 16:02:15 +0000 Subject: [PATCH] =?UTF-8?q?=D9=BE=D8=B1=D8=B1=D8=B1=D8=B1=D8=B1=D8=B1?= =?UTF-8?q?=D8=B1=D8=B1=D8=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- about.php | 6 +- admin/assets/css/admin_main.css | 347 +++ admin/cache/sales_chart.json | 2 +- admin/dashboard.php | 103 +- admin/header.php | 8 +- admin/login.php | 80 +- admin/nav.php | 56 +- admin/orders.php | 5 +- api/get_order_details.php | 86 +- assets/css/auth_style.css | 248 -- assets/css/custom.css | 359 +-- assets/css/dark_luxury.css | 2078 +++++++++++++++++ assets/pasted-20251206-134906-08663223.jpg | Bin 0 -> 185313 bytes assets/vm-shot-2025-12-06T13-48-54-374Z.jpg | Bin 0 -> 66301 bytes cart.php | 10 +- checkout.php | 296 +-- checkout_handler.php | 209 +- contact.php | 56 +- .../015_allow_null_password_in_users.sql | 1 + faq.php | 86 + includes/footer.php | 7 +- includes/jdf.php | 270 ++- index.php | 189 +- login.php | 32 +- product.php | 70 +- profile.php | 693 ++++-- shop.php | 64 +- terms.php | 53 + track_order.php | 128 +- verify.php | 29 +- 30 files changed, 4016 insertions(+), 1555 deletions(-) create mode 100644 admin/assets/css/admin_main.css delete mode 100644 assets/css/auth_style.css create mode 100644 assets/pasted-20251206-134906-08663223.jpg create mode 100644 assets/vm-shot-2025-12-06T13-48-54-374Z.jpg create mode 100644 db/migrations/015_allow_null_password_in_users.sql create mode 100644 faq.php create mode 100644 terms.php diff --git a/about.php b/about.php index 1ff43558..646ba772 100644 --- a/about.php +++ b/about.php @@ -33,21 +33,21 @@ require_once 'includes/header.php';
- +

تعهد به کیفیت

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

- +

هنر دست

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

- +

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

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

diff --git a/admin/assets/css/admin_main.css b/admin/assets/css/admin_main.css new file mode 100644 index 00000000..8227edfd --- /dev/null +++ b/admin/assets/css/admin_main.css @@ -0,0 +1,347 @@ +/* + * Admin Panel Main Stylesheet + * A clean, modern, and professional light theme. + */ + +@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700&display=swap'); +@import url('https://cdn.jsdelivr.net/npm/remixicon@4.2.0/fonts/remixicon.css'); + +:root { + --admin-bg-light: #f4f7f9; /* Light gray background */ + --admin-surface-light: #ffffff; /* White surface for cards, sidebar */ + --admin-border-light: #e0e5ec; /* Soft border color */ + --admin-text-primary: #2d3748; /* Dark text for high contrast */ + --admin-text-secondary: #718096; /* Lighter text for muted info */ + --admin-primary: #4a5568; /* A neutral, professional primary color */ + --admin-primary-active: #2d3748; + --admin-success: #38a169; + --admin-danger: #e53e3e; + --admin-warning: #dd6b20; + --admin-info: #3182ce; +} + +body.admin-theme { + background-color: var(--admin-bg-light); + color: var(--admin-text-primary); + font-family: 'Vazirmatn', sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + display: flex; + min-height: 100vh; +} + +.admin-wrapper { + display: flex; + width: 100%; +} + +/* --- Sidebar / Navigation --- */ +.admin-sidebar { + width: 250px; + background-color: var(--admin-surface-light); + border-right: 1px solid var(--admin-border-light); + padding: 1.5rem 0; + display: flex; + flex-direction: column; + transition: width 0.3s ease; + box-shadow: 0 0 20px rgba(0,0,0,0.03); +} + +.sidebar-header { + padding: 0 1.5rem 1.5rem 1.5rem; + text-align: center; + border-bottom: 1px solid var(--admin-border-light); +} + +.sidebar-header h2 a { + color: var(--admin-text-primary); + text-decoration: none; + font-size: 1.5rem; + font-weight: 700; +} + +.sidebar-header h2 a span { + color: var(--admin-primary-active); +} + +.admin-nav { + flex-grow: 1; + list-style: none; + padding: 1.5rem 0 0 0; + margin: 0; +} + +.admin-nav-item { + margin: 0 1rem; +} + +.admin-nav-link { + display: flex; + align-items: center; + gap: 0.9rem; + padding: 0.8rem 1rem; + color: var(--admin-text-secondary); + text-decoration: none; + font-weight: 600; + font-size: 0.9rem; + border-radius: 8px; + transition: all 0.3s ease; +} + +.admin-nav-link i { + font-size: 1.2rem; + width: 20px; + text-align: center; +} + +.admin-nav-link:hover { + background-color: var(--admin-bg-light); + color: var(--admin-primary-active); +} + +.admin-nav-link.active { + background-color: var(--admin-primary); + color: #ffffff; + font-weight: 700; +} + +.admin-nav-link.active:hover { + color: #ffffff; + background-color: var(--admin-primary-active); +} +.admin-nav-link.active i { + color: #ffffff; +} + +.sidebar-footer { + padding: 1.5rem; + text-align: center; + border-top: 1px solid var(--admin-border-light); +} + +.sidebar-footer a { + color: var(--admin-text-secondary); + text-decoration: none; + font-size: 0.9rem; +} +.sidebar-footer a:hover { + color: var(--admin-primary-active); +} + +/* --- Main Content --- */ +.admin-main-content { + flex-grow: 1; + padding: 2rem; + overflow-y: auto; +} + +.admin-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.admin-header h1 { + margin: 0; + font-size: 1.8rem; + font-weight: 700; +} + +/* --- General Components --- */ +.card { + background-color: var(--admin-surface-light); + border: 1px solid var(--admin-border-light); + border-radius: 12px; + margin-bottom: 2rem; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); +} + +.card-header { + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--admin-border-light); + font-size: 1.1rem; + font-weight: 600; +} + +.card-body { + padding: 1.5rem; +} + +.table { + width: 100%; + border-collapse: collapse; +} + +.table th, .table td { + padding: 1rem 1.2rem; + text-align: right; + border-bottom: 1px solid var(--admin-border-light); +} + +.table th { + font-weight: 700; + color: var(--admin-text-secondary); + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.table tbody tr:last-child td { + border-bottom: none; +} + +.table tbody tr:hover { + background-color: var(--admin-bg-light); +} + +.btn { + padding: 0.6rem 1.2rem; + border-radius: 8px; + text-decoration: none; + font-weight: 600; + transition: all 0.3s ease; + border: 1px solid transparent; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.btn-primary { + background-color: var(--admin-primary-active); + border-color: var(--admin-primary-active); + color: #fff; +} +.btn-primary:hover { + background-color: #2c3e50; /* Slightly darker */ +} + +.btn-danger { + background-color: var(--admin-danger); + color: #fff; +} + +/* --- Stat Cards --- */ +.stat-card { + background-color: var(--admin-surface-light); + border-radius: 12px; + padding: 1.5rem; + display: flex; + align-items: center; + gap: 1.5rem; + border: 1px solid var(--admin-border-light); + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); +} + +.stat-card .icon { + font-size: 1.8rem; + padding: 1rem; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; +} + +.stat-card .stat-info p { + margin: 0; + font-size: 0.9rem; + color: var(--admin-text-secondary); +} + +.stat-card .stat-info h3 { + margin: 0; + font-size: 2rem; + font-weight: 700; +} + +.icon.bg-success { background-color: var(--admin-success); } +.icon.bg-danger { background-color: var(--admin-danger); } +.icon.bg-warning { background-color: var(--admin-warning); } +.icon.bg-info { background-color: var(--admin-info); } + + +/* --- Chart Container --- */ +.chart-container { + background-color: var(--admin-surface-light); + padding: 2rem; + border-radius: 12px; + border: 1px solid var(--admin-border-light); + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); +} + +.chart-container h5 { + font-weight: 700; + margin-bottom: 1.5rem; + font-size: 1.2rem; +} + +/* --- Form styles --- */ +.form-group { + margin-bottom: 1.5rem; +} + +.form-label { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + color: var(--admin-text-primary); +} + +.form-control { + width: 100%; + padding: 0.8rem 1rem; + background-color: var(--admin-surface-light); + border: 1px solid var(--admin-border-light); + color: var(--admin-text-primary); + border-radius: 8px; + box-sizing: border-box; + transition: border-color 0.3s ease, box-shadow 0.3s ease; +} + +.form-control:focus { + outline: none; + border-color: var(--admin-primary); + box-shadow: 0 0 0 3px rgba(74, 85, 104, 0.1); +} + +textarea.form-control { + min-height: 120px; + resize: vertical; +} + +/* Admin Login Page */ +.admin-login-wrapper { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + min-height: 100vh; + background-color: var(--admin-bg-light); +} + +.admin-login-box { + width: 100%; + max-width: 400px; + padding: 3rem; + background: var(--admin-surface-light); + border-radius: 12px; + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.07), 0 4px 6px -2px rgba(0, 0, 0, 0.04); +} + +.admin-login-box h2 { + font-weight: 700; + text-align: center; + margin-bottom: 0.5rem; +} + +.admin-login-box p { + text-align: center; + color: var(--admin-text-secondary); + margin-bottom: 2rem; +} + +/* Responsive adjustments will be added later if needed */ + diff --git a/admin/cache/sales_chart.json b/admin/cache/sales_chart.json index 336a6388..262b8e3c 100644 --- a/admin/cache/sales_chart.json +++ b/admin/cache/sales_chart.json @@ -1 +1 @@ -{"labels":["1404-09"],"data":[2940000]} \ No newline at end of file +{"labels":[],"data":[]} \ No newline at end of file diff --git a/admin/dashboard.php b/admin/dashboard.php index 6d4f4c0b..fb340499 100644 --- a/admin/dashboard.php +++ b/admin/dashboard.php @@ -1,66 +1,63 @@ + + +
-

گزارش‌ها

+

- +
+
+
+
+
+

مجموع فروش (تحویل شده)

+

...

+
+
+
+
+
+

مجموع کاربران

+

...

+
+
+
+
+
+

سفارشات در حال ارسال

+

...

+
+
+
+
+
+

سفارشات لغو شده

+

...

+
+
+
+
+
+

سفارشات در حال پردازش

+

...

+
+
+
+
+
+

کل بازدید صفحات

+

...

+
+
+
-
-
-
-
-

مجموع فروش (تحویل شده)

-

...

-
-
-
-
-
-

مجموع کاربران

-

...

-
-
-
-
-
-

سفارشات در حال ارسال

-

...

-
-
-
-
-
-

سفارشات لغو شده

-

...

-
-
-
-
-
-

سفارشات در حال پردازش

-

...

-
-
-
-
-
-

کل بازدید صفحات

-

...

-
-
-
نمودار فروش ماهانه (سفارشات تحویل شده)
diff --git a/admin/header.php b/admin/header.php index da4e645d..afa860d8 100644 --- a/admin/header.php +++ b/admin/header.php @@ -3,10 +3,10 @@ - پنل مدیریت + <?php echo isset($page_title) ? $page_title . ' - ' : ''; ?>پنل مدیریت آتیمه - + @@ -18,5 +18,5 @@
- -
+ +
\ No newline at end of file diff --git a/admin/login.php b/admin/login.php index 1b52b12f..437eacd4 100644 --- a/admin/login.php +++ b/admin/login.php @@ -1,7 +1,6 @@ - ورود به پنل مدیریت + <?= $page_title; ?> - - - + - + -
-
-
-
-
-

ورود به پنل

-

رمز عبور: admin123

- - - -
-
- - -
-
- -
-
-
+
+ + \ No newline at end of file diff --git a/admin/nav.php b/admin/nav.php index f4e79466..384f6c87 100644 --- a/admin/nav.php +++ b/admin/nav.php @@ -3,35 +3,31 @@ - + - \ No newline at end of file + diff --git a/admin/orders.php b/admin/orders.php index 094723b2..1d4e62a5 100644 --- a/admin/orders.php +++ b/admin/orders.php @@ -102,7 +102,10 @@ document.addEventListener('DOMContentLoaded', () => {
diff --git a/checkout.php b/checkout.php index 9fa9b6ed..fb9780d0 100644 --- a/checkout.php +++ b/checkout.php @@ -1,185 +1,185 @@ $item) { + // Ensure item has required data + if (!isset($item['price'], $item['quantity'], $item['name'], $item['image_url'])) { + // Skip malformed items + continue; + } -if ($is_logged_in) { + $item_total = $item['price'] * $item['quantity']; + $total_price += $item_total; + + // Store details for display + $product_details[] = [ + 'id' => $item['product_id'], + 'name' => $item['name'], + 'price' => $item['price'], + 'image_url' => $item['image_url'], + 'quantity' => $item['quantity'], + 'color' => $item['color'] ?? '', // Handle case where color might not be set + 'total' => $item_total + ]; +} + + +// 3. If after all checks, product_details is empty (e.g. invalid items in cart), redirect. +if (empty($product_details)) { + // Clear the invalid cart and redirect + unset($_SESSION['cart']); + header('Location: shop.php'); + exit(); +} + +// 4. Fetch user data if logged in +$user_id = $_SESSION['user_id'] ?? null; +$user = []; +$address = []; + +if ($user_id) { try { $pdo = db(); - $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); - $stmt->execute([$_SESSION['user_id']]); - $logged_in_user = $stmt->fetch(PDO::FETCH_ASSOC); + $user_stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); + $user_stmt->execute([$user_id]); + $user = $user_stmt->fetch(PDO::FETCH_ASSOC) ?: []; - $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); + $address_stmt = $pdo->prepare("SELECT * FROM user_addresses WHERE user_id = ? ORDER BY id DESC LIMIT 1"); + $address_stmt->execute([$user_id]); + $address = $address_stmt->fetch(PDO::FETCH_ASSOC) ?: []; } catch (PDOException $e) { - // In a real app, log this error - die("Error fetching user data."); + error_log("Checkout user fetch error: " . $e->getMessage()); + // Do not block the page, guest checkout is still possible } } -$page_title = 'تکمیل سفارش'; -require_once 'includes/header.php'; + +$shipping_cost = 50000; +$grand_total = $total_price + $shipping_cost; + ?> -
- ' . htmlspecialchars($_SESSION['error_message']) . '
'; - unset($_SESSION['error_message']); - } - ?> -
-

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

-

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

-
+
+
+ +
+

جزئیات صورتحساب

-
-
- -
-

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

+
    '; + foreach ($_SESSION['checkout_errors'] as $error) { + echo '
  • ' . htmlspecialchars($error) . '
  • '; + } + echo '
'; + // Unset the session variable so it doesn't show again on refresh + unset($_SESSION['checkout_errors']); + } + ?> + + - -
- - -
- - -
-
-
-
- - -
+
+
اطلاعات تماس
+
+
+
+ +
-
- - -
+
+ +
-
- - -
- -
توجه: فقط با شماره تلفن همراه میتوان سفارش را رهگیری کرد.
- -
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
+
- -
+ +
+
+ +
-
-
- - -
لطفاً قوانین و مقررات را بپذیرید.
-
- -
-
-
-

خلاصه سفارش

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

خلاصه سفارش شما

+
    + +
  • + (x) + T +
  • + +
+ +
+
+ جمع کل + T +
+
+ هزینه ارسال + T +
+
+ مبلغ قابل پرداخت + T +
+
+ +
+ +
- -
+
+
- - - \ No newline at end of file + diff --git a/checkout_handler.php b/checkout_handler.php index 0fb0fb0f..3d9ba926 100644 --- a/checkout_handler.php +++ b/checkout_handler.php @@ -1,109 +1,158 @@ prepare("SELECT id, name, price FROM products WHERE id IN ($placeholders)"); + $stmt->execute($product_ids); + $products_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Create a map for quick lookup + $products_by_id = []; + foreach($products_data as $product) { + $products_by_id[$product['id']] = $product; + } + + foreach ($cart as $product_id => $details) { + if (isset($products_by_id[$product_id])) { + $product = $products_by_id[$product_id]; + $price = $product['price']; + $quantity = $details['quantity']; + $total_price += $price * $quantity; + + $items_for_json[] = [ + 'id' => $product_id, + 'name' => $product['name'], + 'price' => $price, + 'quantity' => $quantity, + 'color' => $details['color'] + ]; + } + } +} + +$shipping_cost = 50000; +$grand_total = $total_price + $shipping_cost; + +// == Database Operations == $pdo = db(); -$pdo->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); - $products_data_json = json_encode($cart_items, JSON_UNESCAPED_UNICODE); + $pdo->beginTransaction(); - // 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, billing_phone, billing_province, billing_city, billing_address, billing_postal_code, total_amount, items_json, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + // 5. User Handling (Guest or Logged in) + $user_id = $_SESSION['user_id'] ?? null; + + if (!$user_id) { + // For guests, check if user exists by phone + $user_stmt = $pdo->prepare("SELECT id FROM users WHERE phone_number = ?"); + $user_stmt->execute([$phone_number]); + $existing_user = $user_stmt->fetch(PDO::FETCH_ASSOC); + + if ($existing_user) { + $user_id = $existing_user['id']; + } else { + // Create a new user + $user_insert_stmt = $pdo->prepare("INSERT INTO users (first_name, last_name, email, phone_number, is_admin) VALUES (?, ?, ?, ?, 0)"); + $user_insert_stmt->execute([$first_name, $last_name, $email, $phone_number]); + $user_id = $pdo->lastInsertId(); + } + // Log the new/guest user in + $_SESSION['user_id'] = $user_id; + } + + // 6. Generate a unique tracking ID + $tracking_id = 'FL-' . strtoupper(bin2hex(random_bytes(5))); + + // 7. Insert the order into the database + $order_stmt = $pdo->prepare( + "INSERT INTO orders (user_id, billing_name, billing_email, billing_phone, billing_province, billing_city, billing_address, billing_postal_code, total_amount, items_json, status, tracking_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)" ); - $user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null; - $status = 'Processing'; // Default status - $final_email = ($email !== false && $email !== '') ? $email : null; + $full_name = $first_name . ' ' . $last_name; + $items_json_encoded = json_encode($items_for_json, JSON_UNESCAPED_UNICODE); - $stmt->execute([ + $order_stmt->execute([ $user_id, - $billing_name, - $final_email, + $full_name, + $email, $phone_number, $province, $city, $address_line, $postal_code, - $total_amount, - $products_data_json, - $status + $grand_total, // Storing the final amount including shipping + $items_json_encoded, + $tracking_id ]); - - $order_id = $pdo->lastInsertId(); - $tracking_id = uniqid('ATMH-'); - $update_stmt = $pdo->prepare("UPDATE orders SET tracking_id = ? WHERE id = ?"); - $update_stmt->execute([$tracking_id, $order_id]); - - // 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 including tracking ID + // 8. Clear cart and redirect to a success page unset($_SESSION['cart']); - $_SESSION['success_message'] = "سفارش شما با موفقیت ثبت شد! کد پیگیری شما: " . htmlspecialchars($tracking_id) . ""; - // As I don't have SMS capability, I am displaying the tracking code here. - // You can later integrate an SMS service and send the tracking ID to $phone_number. - - header('Location: index.php'); - exit; + unset($_SESSION['form_data']); + + header('Location: track_order.php?tracking_id=' . $tracking_id); + 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'] = 'خطایی در ثبت سفارش رخ داد. لطفاً دوباره تلاش کنید.'; + // Log the detailed error for developers + error_log('Checkout Error: ' . $e->getMessage()); + + // Set a user-friendly error message and redirect + $_SESSION['checkout_errors'] = ['یک خطای غیرمنتظره در هنگام ثبت سفارش رخ داد. لطفاً لحظاتی دیگر دوباره تلاش کنید.']; + $_SESSION['form_data'] = $_POST; header('Location: checkout.php'); - exit; -} + exit(); +} \ No newline at end of file diff --git a/contact.php b/contact.php index cb61a5c1..1ccaf8cd 100644 --- a/contact.php +++ b/contact.php @@ -11,11 +11,11 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['contact_form'])) { $message = trim(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING)); if (empty($name) || empty($email) || empty($message)) { - $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'لطفاً تمام فیلدها را پر کنید.']; + $_SESSION['flash_message'] = ['type' => 'warning', 'message' => 'لطفاً تمام فیلدها را پر کنید.']; } elseif (!$email) { $_SESSION['flash_message'] = ['type' => 'error', 'message' => 'آدرس ایمیل وارد شده معتبر نیست.']; } else { - $to_email = getenv('MAIL_TO') ?: 'support@atimeh.com'; + $to_email = getenv('MAIL_TO') ?: 'support@atimeh.com'; // Fallback email $subject = "پیام جدید از فرم تماس وب‌سایت"; $email_result = MailService::sendContactMessage($name, $email, $message, $to_email, $subject); @@ -27,12 +27,15 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['contact_form'])) { } } + // Redirect to the same page to prevent form resubmission header("Location: contact.php"); exit(); } +// Check for flash message $flash_message = $_SESSION['flash_message'] ?? null; if ($flash_message) { + // Clear the message from session so it doesn't show again unset($_SESSION['flash_message']); } ?> @@ -49,21 +52,21 @@ if ($flash_message) {

راه‌های ارتباطی

- +
آدرس:

تهران، خیابان هنر، کوچه خلاقیت، پلاک ۱۲

- +
ایمیل:

info@atimeh.com

- +
تلفن:

۰۲۱-۱۲۳۴۵۶۷۸

@@ -71,17 +74,17 @@ if ($flash_message) {

ما را دنبال کنید

-
- - - +
+ + +

فرم تماس

- +
@@ -103,27 +106,30 @@ if ($flash_message) {
+ - + \ No newline at end of file diff --git a/db/migrations/015_allow_null_password_in_users.sql b/db/migrations/015_allow_null_password_in_users.sql new file mode 100644 index 00000000..09196fd9 --- /dev/null +++ b/db/migrations/015_allow_null_password_in_users.sql @@ -0,0 +1 @@ +ALTER TABLE `users` CHANGE `password` `password` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL; \ No newline at end of file diff --git a/faq.php b/faq.php new file mode 100644 index 00000000..d899b3c4 --- /dev/null +++ b/faq.php @@ -0,0 +1,86 @@ + + +
+
+

سوالات متداول

+

پاسخ به برخی از سوالات شما

+
+ +
+
+
+ +
+

+ +

+
+
+

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

+
+
+
+ +
+

+ +

+
+
+

سفارش‌ها در تهران طی ۲ تا ۳ روز کاری و در سایر شهرها طی ۴ تا ۷ روز کاری از طریق پست پیشتاز ارسال می‌شوند. کد رهگیری پستی پس از ارسال، برای شما پیامک خواهد شد.

+
+
+
+ +
+

+ +

+
+
+

بله، در صورت عدم رضایت از محصول یا وجود هرگونه مغایرت، تا ۷ روز پس از دریافت کالا فرصت دارید تا آن را بازگردانید. لطفاً توجه داشته باشید که محصول نباید استفاده شده باشد و بسته‌بندی آن آسیب ندیده باشد. برای هماهنگی با پشتیبانی تماس بگیرید.

+
+
+
+ +
+

+ +

+
+
+

پس از ارسال سفارش، یک کد رهگیری ۲۴ رقمی از طریق پیامک برای شما ارسال می‌شود. شما می‌توانید با مراجعه به وب‌سایت رسمی پست و وارد کردن این کد، از آخرین وضعیت بسته خود مطلع شوید. همچنین می‌توانید از طریق صفحه "پیگیری سفارش" در سایت ما نیز اقدام کنید.

+
+
+
+ +
+

+ +

+
+
+

بله، تمامی محصولات چرم ما دارای ۶ ماه ضمانت کیفیت دوخت و یراق‌آلات هستند. این ضمانت شامل آسیب‌های ناشی از استفاده نادرست نمی‌شود.

+
+
+
+ +
+
+
+
+ + diff --git a/includes/footer.php b/includes/footer.php index 7e5be656..3c622efc 100644 --- a/includes/footer.php +++ b/includes/footer.php @@ -11,9 +11,10 @@
دسترسی سریع
diff --git a/includes/jdf.php b/includes/jdf.php index f20a5cbe..1ba003df 100644 --- a/includes/jdf.php +++ b/includes/jdf.php @@ -1,24 +1,258 @@ 2) ? ($gy + 1) : $gy; - $days = (365 * $gy) + ((int)(($gy2 + 3) / 4)) - ((int)(($gy2 + 99) / 100)) + ((int)(($gy2 + 399) / 400)) - 80 + $gd + $g_d_m[$gm - 1]; - $jy += 33 * ((int)($days / 12053)); - $days %= 12053; - $jy += 4 * ((int)($days / 1461)); - $days %= 1461; - $jy += (int)(($days - 1) / 365); - if ($days > 365) $days = ($days - 1) % 365; - $jm = ($days < 186) ? 1 + (int)($days / 31) : 7 + (int)(($days - 186) / 30); - $jd = 1 + (($days < 186) ? ($days % 31) : (($days - 186) % 30)); - return ($mod == '') ? array($jy, $jm, $jd) : $jy . $mod . $jm . $mod . $jd; + LICENSE: FREE FOR NON-COMMERCIAL USE + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +*/ + +function jdate($format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') +{ + +$T_sec=0;/* <= آرشیو شود */ + +if($time_zone != 'local') date_default_timezone_set(($time_zone === '') ? 'Asia/Tehran' : $time_zone); +$ts=$T_sec+(($timestamp==='') ? time() : tr_num($timestamp)); +$date=explode(' _ ',date('H_i_j_n_O_P_s_w_Y',$ts)); +list($j_y,$j_m,$j_d)=gregorian_to_jalali($date[8],$date[3],$date[2]); +$doy=($j_m<7)?(($j_m-1)*31)+$j_d-1:(($j_m-7)*30)+$j_d+185; +$kab=(((($j_y%33)%4)-1)%4==0); +$sl=strlen($format); +$out=''; +for($i=0; $i<$sl; $i++) +{ + $sub=substr($format,$i,1); + if($sub=='\\') + { + $out.=substr($format,++$i,1); + continue; + } + switch($sub) + { + + case 'a':$out.=($date[0]<12)?'ق.ظ':'ب.ظ';break; + case 'A':$out.=($date[0]<12)?'قبل از ظهر':'بعد از ظهر';break; + case 'B':$out.=floor(1+($ts/86400));break; + case 'c':$out.=date('Y-m-d\TH:i:sP',$ts);break; + case 'd':$out.=($j_d<10)?'0'.$j_d:$j_d;break; + case 'D':$out.=jdate_words(array('rh'=>$date[7]),' ');break; + case 'F':$out.=jdate_words(array('mm'=>$j_m),' ');break; + case 'g':$out.=($date[0]>12)?$date[0]-12:$date[0];break; + case 'G':$out.=$date[0];break; + case 'h':$out.=((($date[0]>12)?$date[0]-12:$date[0])<10)?'0'.(($date[0]>12)?$date[0]-12:$date[0]):(($date[0]>12)?$date[0]-12:$date[0]);break; + case 'H':$out.=($date[0]<10)?'0'.$date[0]:$date[0];break; + case 'i':$out.=($date[1]<10)?'0'.$date[1]:$date[1];break; + case 'j':$out.=$j_d;break; + case 'l':$out.=jdate_words(array('rh'=>$date[7]),' ');break; + case 'L':$out.=$kab;break; + case 'm':$out.=($j_m<10)?'0'.$j_m:$j_m;break; + case 'M':$out.=jdate_words(array('mn'=>$j_m),' ');break; + case 'n':$out.=$j_m;break; + case 'N':$out.=$date[7]+1;break; + case 'o': + $j_y_plus= $j_y+1; + $j_y_minus= $j_y-1; + $fall_start=gregorian_to_jalali(date('Y', $ts),3,21); + $fall_end=gregorian_to_jalali(date('Y', $ts),12,21); + if($j_d > $fall_start[2] && $j_m <4) + { + $out.=$j_y_minus; + } + elseif($j_d < $fall_end[2] && $j_m > 10) + { + $out.=$j_y_plus; + } + else + { + $out.=$j_y; + } + break; + case 'O':$out.=$date[4];break; + case 'p':$out.=jdate_words(array('mb'=>$j_m),' ');break; + case 'P':$out.=$date[5];break; + case 'q':$out.=jdate_words(array('sh'=>$j_y),' ');break; + case 'r':$out.=jdate_words(array('rh'=>$date[7]),' ') .'، ' . $j_d.' ' . jdate_words(array('mm'=>$j_m),' ') .' ' . $j_y .' ' . $date[0].':' . $date[1].':' . $date[6] .' ' . $date[4];break; + case 's':$out.=($date[6]<10)?'0'.$date[6]:$date[6];break; + case 'S':$out.='ام';break; + case 't':$out.=($j_m!=12)?(31-(int)($j_m/6.5)):($kab+29);break; + case 'U':$out.=$ts;break; + case 'w':$out.=$date[7];break; + case 'W':$out.=(int)($doy/7);break; + case 'y':$out.=substr($j_y,2,2);break; + case 'Y':$out.=$j_y;break; + case 'z':$out.=$doy;break; + default:$out.=$sub; + } +} +return ($tr_num!='en')?tr_num($out):$out; +} + +function jstrftime($format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') +{ + +$T_sec=0;/* <= آرشیو شود */ + +if($time_zone != 'local') date_default_timezone_set(($time_zone === '') ? 'Asia/Tehran' : $time_zone); +$ts=$T_sec+(($timestamp==='')?time():tr_num($timestamp)); +$date=explode(' _ ',date('h_H_i_j_n_s_w_Y',$ts)); +list($j_y,$j_m,$j_d)=gregorian_to_jalali($date[7],$date[4],$date[3]); +$doy=($j_m<7)?(($j_m-1)*31)+$j_d-1:(($j_m-7)*30)+$j_d+185; +$kab=(((($j_y%33)%4)-1)%4==0); +$sl=strlen($format); +$out=''; +for($i=0; $i<$sl; $i++) +{ + $sub=substr($format,$i,1); + if($sub=='%') + { + $sub=substr($format,++$i,1); + } + else + { + $out.=$sub; + continue; + } + switch($sub) + { + + case 'a':$out.=jdate_words(array('rh'=>$date[6]),' ');break; + case 'A':$out.=jdate_words(array('RL'=>$date[6]),' ');break; + case 'b':$out.=jdate_words(array('mm'=>$j_m),' ');break; + case 'B':$out.=jdate_words(array('MM'=>$j_m),' ');break; + case 'c':$out.=jdate('D M j H:i:s Y');break; + case 'C':$out.=(int)($j_y/100);break; + case 'd':$out.=($j_d<10)?'0'.$j_d:$j_d;break; + case 'D':$out.=substr($j_y,2,2).'/' .( ($j_m<10)?'0'.$j_m:$j_m ).'/' .( ($j_d<10)?'0'.$j_d:$j_d );break; + case 'e':$out.=($j_d<10)?' '.$j_d:$j_d;break; + case 'H':$out.=($date[1]<10)?'0'.$date[1]:$date[1];break; + case 'I':$out.=($date[0]<10)?'0'.$date[0]:$date[0];break; + case 'j':$out.=($doy<100)?(($doy<10)?'00'.$doy:'0'.$doy):$doy;break; + case 'm':$out.=($j_m<10)?'0'.$j_m:$j_m;break; + case 'M':$out.=($date[2]<10)?'0'.$date[2]:$date[2];break; + case 'p':$out.=($date[1]<12)?'قبل از ظهر':'بعد از ظهر';break; + case 'P':$out.=($date[1]<12)?'ق.ظ':'ب.ظ';break; + case 's':$out.=floor($ts);break; + case 'S':$out.=($date[5]<10)?'0'.$date[5]:$date[5];break; + case 'u':$out.=$date[6]+1;break; + case 'U':$out.=(int)($doy/7);break; + case 'V':$out.=(int)($doy/7);break; + case 'w':$out.=$date[6];break; + case 'W':$out.=(int)($doy/7);break; + case 'x':$out.=substr($j_y,2,2).'/' .( ($j_m<10)?'0'.$j_m:$j_m ).'/' .( ($j_d<10)?'0'.$j_d:$j_d );break; + case 'X':$out.=($date[0]<10)?'0'.$date[0]:$date[0].':' .( ($date[1]<10)?'0'.$date[1]:$date[1] ).':' .( ($date[6]<10)?'0'.$date[6]:$date[6] );break; + case 'y':$out.=substr($j_y,2,2);break; + case 'Y':$out.=$j_y;break; + case 'Z':$out.=date('T',$ts);break; + case '%':$out.='%';break; + + default:$out.=$sub; + } +} +return ($tr_num!='en')?tr_num($out):$out; +} + +function gregorian_to_jalali($gy,$gm,$gd,$mod='') +{ + $g_d_m=array(0,31,59,90,120,151,181,212,243,273,304,334); + $gy2=($gm>2)?($gy+1):$gy; + $days=355666+(365*$gy)+((int)(($gy2+3)/4))-((int)(($gy2+99)/100))+((int)(($gy2+399)/400))+$gd+$g_d_m[$gm-1]; + $jy=-1595+(33*((int)($days/12053))); + $days%=12053; + $jy+=4*((int)($days/1461)); + $days%=1461; + if($days > 365) + { + $jy+=(int)(($days-1)/365); + $days=($days-1)%365; + } + $jm=($days<186)?1+(int)($days/31):7+(int)(($days-186)/30); + $jd=1+(($days<186)?($days%31):(($days-186)%30)); + return($mod=='')?array($jy,$jm,$jd):$jy.$mod.$jm.$mod.$jd; +} + +function jalali_to_gregorian($jy,$jm,$jd,$mod='') +{ + $jy+=1595; + $days=-355668+(365*$jy)+(((int)($jy/33))*8)+((int)((($jy%33)+3)/4)); + if((($jy%33)%4)==0 and $gy%100!=0 and $gy%400!=0){$days++;} + $jd+=($jm<7)?($jm-1)*31:(($jm-7)*30)+186; + $days+=$jd; + $gy=400*((int)($days/146097)); + $days%=146097; + if($days > 36524) + { + $gy+=100*((int)(--$days/36524)); + $days%=36524; + if($days >= 365){$days++;} + } + $gy+=4*((int)($days/1461)); + $days%=1461; + $gy+=(int)(($days-1)/365); + $days=($days-1)%365; + $gd=$days+1; + foreach(array(0,31,(($gy%4==0 and $gy%100!=0) or ($gy%400==0))?29:28,31,30,31,30,31,31,30,31,30,31) as $gm=>$v) + { + if($gd<=$v)break; + $gd-=$v; + } + return($mod=='')?array($gy,$gm,$gd):$gy.$mod.$gm.$mod.$gd; +} + +function jdate_words($array,$mod='') +{ +foreach($array as $type=>$num) +{ + $num=(int)tr_num($num); + switch($type) + { + case 'ss': + $sl=strlen($num); + $xy3=substr($num,2-$sl,1); + $h3=jdate_words(array('h'=>$xy3)); + $h34=jdate_words(array('h'=>$xy3+1)); + $xy4=substr($num,3-$sl,1); + $h4=jdate_words(array('h'=>$xy4)); + $h44=jdate_words(array('h'=>$xy4+1)); + if($sl==4) + { + $f=($num<2000)?(($num<1400 and $num>1299)?jdate_words(array('h'=>13)).'صد و '.jdate_words(array('ss'=>substr($num,2,2))):''):jdate_words(array('h'=>substr($num,0,1))).' هزار و '.jdate_words(array('ss'=>substr($num,1,3))); + } + elseif($sl==3) + { + $f=($num<200)?jdate_words(array('h'=>1)).'صد و '.jdate_words(array('ss'=>substr($num,1,2))):jdate_words(array('h'=>substr($num,0,1))).'صد و '.jdate_words(array('ss'=>substr($num,1,2))); + } + elseif($sl==2) + { + $f=($num>9 and $num<21)?jdate_words(array('h'=>$num)): + jdate_words(array('h'=>(int)($num/10))).' و '.jdate_words(array('h'=>$num%10)); + } + else{$f=jdate_words(array('h'=>$num));} + break; + + case 'mm':$key=array('فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند');$f=$key[$num-1];break; + case 'mn':$key=array('فرو','ارد','خرد','تیر','مرد','شهر','مهر','آبا','آذر','دی','بهم','اسف');$f=$key[$num-1];break; + case 'rh':$key=array('یکشنبه','دوشنبه','سه شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه');$f=$key[$num];break; + case 'RL':$key=array('یک','دو','سه','چهار','پنج','جمعه','شنبه');$f=$key[$num];break; + case 'sh':$key=array('مار','اسب','گوسفند','میمون','مرغ','سگ','خوک','موش','گاو','پلنگ','خرگوش','نهنگ');$f=$key[$num%12];break; + case 'mb':$key=array('حمل','ثور','جوزا','سرطان','اسد','سنبله','میزان','عقرب','قوس','جدی','دلو','حوت');$f=$key[$num-1];break; + case 'h':$key=array('صفر','یک','دو','سه','چهار','پنج','شش','هفت','هشت','نه','ده','یازده','دوازده','سیزده','چهارده','پانزده','شانزده','هفده','هجده','نوزده','بیست');$f=$key[$num];break; + } +} +return $f; +} + +function tr_num($str,$mod='en',$mf='٫') +{ +$num_a=array('0','1','2','3','4','5','6','7','8','9','.'); +$key_a=array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹',$mf); +return($mod=='fa')?str_replace($num_a,$key_a,$str):str_replace($key_a,$num_a,$str); } ?> \ No newline at end of file diff --git a/index.php b/index.php index be1547fd..62c4589b 100644 --- a/index.php +++ b/index.php @@ -1,97 +1,118 @@ '; +echo 'Debug Info (index.php):
'; +echo '
';
+print_r($_SESSION);
+echo '
'; +echo '
'; + $page_title = 'صفحه اصلی'; include 'includes/header.php'; + + +// Load dynamic content +$about_us_image_data = json_decode(file_get_contents('about_us_image.json'), true); +$about_us_image_url = $about_us_image_data ? str_replace('\\/', '/', $about_us_image_data['local_path']) : 'assets/images/pexels/about-us-34942790.jpg'; + +require_once 'db/config.php'; ?> - -
-
-
- -
-
-

اصالت در هر نگاه

-

محصولات چرمی دست‌دوز، آفریده برای ماندگاری.

- کاوش در مجموعه -
-
+ +
+
+
+ +
+
+

اصالت در هر نگاه

+

محصولات چرمی دست‌دوز، آفریده برای ماندگاری.

+ کاوش در مجموعه +
+
- -
+ - -
-
-
-
- درباره ما -
-
-

داستان آتیمه

-

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

- بیشتر بدانید -
-
-
-
- - \ No newline at end of file + diff --git a/login.php b/login.php index 4c321e0c..0653f033 100644 --- a/login.php +++ b/login.php @@ -14,17 +14,15 @@ $page_title = "ورود یا ثبت‌نام"; - <?php echo $page_title; ?> - آتیمه + <?= $page_title; ?> - آتیمه - - + + - - - + - +
@@ -38,14 +36,15 @@ $page_title = "ورود یا ثبت‌نام";
-
+
+

ورود یا ثبت‌نام

برای دریافت کد یکبار مصرف، ایمیل خود را وارد کنید.

- -
یا
- - -
@@ -81,4 +71,4 @@ $page_title = "ورود یا ثبت‌نام"; - \ No newline at end of file + diff --git a/product.php b/product.php index 3f8c3c7b..1fedc481 100644 --- a/product.php +++ b/product.php @@ -50,18 +50,18 @@ if (!empty($product['colors'])) {
-
+

-

تومان

+

تومان

-

+

@@ -72,22 +72,22 @@ if (!empty($product['colors'])) {
انتخاب رنگ:
$color_hex): ?> - > - + /> +
-
+
- +
-
- +
+
@@ -105,16 +105,17 @@ document.addEventListener('DOMContentLoaded', function() { $flash_message = $_SESSION['flash_message']; unset($_SESSION['flash_message']); echo "Swal.fire({ - title: '" . addslashes($flash_message['message']) . "', - icon: '" . $flash_message['type'] . "', + title: '".addslashes($flash_message['message'])."', + icon: '". $flash_message['type'] ."', toast: true, position: 'top-start', showConfirmButton: false, timer: 4000, timerProgressBar: true, + showCloseButton: true, didOpen: (toast) => { - toast.onmouseenter = Swal.stopTimer; - toast.onmouseleave = Swal.resumeTimer; + toast.addEventListener('mouseenter', Swal.stopTimer); + toast.addEventListener('mouseleave', Swal.resumeTimer); }, customClass: { popup: 'dark-theme-toast' @@ -152,46 +153,5 @@ document.addEventListener('DOMContentLoaded', function() { } }); - \ No newline at end of file diff --git a/profile.php b/profile.php index 340696e1..08833646 100644 --- a/profile.php +++ b/profile.php @@ -1,8 +1,10 @@ prepare("UPDATE users SET first_name = ?, last_name = ?, email = ? WHERE id = ?"); + $stmt->execute([$first_name, $last_name, $email, $user_id]); + $_SESSION['profile_message'] = 'اطلاعات شما با موفقیت به‌روزرسانی شد.'; + $_SESSION['profile_message_type'] = 'success'; + } catch (PDOException $e) { + // Check for duplicate email error + if ($e->errorInfo[1] == 1062) { + $_SESSION['profile_message'] = 'این ایمیل قبلاً ثبت شده است. لطفاً ایمیل دیگری را امتحان کنید.'; + } else { + $_SESSION['profile_message'] = 'خطا در به‌روزرسانی اطلاعات.'; + } + $_SESSION['profile_message_type'] = 'danger'; + } + } + header('Location: profile.php?page=account'); + exit; + } elseif ($_POST['action'] === 'update_password') { + $new_password = $_POST['new_password'] ?? ''; + $confirm_password = $_POST['confirm_password'] ?? ''; + + if (strlen($new_password) < 8) { + $_SESSION['profile_message'] = 'رمز عبور جدید باید حداقل ۸ کاراکتر باشد.'; + $_SESSION['profile_message_type'] = 'danger'; + } elseif ($new_password !== $confirm_password) { + $_SESSION['profile_message'] = 'رمزهای عبور جدید با هم مطابقت ندارند.'; + $_SESSION['profile_message_type'] = 'danger'; + } elseif (!empty($new_password)) { + $hashed_password = password_hash($new_password, PASSWORD_DEFAULT); + $stmt = $pdo->prepare("UPDATE users SET password = ? WHERE id = ?"); + if ($stmt->execute([$hashed_password, $user_id])) { + $_SESSION['profile_message'] = 'رمز عبور شما با موفقیت تغییر کرد.'; + $_SESSION['profile_message_type'] = 'success'; + } else { + $_SESSION['profile_message'] = 'خطا در تغییر رمز عبور.'; + $_SESSION['profile_message_type'] = 'danger'; + } + } + header('Location: profile.php?page=account'); + exit; + } elseif ($_POST['action'] === 'add_address') { + $province = trim($_POST['province'] ?? ''); + $city = trim($_POST['city'] ?? ''); + $address_line = trim($_POST['address_line'] ?? ''); + $postal_code = trim($_POST['postal_code'] ?? ''); + $is_default = isset($_POST['is_default']); + + if (empty($province) || empty($city) || empty($address_line) || empty($postal_code)) { + $_SESSION['profile_message'] = 'لطفاً تمام فیلدهای آدرس را پر کنید.'; + $_SESSION['profile_message_type'] = 'danger'; + } else { + $pdo->beginTransaction(); + try { + if ($is_default) { + $stmt = $pdo->prepare("UPDATE user_addresses SET is_default = 0 WHERE user_id = ?"); + $stmt->execute([$user_id]); + } + $stmt = $pdo->prepare("INSERT INTO user_addresses (user_id, province, city, address_line, postal_code, is_default) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$user_id, $province, $city, $address_line, $postal_code, $is_default ? 1 : 0]); + $pdo->commit(); + $_SESSION['profile_message'] = 'آدرس جدید با موفقیت اضافه شد.'; + $_SESSION['profile_message_type'] = 'success'; + } catch (PDOException $e) { + $pdo->rollBack(); + $_SESSION['profile_message'] = 'خطا در افزودن آدرس.'; + $_SESSION['profile_message_type'] = 'danger'; + } + } + header('Location: profile.php?page=addresses'); + exit; + } elseif ($_POST['action'] === 'delete_address') { + $address_id = $_POST['address_id'] ?? 0; + $stmt = $pdo->prepare("DELETE FROM user_addresses WHERE id = ? AND user_id = ?"); + if ($stmt->execute([$address_id, $user_id])) { + $_SESSION['profile_message'] = 'آدرس با موفقیت حذف شد.'; + $_SESSION['profile_message_type'] = 'success'; + } else { + $_SESSION['profile_message'] = 'خطا در حذف آدرس.'; + $_SESSION['profile_message_type'] = 'danger'; + } + header('Location: profile.php?page=addresses'); + exit; + } elseif ($_POST['action'] === 'set_default_address') { + $address_id = $_POST['address_id'] ?? 0; + $pdo->beginTransaction(); + try { + $stmt1 = $pdo->prepare("UPDATE user_addresses SET is_default = 0 WHERE user_id = ?"); + $stmt1->execute([$user_id]); + $stmt2 = $pdo->prepare("UPDATE user_addresses SET is_default = 1 WHERE id = ? AND user_id = ?"); + $stmt2->execute([$address_id, $user_id]); + $pdo->commit(); + $_SESSION['profile_message'] = 'آدرس پیش‌فرض با موفقیت تغییر کرد.'; + $_SESSION['profile_message_type'] = 'success'; + } catch (PDOException $e) { + $pdo->rollBack(); + $_SESSION['profile_message'] = 'خطا در تغییر آدرس پیش‌فرض.'; + $_SESSION['profile_message_type'] = 'danger'; + } + header('Location: profile.php?page=addresses'); + exit; + } +} + +// Retrieve flash message +if (isset($_SESSION['profile_message'])) { + $flash_message = $_SESSION['profile_message']; + $flash_message_type = $_SESSION['profile_message_type']; + unset($_SESSION['profile_message']); + unset($_SESSION['profile_message_type']); +} + // Fetch user data $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$user_id]); @@ -26,177 +150,59 @@ $stmt_orders = $pdo->prepare("SELECT * FROM orders WHERE user_id = ? ORDER BY cr $stmt_orders->execute([$user_id]); $orders = $stmt_orders->fetchAll(PDO::FETCH_ASSOC); +// Calculate total purchase amount from COMPLETED orders +$total_purchase_amount = 0; +foreach ($orders as $order) { + if (strtolower($order['status']) === 'completed') { + $total_purchase_amount += $order['total_amount']; + } +} + + $page_title = 'حساب کاربری'; require_once 'includes/header.php'; ?> - +
- + -
-
- -
-

تاریخچه سفارشات

- -
شما هنوز هیچ سفارشی ثبت نکرده‌اید.
- -
- $order): ?> - ['label' => 'در انتظار پرداخت', 'color' => '#ffc107'], - 'processing' => ['label' => 'در حال پردازش', 'color' => '#0dcaf0'], - 'shipped' => ['label' => 'ارسال شده', 'color' => '#0d6efd'], - 'completed' => ['label' => 'تکمیل شده', 'color' => '#198754'], - 'cancelled' => ['label' => 'لغو شده', 'color' => '#dc3545'], - ]; - $status_info = $status_map[$order['status']] ?? ['label' => htmlspecialchars($order['status']), 'color' => '#6c757d']; - ?> -
-

- -

-
-
-
جزئیات سفارش
- -

کد رهگیری:

- +
+ + + + +
+

سلام، عزیز!

+

به پنل کاربری خود در [نام فروشگاه] خوش آمدید. از اینجا می‌توانید آخرین سفارشات خود را مشاهده کرده، اطلاعات حساب خود را مدیریت کنید و آدرس‌های خود را به‌روزرسانی نمایید.

+
+ + +
+
+
+ +
+ تعداد کل سفارشات + +
+
+
+
+
+ +
+ مجموع خرید شما + تومان +
+
+
+
- - - - - - - - - - - -
<?php echo htmlspecialchars($item['name']); ?> - - -
- - رنگ: - - - -
عدد تومان
-
+ +
+

تاریخچه سفارشات

+
+ +
شما هنوز هیچ سفارشی ثبت نکرده‌اید.
+ +
+ + + + + + + + + + + + + 'در انتظار پرداخت', + 'processing' => 'در حال پردازش', + 'shipped' => 'ارسال شده', + 'completed' => 'تکمیل شده', + 'cancelled' => 'لغو شده', + ]; + $order_status_lower = strtolower($order['status']); + $status_label = $status_map[$order_status_lower] ?? htmlspecialchars($order['status']); + $status_class = 'status-' . htmlspecialchars($order_status_lower); + ?> + + + + + + + + + +
شماره سفارشتاریخوضعیتمبلغ کلعملیات
# تومان + +
+
+ +
+
+ + +
+
+

آدرس‌های من

+ +
+
+
+
+ +
+
+ + +
+
+ + +
+
+ +
- +
+ + +
+
+ + +
+ +
- + + +
شما هنوز هیچ آدرسی ثبت نکرده‌اید.
+ +
+ +
+
+

+ + پیش‌فرض + +
+
+
+ + + +
+ +
+ + + +
+ +
+
+ +
+ +
- -
-

آدرس‌های من

- + +
+

جزئیات حساب

+
+
+ +
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
-
+ + +
صفحه مورد نظر یافت نشد.
+ + +
+
+ + + +
+
+ × +
+ + - +?> \ No newline at end of file diff --git a/shop.php b/shop.php index 67a16258..87edf58c 100644 --- a/shop.php +++ b/shop.php @@ -16,42 +16,50 @@ try { ?>
-
-

مجموعه کامل محصولات

-

دست‌سازه‌هایی از چرم طبیعی، با عشق و دقت.

+
+

مجموعه کامل محصولات

+

دست‌سازه‌هایی از چرم طبیعی، با عشق و دقت.

- +
-
- +
+

در حال حاضر محصولی برای نمایش وجود ندارد.

+
+ +
+ '; - echo '
'; - echo '
'; - echo ' '; - echo ' ' . htmlspecialchars($product['name']) . ''; - echo ' '; - echo '
'; - echo '
'; - echo '

' . htmlspecialchars($product['name']) . '

'; - echo '

' . number_format($product['price']) . ' تومان

'; - echo '
'; - echo '
'; - echo '
'; + foreach ($products as $product): + ?> +
+
+
+ + <?= htmlspecialchars($product['name']) ?> + +
+
+

+ + + +

+

تومان

+
+
+
+

در حال حاضر محصولی برای نمایش وجود ندارد.

'; - } - ?> -
+ endforeach; + ?> +
+ - \ No newline at end of file + diff --git a/terms.php b/terms.php new file mode 100644 index 00000000..1634996c --- /dev/null +++ b/terms.php @@ -0,0 +1,53 @@ + + +
+
+

قوانین و مقررات

+

لطفاً پیش از استفاده از خدمات ما، این موارد را به دقت مطالعه فرمایید.

+
+ +
+
+
+
+
+

۱. تعاریف و کلیات

+

لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می‌باشد. کتابهای زیادی در شصت و سه درصد گذشته، حال و آینده شناخت فراوان جامعه و متخصصان را می طلبد تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی و فرهنگ پیشرو در زبان فارسی ایجاد کرد.

+
+
+
+
+

۲. شرایط استفاده از حساب کاربری

+

کاربران متعهد می‌شوند که اطلاعات خود را به درستی وارد کرده و در حفظ امنیت حساب کاربری خود کوشا باشند. هرگونه فعالیت از طریق حساب کاربری، به منزله فعالیت شخص کاربر تلقی خواهد شد. در این صورت دنیای جدیدی از تحلیل‌های متنی و پردازش زبان طبیعی پدیدار خواهد شد.

+
+
+ +
+
+

۳. حریم خصوصی

+

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

+
+
+ +
+
+

۴. مالکیت معنوی

+

کلیه محتوای این وب‌سایت، از جمله متون، طرح‌ها، لوگوها و تصاویر، متعلق به فروشگاه آتیمه بوده و هرگونه کپی‌برداری و استفاده تجاری بدون کسب اجازه کتبی، پیگرد قانونی خواهد داشت.

+
+
+ +
+
+

۵. قوانین بازگشت کالا

+

رضایت شما اولویت ماست. شرایط بازگشت کالا و رویه‌های مربوط به آن به طور کامل در صفحه "سوالات متداول" شرح داده شده است. لطفاً پیش از خرید، این بخش را مطالعه فرمایید. کتابهای زیادی در شصت و سه درصد گذشته، حال و آینده شناخت فراوان جامعه و متخصصان را می طلبد.

+
+
+
+
+
+
+ + diff --git a/track_order.php b/track_order.php index ac25fc77..8a378a86 100644 --- a/track_order.php +++ b/track_order.php @@ -3,83 +3,77 @@ $page_title = "پیگیری سفارش"; include 'includes/header.php'; ?> +
+
+

پیگیری سفارش

+

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

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

پیگیری سفارش

-

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

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