Сначала добавьте категории!'; } // Проверка прав администратора if (!isset($_SESSION['isAdmin']) || $_SESSION['isAdmin'] !== true) { echo ""; exit(); } $db = Database::getInstance()->getConnection(); // Обработка действий $action = $_GET['action'] ?? 'dashboard'; $message = $_GET['message'] ?? ''; $error = $_GET['error'] ?? ''; // Обработка POST запросов - ДОБАВЛЕНО ПРОСТОЕ И РАБОТАЮЩЕЕ! if ($_SERVER['REQUEST_METHOD'] === 'POST') { $post_action = $_POST['action'] ?? ''; try { if ($post_action === 'add_category') { $name = trim($_POST['name'] ?? ''); $slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $name)); $parent_id = !empty($_POST['parent_id']) ? (int)$_POST['parent_id'] : NULL; $description = trim($_POST['description'] ?? ''); $sort_order = (int)($_POST['sort_order'] ?? 0); $is_active = isset($_POST['is_active']) ? 1 : 0; if (empty($name)) { throw new Exception('Название категории обязательно'); } $stmt = $db->prepare(" INSERT INTO categories (name, slug, parent_id, description, sort_order, is_active) VALUES (?, ?, ?, ?, ?, ?) "); $result = $stmt->execute([$name, $slug, $parent_id, $description, $sort_order, $is_active]); if ($result) { header('Location: admin_panel.php?action=categories&message=Категория+успешно+добавлена'); exit(); } } // ИСПРАВЬТЕ БЛОК edit_category или добавьте его если его нет: if ($post_action === 'edit_category' && isset($_POST['category_id'])) { $category_id = (int)$_POST['category_id']; $name = trim($_POST['name'] ?? ''); $parent_id = !empty($_POST['parent_id']) ? (int)$_POST['parent_id'] : NULL; $description = trim($_POST['description'] ?? ''); $sort_order = (int)($_POST['sort_order'] ?? 0); $is_active = isset($_POST['is_active']) ? 1 : 0; if (empty($name)) { throw new Exception('Название категории обязательно'); } $slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $name)); $stmt = $db->prepare(" UPDATE categories SET name = ?, slug = ?, parent_id = ?, description = ?, sort_order = ?, is_active = ?, updated_at = CURRENT_TIMESTAMP WHERE category_id = ? "); $stmt->execute([$name, $slug, $parent_id, $description, $sort_order, $is_active, $category_id]); header('Location: admin_panel.php?action=categories&message=Категория+обновлена'); exit(); } if ($post_action === 'add_product') { $name = trim($_POST['name'] ?? ''); $slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $name)); $category_id = (int)($_POST['category_id'] ?? 0); $description = trim($_POST['description'] ?? ''); $price = (float)($_POST['price'] ?? 0); $old_price = !empty($_POST['old_price']) ? (float)$_POST['old_price'] : NULL; $sku = trim($_POST['sku'] ?? ''); $stock_quantity = (int)($_POST['stock_quantity'] ?? 0); $is_available = isset($_POST['is_available']) ? 1 : 0; $is_featured = isset($_POST['is_featured']) ? 1 : 0; $image_url = trim($_POST['image_url'] ?? ''); $color = trim($_POST['color'] ?? ''); $material = trim($_POST['material'] ?? ''); $card_size = trim($_POST['card_size'] ?? 'small'); // ВАЖНО: Проверяем category_id if ($category_id <= 0) { $_SESSION['error'] = 'Выберите корректную категорию'; header('Location: admin_panel.php?action=add_product'); exit(); } // Проверяем существование категории $check_category = $db->prepare("SELECT COUNT(*) FROM categories WHERE category_id = ?"); $check_category->execute([$category_id]); if ($check_category->fetchColumn() == 0) { $_SESSION['error'] = 'Выбранная категория не существует'; header('Location: admin_panel.php?action=add_product'); exit(); } if (empty($name)) throw new Exception('Название товара обязательно'); if ($price <= 0) throw new Exception('Цена должна быть больше 0'); // Генерируем SKU если пустой if (empty($sku)) { $sku = 'PROD-' . strtoupper(substr(preg_replace('/[^a-z0-9]/i', '', $name), 0, 6)) . '-' . rand(100, 999); } $stmt = $db->prepare(" INSERT INTO products ( category_id, name, slug, description, price, old_price, sku, stock_quantity, is_available, is_featured, image_url, color, material, card_size ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "); $result = $stmt->execute([ $category_id, $name, $slug, $description, $price, $old_price, $sku, $stock_quantity, $is_available, $is_featured, $image_url, $color, $material, $card_size ]); if ($result) { $_SESSION['message'] = 'Товар успешно добавлен'; header('Location: admin_panel.php?action=products'); exit(); } } // ИСПРАВЛЕННЫЙ КОД для edit_product в admin_panel.php: if ($post_action === 'edit_product' && isset($_POST['product_id'])) { $product_id = (int)$_POST['product_id']; $name = trim($_POST['name'] ?? ''); $category_id = (int)($_POST['category_id'] ?? 1); // ПО УМОЛЧАНИЮ 1, чтобы избежать 0 $description = trim($_POST['description'] ?? ''); $price = (float)($_POST['price'] ?? 0); $old_price = !empty($_POST['old_price']) ? (float)$_POST['old_price'] : NULL; $stock_quantity = (int)($_POST['stock_quantity'] ?? 0); $is_available = isset($_POST['is_available']) ? 1 : 0; $image_url = trim($_POST['image_url'] ?? ''); $color = trim($_POST['color'] ?? ''); $material = trim($_POST['material'] ?? ''); // ВАЖНО: Проверяем category_id if ($category_id <= 0) { // Если category_id = 0, устанавливаем первую доступную категорию $firstCat = $db->query("SELECT category_id FROM categories LIMIT 1")->fetchColumn(); $category_id = $firstCat ?: 1; } $stmt = $db->prepare(" UPDATE products SET name = ?, category_id = ?, description = ?, price = ?, old_price = ?, stock_quantity = ?, is_available = ?, image_url = ?, color = ?, material = ?, updated_at = CURRENT_TIMESTAMP WHERE product_id = ? "); $stmt->execute([ $name, $category_id, $description, $price, $old_price, $stock_quantity, $is_available, $image_url, $color, $material, $product_id ]); header('Location: admin_panel.php?action=products&message=Товар+обновлен'); exit(); } if ($post_action === 'delete_category' && isset($_POST['category_id'])) { $categoryId = intval($_POST['category_id']); // 1. Проверяем, есть ли товары в этой категории $checkProducts = $db->prepare("SELECT COUNT(*) FROM products WHERE category_id = ?"); $checkProducts->execute([$categoryId]); $productCount = $checkProducts->fetchColumn(); // 2. Проверяем, есть ли дочерние категории $checkChildren = $db->prepare("SELECT COUNT(*) FROM categories WHERE parent_id = ?"); $checkChildren->execute([$categoryId]); $childCount = $checkChildren->fetchColumn(); if ($productCount > 0) { // Если есть товары, делаем категорию неактивной вместо удаления $stmt = $db->prepare("UPDATE categories SET is_active = FALSE WHERE category_id = ?"); $stmt->execute([$categoryId]); header('Location: admin_panel.php?action=categories&message=Категория+скрыта+(содержит+товары)'); exit(); } elseif ($childCount > 0) { // Если есть дочерние категории, делаем неактивной $stmt = $db->prepare("UPDATE categories SET is_active = FALSE WHERE category_id = ?"); $stmt->execute([$categoryId]); header('Location: admin_panel.php?action=categories&message=Категория+скрыта+(имеет+дочерние+категории)'); exit(); } else { // Если нет товаров и дочерних категорий, удаляем $stmt = $db->prepare("DELETE FROM categories WHERE category_id = ?"); $stmt->execute([$categoryId]); header('Location: admin_panel.php?action=categories&message=Категория+удалена'); exit(); } } } catch (PDOException $e) { header('Location: admin_panel.php?action=' . $action . '&error=' . urlencode('Ошибка БД: ' . $e->getMessage())); exit(); } catch (Exception $e) { header('Location: admin_panel.php?action=' . $action . '&error=' . urlencode($e->getMessage())); exit(); } } // Получение данных для отображения try { // Статистика $stats = [ 'total_products' => $db->query("SELECT COUNT(*) FROM products")->fetchColumn(), 'active_products' => $db->query("SELECT COUNT(*) FROM products WHERE is_available = TRUE")->fetchColumn(), 'total_orders' => $db->query("SELECT COUNT(*) FROM orders")->fetchColumn(), 'total_users' => $db->query("SELECT COUNT(*) FROM users")->fetchColumn(), 'revenue' => $db->query("SELECT COALESCE(SUM(final_amount), 0) FROM orders WHERE status = 'completed'")->fetchColumn() ]; // Получаем все категории $allCategories = $db->query("SELECT * FROM categories WHERE is_active = TRUE ORDER BY name")->fetchAll(); // Получаем родительские категории $parentCategories = $db->query("SELECT * FROM categories WHERE parent_id IS NULL AND is_active = TRUE ORDER BY name")->fetchAll(); switch ($action) { case 'products': $showAll = isset($_GET['show_all']) && $_GET['show_all'] == '1'; $sql = $showAll ? "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.category_id ORDER BY p.created_at DESC" : "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.category_id WHERE p.is_available = TRUE ORDER BY p.created_at DESC"; $data = $db->query($sql)->fetchAll(); break; case 'categories': $data = $db->query(" SELECT c1.*, c2.name as parent_name, (SELECT COUNT(*) FROM products p WHERE p.category_id = c1.category_id) as product_count FROM categories c1 LEFT JOIN categories c2 ON c1.parent_id = c2.category_id ORDER BY c1.sort_order, c1.name ")->fetchAll(); break; case 'orders': $data = $db->query(" SELECT o.*, u.email as user_email FROM orders o LEFT JOIN users u ON o.user_id = u.user_id ORDER BY o.created_at DESC LIMIT 50 ")->fetchAll(); break; case 'users': $data = $db->query("SELECT * FROM users ORDER BY created_at DESC LIMIT 50")->fetchAll(); break; case 'add_product': case 'edit_product': if ($action === 'edit_product' && isset($_GET['id'])) { $productId = (int)$_GET['id']; $stmt = $db->prepare("SELECT * FROM products WHERE product_id = ?"); $stmt->execute([$productId]); $edit_data = $stmt->fetch(); } break; case 'add_category': case 'edit_category': if ($action === 'edit_category' && isset($_GET['id'])) { $categoryId = (int)$_GET['id']; $stmt = $db->prepare("SELECT * FROM categories WHERE category_id = ?"); $stmt->execute([$categoryId]); $edit_data = $stmt->fetch(); } break; } } catch (PDOException $e) { $error = "Ошибка базы данных: " . $e->getMessage(); } ?>
Всего товаров
Активных товаров
Заказов
Пользователей
| ID | Название | Slug | Родительская | Товаров | Действия |
|---|---|---|---|---|---|
| = $category['category_id'] ?> | = htmlspecialchars($category['name']) ?> | = htmlspecialchars($category['slug']) ?> | = htmlspecialchars($category['parent_name'] ?? '—') ?> | = $category['product_count'] ?> | Редактировать |
| ID | ФИО | Дата регистрации | Статус | |
|---|---|---|---|---|
| = $user['user_id'] ?> | = htmlspecialchars($user['email']) ?> | = htmlspecialchars($user['full_name']) ?> | = date('d.m.Y', strtotime($user['created_at'])) ?> | ✓ Активен ✗ Неактивен |