Devco1
Home
Console
Upload
New File
New Folder
Tools
Info
About
/
home
/
wifiyecu
/
www
/
admin
/
Filename :
edit_product.php
back
Copy
<?php session_start(); include '../includes/config.php'; // التحقق من صلاحيات المدير if (!isset($_SESSION['admin_logged_in'])) { header('Location: login.php'); exit; } if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { header('Location: products.php'); exit; } $product_id = intval($_GET['id']); // الحصول على بيانات المنتج الحالية try { $stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?"); $stmt->execute([$product_id]); $product = $stmt->fetch(); if (!$product) { $_SESSION['message'] = [ 'text' => 'المنتج غير موجود', 'type' => 'danger' ]; header('Location: products.php'); exit; } // الحصول على صور المنتج $images_stmt = $pdo->prepare("SELECT * FROM product_images WHERE product_id = ? ORDER BY is_main DESC"); $images_stmt->execute([$product_id]); $product_images = $images_stmt->fetchAll(); // الحصول على ألوان المنتج $colors_stmt = $pdo->prepare("SELECT * FROM colors WHERE product_id = ?"); $colors_stmt->execute([$product_id]); $product_colors = $colors_stmt->fetchAll(); } catch (PDOException $e) { die("خطأ في تحميل بيانات المنتج: " . $e->getMessage()); } // معالجة تحديث المنتج if ($_SERVER['REQUEST_METHOD'] === 'POST') { $name = trim($_POST['name']); $description = trim($_POST['description']); $price = floatval($_POST['price']); $old_price = !empty($_POST['old_price']) ? floatval($_POST['old_price']) : null; $brand = trim($_POST['brand']); $stock_quantity = intval($_POST['stock_quantity']); $errors = []; // التحقق من البيانات if (empty($name)) { $errors[] = 'اسم المنتج مطلوب'; } if ($price <= 0) { $errors[] = 'السعر يجب أن يكون أكبر من صفر'; } if ($stock_quantity < 0) { $errors[] = 'الكمية لا يمكن أن تكون سالبة'; } if (empty($errors)) { try { $pdo->beginTransaction(); // تحديث بيانات المنتج $update_stmt = $pdo->prepare(" UPDATE products SET name = ?, description = ?, price = ?, old_price = ?, brand = ?, stock_quantity = ?, updated_at = NOW() WHERE id = ? "); $update_stmt->execute([$name, $description, $price, $old_price, $brand, $stock_quantity, $product_id]); // معالجة الصور الجديدة if (!empty($_FILES['new_images']['name'][0])) { $upload_dir = '../uploads/products/'; if (!is_dir($upload_dir)) { mkdir($upload_dir, 0777, true); } foreach ($_FILES['new_images']['tmp_name'] as $key => $tmp_name) { if ($_FILES['new_images']['error'][$key] === UPLOAD_ERR_OK) { $file_name = time() . '_' . uniqid() . '_' . basename($_FILES['new_images']['name'][$key]); $file_path = $upload_dir . $file_name; if (move_uploaded_file($tmp_name, $file_path)) { $image_url = 'uploads/products/' . $file_name; $image_stmt = $pdo->prepare(" INSERT INTO product_images (product_id, image_url, is_main) VALUES (?, ?, ?) "); // إذا كانت هذه أول صورة مضافة، اجعلها رئيسية إذا لم تكن هناك صور أخرى $is_main = (empty($product_images) && $key === 0) ? 1 : 0; $image_stmt->execute([$product_id, $image_url, $is_main]); } } } } // معالجة الصور الرئيسية if (isset($_POST['main_image'])) { $main_image_id = intval($_POST['main_image']); // إلغاء الصور الرئيسية الحالية $reset_stmt = $pdo->prepare("UPDATE product_images SET is_main = 0 WHERE product_id = ?"); $reset_stmt->execute([$product_id]); // تعيين الصورة الرئيسية الجديدة $main_stmt = $pdo->prepare("UPDATE product_images SET is_main = 1 WHERE id = ? AND product_id = ?"); $main_stmt->execute([$main_image_id, $product_id]); } // معالجة حذف الصور if (isset($_POST['delete_images'])) { foreach ($_POST['delete_images'] as $image_id) { $image_id = intval($image_id); // الحصول على مسار الصورة لحذفها من السيرفر $img_stmt = $pdo->prepare("SELECT image_url FROM product_images WHERE id = ?"); $img_stmt->execute([$image_id]); $image = $img_stmt->fetch(); if ($image) { // حذف الملف من السيرفر $file_path = '../' . $image['image_url']; if (file_exists($file_path)) { unlink($file_path); } // حذف من قاعدة البيانات $delete_stmt = $pdo->prepare("DELETE FROM product_images WHERE id = ?"); $delete_stmt->execute([$image_id]); } } } // معالجة الألوان // حذف الألوان الحالية أولاً $delete_colors_stmt = $pdo->prepare("DELETE FROM colors WHERE product_id = ?"); $delete_colors_stmt->execute([$product_id]); // إضافة الألوان الجديدة if (!empty($_POST['colors'])) { foreach ($_POST['colors'] as $color) { if (!empty($color['name']) && !empty($color['code'])) { $color_stmt = $pdo->prepare(" INSERT INTO colors (product_id, color_name, color_code) VALUES (?, ?, ?) "); $color_stmt->execute([$product_id, $color['name'], $color['code']]); } } } $pdo->commit(); $_SESSION['message'] = [ 'text' => 'تم تحديث المنتج بنجاح', 'type' => 'success' ]; header('Location: products.php'); exit; } catch (PDOException $e) { $pdo->rollBack(); $errors[] = "خطأ في تحديث المنتج: " . $e->getMessage(); } } } // إعادة تحميل البيانات بعد التحديث try { $stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?"); $stmt->execute([$product_id]); $product = $stmt->fetch(); $images_stmt = $pdo->prepare("SELECT * FROM product_images WHERE product_id = ? ORDER BY is_main DESC"); $images_stmt->execute([$product_id]); $product_images = $images_stmt->fetchAll(); $colors_stmt = $pdo->prepare("SELECT * FROM colors WHERE product_id = ?"); $colors_stmt->execute([$product_id]); $product_colors = $colors_stmt->fetchAll(); } catch (PDOException $e) { die("خطأ في تحميل بيانات المنتج: " . $e->getMessage()); } ?> <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>تعديل المنتج - لوحة التحكم</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <style> .image-preview { width: 150px; height: 150px; object-fit: cover; border-radius: 8px; margin: 5px; border: 2px solid #dee2e6; } .image-preview.main { border-color: #007bff; border-width: 3px; } .color-preview { width: 30px; height: 30px; border-radius: 50%; display: inline-block; margin-left: 10px; border: 2px solid #fff; box-shadow: 0 0 3px rgba(0,0,0,0.3); } .image-item { position: relative; display: inline-block; margin: 10px; } .image-actions { position: absolute; top: 5px; left: 5px; } .color-item { background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 10px; border-right: 4px solid #007bff; } .main-image-badge { position: absolute; top: 5px; right: 5px; background: #007bff; color: white; padding: 2px 8px; border-radius: 4px; font-size: 0.8rem; } .section-title { border-bottom: 2px solid #007bff; padding-bottom: 10px; margin-bottom: 20px; color: #333; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="index.php"> <i class="fas fa-cog"></i> لوحة التحكم </a> <div class="navbar-nav ms-auto"> <a class="nav-link" href="products.php"> <i class="fas fa-arrow-right me-1"></i> رجوع للمنتجات </a> </div> </div> </nav> <div class="container mt-4"> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-header bg-warning text-dark"> <h4 class="card-title mb-0"> <i class="fas fa-edit me-2"></i> تعديل المنتج: <?php echo htmlspecialchars($product['name']); ?> </h4> </div> <div class="card-body"> <?php if (!empty($errors)): ?> <div class="alert alert-danger"> <h6>يوجد الأخطاء التالية:</h6> <ul class="mb-0"> <?php foreach ($errors as $error): ?> <li><?php echo $error; ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> <form method="POST" enctype="multipart/form-data"> <!-- المعلومات الأساسية --> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-info-circle me-2"></i> المعلومات الأساسية </h5> </div> <div class="col-md-6 mb-3"> <label for="name" class="form-label">اسم المنتج *</label> <input type="text" class="form-control" id="name" name="name" value="<?php echo htmlspecialchars($product['name']); ?>" required> </div> <div class="col-md-6 mb-3"> <label for="brand" class="form-label">الماركة</label> <input type="text" class="form-control" id="brand" name="brand" value="<?php echo htmlspecialchars($product['brand']); ?>"> </div> <div class="col-12 mb-3"> <label for="description" class="form-label">الوصف</label> <textarea class="form-control" id="description" name="description" rows="4"><?php echo htmlspecialchars($product['description']); ?></textarea> </div> </div> <!-- الأسعار والمخزون --> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-tag me-2"></i> الأسعار والمخزون </h5> </div> <div class="col-md-4 mb-3"> <label for="price" class="form-label">السعر الحالي *</label> <div class="input-group"> <span class="input-group-text">$</span> <input type="number" class="form-control" id="price" name="price" step="0.01" min="0" value="<?php echo $product['price']; ?>" required> </div> </div> <div class="col-md-4 mb-3"> <label for="old_price" class="form-label">السعر القديم</label> <div class="input-group"> <span class="input-group-text">$</span> <input type="number" class="form-control" id="old_price" name="old_price" step="0.01" min="0" value="<?php echo $product['old_price']; ?>"> </div> </div> <div class="col-md-4 mb-3"> <label for="stock_quantity" class="form-label">الكمية في المخزون *</label> <input type="number" class="form-control" id="stock_quantity" name="stock_quantity" min="0" value="<?php echo $product['stock_quantity']; ?>" required> </div> <div class="col-12"> <div class="card bg-light"> <div class="card-body"> <div id="discountPreview" class="text-center"> <?php if ($product['old_price'] && $product['old_price'] > $product['price']) { $discount = round((($product['old_price'] - $product['price']) / $product['old_price']) * 100); echo "<span class='badge bg-success fs-6'>خصم فعال: $discount%</span>"; } else { echo "<span class='text-muted'>لا يوجد خصم حالياً</span>"; } ?> </div> </div> </div> </div> </div> <!-- الصور الحالية --> <?php if (!empty($product_images)): ?> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-images me-2"></i> الصور الحالية </h5> <div class="mb-3"> <label class="form-label">اختر الصورة الرئيسية:</label> <div class="d-flex flex-wrap"> <?php foreach ($product_images as $image): ?> <div class="image-item"> <img src="../<?php echo $image['image_url']; ?>" alt="صورة المنتج" class="image-preview <?php echo $image['is_main'] ? 'main' : ''; ?>"> <?php if ($image['is_main']): ?> <span class="main-image-badge">رئيسية</span> <?php endif; ?> <div class="image-actions"> <div class="form-check"> <input class="form-check-input" type="radio" name="main_image" value="<?php echo $image['id']; ?>" id="main_image_<?php echo $image['id']; ?>" <?php echo $image['is_main'] ? 'checked' : ''; ?>> <label class="form-check-label text-white" for="main_image_<?php echo $image['id']; ?>"> رئيسية </label> </div> <div class="form-check mt-1"> <input class="form-check-input" type="checkbox" name="delete_images[]" value="<?php echo $image['id']; ?>" id="delete_image_<?php echo $image['id']; ?>"> <label class="form-check-label text-white" for="delete_image_<?php echo $image['id']; ?>"> حذف </label> </div> </div> </div> <?php endforeach; ?> </div> </div> </div> </div> <?php endif; ?> <!-- إضافة صور جديدة --> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-plus-circle me-2"></i> إضافة صور جديدة </h5> <div class="mb-3"> <label for="new_images" class="form-label">اختر الصور الجديدة</label> <input type="file" class="form-control" id="new_images" name="new_images[]" multiple accept="image/*"> <div class="form-text">يمكنك اختيار أكثر من صورة. سيتم اعتبار أول صورة كصورة رئيسية إذا لم تكن هناك صور حالية.</div> </div> <div id="newImagesPreview" class="d-flex flex-wrap"></div> </div> </div> <!-- الألوان --> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-palette me-2"></i> الألوان المتاحة </h5> <div id="colorsContainer"> <?php if (!empty($product_colors)): ?> <?php foreach ($product_colors as $index => $color): ?> <div class="color-item row g-2 mb-2"> <div class="col-md-5"> <input type="text" class="form-control" name="colors[<?php echo $index; ?>][name]" placeholder="اسم اللون" value="<?php echo htmlspecialchars($color['color_name']); ?>"> </div> <div class="col-md-5"> <input type="color" class="form-control" name="colors[<?php echo $index; ?>][code]" value="<?php echo htmlspecialchars($color['color_code']); ?>"> </div> <div class="col-md-2"> <button type="button" class="btn btn-danger w-100 remove-color"> <i class="fas fa-times"></i> </button> </div> </div> <?php endforeach; ?> <?php else: ?> <div class="color-item row g-2 mb-2"> <div class="col-md-5"> <input type="text" class="form-control" name="colors[0][name]" placeholder="اسم اللون"> </div> <div class="col-md-5"> <input type="color" class="form-control" name="colors[0][code]" value="#007bff"> </div> <div class="col-md-2"> <button type="button" class="btn btn-danger w-100 remove-color" disabled> <i class="fas fa-times"></i> </button> </div> </div> <?php endif; ?> </div> <button type="button" class="btn btn-outline-primary btn-sm" id="addColor"> <i class="fas fa-plus me-1"></i> إضافة لون </button> </div> </div> <!-- معلومات إضافية --> <div class="row mb-4"> <div class="col-12"> <h5 class="section-title"> <i class="fas fa-chart-bar me-2"></i> معلومات إضافية </h5> <div class="row"> <div class="col-md-4"> <div class="card bg-light"> <div class="card-body text-center"> <h6>تاريخ الإضافة</h6> <p class="mb-0"><?php echo date('Y-m-d', strtotime($product['created_at'])); ?></p> </div> </div> </div> <div class="col-md-4"> <div class="card bg-light"> <div class="card-body text-center"> <h6>آخر تحديث</h6> <p class="mb-0"><?php echo date('Y-m-d H:i', strtotime($product['updated_at'])); ?></p> </div> </div> </div> <div class="col-md-4"> <div class="card bg-light"> <div class="card-body text-center"> <h6>حالة المنتج</h6> <p class="mb-0"> <span class="badge bg-<?php echo $product['stock_quantity'] > 0 ? 'success' : 'danger'; ?>"> <?php echo $product['stock_quantity'] > 0 ? 'متوفر' : 'غير متوفر'; ?> </span> </p> </div> </div> </div> </div> </div> </div> <!-- أزرار --> <div class="row"> <div class="col-12"> <div class="d-flex gap-2 justify-content-end"> <button type="submit" class="btn btn-success btn-lg"> <i class="fas fa-save me-2"></i> حفظ التعديلات </button> <a href="products.php" class="btn btn-secondary btn-lg"> <i class="fas fa-times me-2"></i> إلغاء </a> <a href="product_preview.php?id=<?php echo $product_id; ?>" target="_blank" class="btn btn-info btn-lg"> <i class="fas fa-eye me-2"></i> معاينة </a> </div> </div> </div> </form> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script> let colorIndex = <?php echo !empty($product_colors) ? count($product_colors) : 1; ?>; // معاينة الصور الجديدة document.getElementById('new_images').addEventListener('change', function(e) { const preview = document.getElementById('newImagesPreview'); preview.innerHTML = ''; for (let file of e.target.files) { if (file.type.startsWith('image/')) { const reader = new FileReader(); reader.onload = function(e) { const img = document.createElement('img'); img.src = e.target.result; img.className = 'image-preview'; preview.appendChild(img); } reader.readAsDataURL(file); } } }); // إدارة الألوان document.getElementById('addColor').addEventListener('click', function() { const container = document.getElementById('colorsContainer'); const colorItem = document.createElement('div'); colorItem.className = 'color-item row g-2 mb-2'; colorItem.innerHTML = ` <div class="col-md-5"> <input type="text" class="form-control" name="colors[${colorIndex}][name]" placeholder="اسم اللون"> </div> <div class="col-md-5"> <input type="color" class="form-control" name="colors[${colorIndex}][code]" value="#007bff"> </div> <div class="col-md-2"> <button type="button" class="btn btn-danger w-100 remove-color"> <i class="fas fa-times"></i> </button> </div> `; container.appendChild(colorItem); colorIndex++; // تفعيل أزرار الحذف للألوان القديمة document.querySelectorAll('.remove-color').forEach(btn => { btn.disabled = false; }); }); // حذف الألوان document.addEventListener('click', function(e) { if (e.target.classList.contains('remove-color') || e.target.closest('.remove-color')) { const btn = e.target.classList.contains('remove-color') ? e.target : e.target.closest('.remove-color'); if (document.querySelectorAll('.color-item').length > 1) { btn.closest('.color-item').remove(); } } }); // حساب الخصم تلقائياً document.getElementById('price').addEventListener('input', calculateDiscount); document.getElementById('old_price').addEventListener('input', calculateDiscount); function calculateDiscount() { const price = parseFloat(document.getElementById('price').value) || 0; const oldPrice = parseFloat(document.getElementById('old_price').value) || 0; const discountPreview = document.getElementById('discountPreview'); if (oldPrice > price && oldPrice > 0) { const discount = Math.round(((oldPrice - price) / oldPrice) * 100); discountPreview.innerHTML = `<span class="badge bg-success fs-6">خصم فعال: ${discount}%</span>`; } else { discountPreview.innerHTML = `<span class="text-muted">لا يوجد خصم حالياً</span>`; } } // تأكيد قبل الحذف document.querySelector('form').addEventListener('submit', function(e) { const deleteCheckboxes = document.querySelectorAll('input[name="delete_images[]"]:checked'); if (deleteCheckboxes.length > 0) { if (!confirm(`هل أنت متأكد من حذف ${deleteCheckboxes.length} صورة؟ هذا الإجراء لا يمكن التراجع عنه.`)) { e.preventDefault(); } } }); // تحديث واجهة الصور الرئيسية document.querySelectorAll('input[name="main_image"]').forEach(radio => { radio.addEventListener('change', function() { document.querySelectorAll('.image-preview').forEach(img => { img.classList.remove('main'); }); if (this.checked) { this.closest('.image-item').querySelector('.image-preview').classList.add('main'); } }); }); </script> </body> </html>