getConnection();
// ОБРАБОТКА POST ЗАПРОСОВ ДЛЯ КАТЕГОРИЙ
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $is_admin) {
$form_action = $_POST['action'] ?? '';
if ($form_action === 'add_category' || $form_action === 'edit_category') {
$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;
$category_id_post = (int)($_POST['category_id'] ?? 0);
// Валидация
if (empty($name)) {
$_SESSION['error'] = 'Название категории обязательно';
header('Location: catalog_admin.php?action=' . $form_action . ($category_id_post ? '&id=' . $category_id_post : ''));
exit();
}
// Создаем slug
$slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $name));
$slug = preg_replace('/^-+|-+$/', '', $slug); // Убираем дефисы по краям
if ($form_action === 'add_category') {
// Проверяем существование slug
$check = $db->prepare("SELECT COUNT(*) FROM categories WHERE slug = ?");
$check->execute([$slug]);
if ($check->fetchColumn() > 0) {
$slug = $slug . '-' . time(); // Добавляем timestamp для уникальности
}
$sql = "INSERT INTO categories (name, slug, parent_id, description, sort_order, is_active)
VALUES (?, ?, ?, ?, ?, ?)";
$stmt = $db->prepare($sql);
$stmt->execute([$name, $slug, $parent_id, $description, $sort_order, $is_active]);
$_SESSION['message'] = 'Категория успешно добавлена';
header('Location: catalog_admin.php?action=categories');
exit();
} elseif ($form_action === 'edit_category' && $category_id_post > 0) {
// Проверяем существование slug для других категорий
$check = $db->prepare("SELECT COUNT(*) FROM categories WHERE slug = ? AND category_id != ?");
$check->execute([$slug, $category_id_post]);
if ($check->fetchColumn() > 0) {
$slug = $slug . '-' . $category_id_post;
}
$sql = "UPDATE categories SET
name = ?, slug = ?, parent_id = ?, description = ?,
sort_order = ?, is_active = ?, updated_at = CURRENT_TIMESTAMP
WHERE category_id = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$name, $slug, $parent_id, $description, $sort_order, $is_active, $category_id_post]);
$_SESSION['message'] = 'Категория успешно обновлена';
header('Location: catalog_admin.php?action=categories');
exit();
}
}
// Удаление категории
if ($form_action === 'delete_category') {
$category_id_del = (int)($_POST['category_id'] ?? 0);
if ($category_id_del > 0) {
// Проверяем наличие активных товаров
$check_products = $db->prepare("
SELECT COUNT(*) as product_count
FROM products
WHERE category_id = ? AND is_available = TRUE
");
$check_products->execute([$category_id_del]);
$active_products = $check_products->fetchColumn();
if ($active_products > 0) {
$_SESSION['error'] = 'Невозможно удалить категорию с активными товарами';
header('Location: catalog_admin.php?action=categories');
exit();
}
// Проверяем дочерние категории
$check_children = $db->prepare("
SELECT COUNT(*) as child_count
FROM categories
WHERE parent_id = ? AND is_active = TRUE
");
$check_children->execute([$category_id_del]);
$active_children = $check_children->fetchColumn();
if ($active_children > 0) {
$_SESSION['error'] = 'Невозможно удалить категорию с активными дочерними категориями';
header('Location: catalog_admin.php?action=categories');
exit();
}
// Удаляем категорию
$stmt = $db->prepare("DELETE FROM categories WHERE category_id = ?");
$stmt->execute([$category_id_del]);
$_SESSION['message'] = 'Категория успешно удалена';
header('Location: catalog_admin.php?action=categories');
exit();
}
}
}
// Получаем категории для отображения
$categories_stmt = $db->query("
SELECT c1.*, c2.name as parent_name,
(SELECT COUNT(*) FROM products WHERE 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
");
$categories = $categories_stmt->fetchAll();
// Для редактирования категории
if ($action === 'edit_category' && $product_id > 0) {
$cat_stmt = $db->prepare("SELECT * FROM categories WHERE category_id = ?");
$cat_stmt->execute([$product_id]);
$current_category = $cat_stmt->fetch();
if (!$current_category) {
$_SESSION['error'] = 'Категория не найдена';
header('Location: catalog_admin.php?action=categories');
exit();
}
}
// Получаем товары
$sql = "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";
$params = [];
if ($category_id && is_numeric($category_id)) {
$sql .= " AND p.category_id = ?";
$params[] = $category_id;
}
$sql .= " ORDER BY p.product_id DESC";
if ($params) {
$stmt = $db->prepare($sql);
$stmt->execute($params);
} else {
$stmt = $db->query($sql);
}
$products = $stmt->fetchAll();
// Сообщения из сессии
$message = $_SESSION['message'] ?? '';
$error = $_SESSION['error'] ?? '';
// Очищаем сообщения после использования
unset($_SESSION['message']);
unset($_SESSION['error']);
} catch (PDOException $e) {
$error = "Ошибка подключения к базе данных: " . $e->getMessage();
}
?>
AETERNA - Каталог
= htmlspecialchars($message) ?>
= htmlspecialchars($error) ?>
| ID |
Название |
Родительская |
Товаров |
Порядок |
Статус |
Действия |
| = $cat['category_id'] ?> |
= htmlspecialchars($cat['name']) ?>
= htmlspecialchars($cat['slug']) ?>
|
= htmlspecialchars($cat['parent_name'] ?? '—') ?> |
= $cat['product_count'] ?> товаров
|
= $cat['sort_order'] ?> |
Активна
Неактивна
|
|
![<?= htmlspecialchars($product['name']) ?>](<?= htmlspecialchars($product['image_url'] ?: 'img1/default.jpg') ?>)
$product['price']): ?>
-= round(($product['old_price'] - $product['price']) / $product['old_price'] * 100) ?>%
= htmlspecialchars($product['name']) ?>
= htmlspecialchars(mb_substr($product['description'], 0, 100)) ?>...
$product['price']): ?>
= number_format($product['old_price'], 0, '', ' ') ?> ₽
= number_format($product['price'], 0, '', ' ') ?> ₽
В наличии: = $product['stock_quantity'] ?> шт.