Сначала добавьте категории!'; } // Проверка прав администратора 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(); } ?> AETERNA - Админ-панель

Админ-панель AETERNA

В каталог Выйти
Дашборд Товары Категории Заказы Пользователи

Статистика

Всего товаров

Активных товаров

Заказов

Пользователей

Добавить новый товар Добавить категорию

Управление товарами

Добавить товар Только активные Показать все
ID Название Категория Цена На складе Статус Действия
0): ?> ✓ Доступен ✗ Недоступен ⚠ Нет на складе

Управление категориями

Добавить категорию
ID Название Slug Родительская Товаров Действия
Редактировать

Отмена

Отмена

Заказы

№ заказа Клиент Сумма Статус Дата Действия

Пользователи

ID Email ФИО Дата регистрации Статус
✓ Активен ✗ Неактивен