Files
web_work/catalog.php
2025-12-16 01:28:06 +03:00

1382 lines
55 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
session_start();
require_once 'config/database.php';
// СТРОГАЯ ПРОВЕРКА - НЕ ПУСКАЕМ БЕЗ АВТОРИЗАЦИИ
if (!isset($_SESSION['isLoggedIn']) || $_SESSION['isLoggedIn'] !== true) {
header('Location: вход.php?error=auth_required&redirect=' . urlencode($_SERVER['REQUEST_URI']));
exit();
}
$db = Database::getInstance()->getConnection();
// Получаем параметры фильтрации
$category_id = $_GET['category'] ?? 0;
$search = $_GET['search'] ?? '';
$min_price = $_GET['min_price'] ?? 0;
$max_price = $_GET['max_price'] ?? 1000000;
$colors = isset($_GET['colors']) ? (array)$_GET['colors'] : [];
$materials = isset($_GET['materials']) ? (array)$_GET['materials'] : [];
$show_all = isset($_GET['show_all']) && $_GET['show_all'] == '1';
// Проверяем уведомления
$success_message = $_GET['success'] ?? '';
$error_message = $_GET['error'] ?? '';
try {
// Получаем информацию о пользователе
$user_id = $_SESSION['user_id'] ?? 0;
$userStmt = $db->prepare("SELECT * FROM users WHERE user_id = ?");
$userStmt->execute([$user_id]);
$user = $userStmt->fetch();
$isAdmin = isset($_SESSION['isAdmin']) && $_SESSION['isAdmin'] === true;
$userEmail = $_SESSION['user_email'] ?? '';
$fullName = $_SESSION['full_name'] ?? $userEmail;
$loginTime = $_SESSION['login_time'] ?? time();
// Получаем категории (ИСПРАВЛЕНО: убрано дублирование fetchAll)
try {
$categoriesStmt = $db->prepare("
SELECT * FROM categories
WHERE is_active = TRUE
ORDER BY sort_order, name
");
$categoriesStmt->execute();
$categories = $categoriesStmt->fetchAll();
} catch (PDOException $e) {
$categories = [];
error_log("Ошибка получения категорий: " . $e->getMessage());
}
// Получаем подкатегории для текущей категории (если выбрана)
$subcategories = [];
if ($category_id > 0) {
$subStmt = $db->prepare("
SELECT * FROM subcategories
WHERE category_id = ? AND is_active = TRUE
ORDER BY sort_order, name
");
$subStmt->execute([$category_id]);
$subcategories = $subStmt->fetchAll();
}
// Проверяем наличие столбцов color и material в таблице products
$checkColumns = $db->query("
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'products'
AND column_name IN ('color', 'material')
");
$existingColumns = $checkColumns->fetchAll(PDO::FETCH_COLUMN);
$hasColorColumn = in_array('color', $existingColumns);
$hasMaterialColumn = in_array('material', $existingColumns);
// Получаем доступные цвета из базы данных (если столбец существует)
$availableColors = [];
if ($hasColorColumn) {
$colorsStmt = $db->query("
SELECT DISTINCT color FROM products
WHERE color IS NOT NULL AND color != '' AND is_available = TRUE
ORDER BY color
");
$availableColors = $colorsStmt->fetchAll(PDO::FETCH_COLUMN);
}
// Получаем доступные материалы из базы данных (если столбец существует)
$availableMaterials = [];
if ($hasMaterialColumn) {
$materialsStmt = $db->query("
SELECT DISTINCT material FROM products
WHERE material IS NOT NULL AND material != '' AND is_available = TRUE
ORDER BY material
");
$availableMaterials = $materialsStmt->fetchAll(PDO::FETCH_COLUMN);
}
// Получаем ВСЕ товары ИЗ БАЗЫ ДАННЫХ с фильтрами
$sql = "SELECT p.*, c.name as category_name
FROM products p
LEFT JOIN categories c ON p.category_id = c.category_id
WHERE 1=1";
$params = [];
$hasFilters = false;
// Фильтрация по доступности (если не админ и не показываем все)
if (!$show_all && !$isAdmin) {
$sql .= " AND p.is_available = TRUE";
}
// Фильтрация по категории
if ($category_id > 0) {
$sql .= " AND p.category_id = ?";
$params[] = $category_id;
$hasFilters = true;
}
// Фильтрация по цене
if ($min_price > 0 || $max_price < 1000000) {
$sql .= " AND p.price BETWEEN ? AND ?";
$params[] = $min_price;
$params[] = $max_price;
$hasFilters = true;
}
// Фильтрация по цвету
if ($hasColorColumn && !empty($colors)) {
$placeholders = implode(',', array_fill(0, count($colors), '?'));
$sql .= " AND p.color IN ($placeholders)";
$params = array_merge($params, $colors);
$hasFilters = true;
}
// Фильтрация по материалу
if ($hasMaterialColumn && !empty($materials)) {
$placeholders = implode(',', array_fill(0, count($materials), '?'));
$sql .= " AND p.material IN ($placeholders)";
$params = array_merge($params, $materials);
$hasFilters = true;
}
// Поиск
if (!empty($search)) {
$sql .= " AND (p.name LIKE ? OR p.description LIKE ?)";
$params[] = "%$search%";
$params[] = "%$search%";
$hasFilters = true;
}
// Получаем товары из базы данных с фильтрами
$sql = "SELECT p.*, c.name as category_name
FROM products p
LEFT JOIN categories c ON p.category_id = c.category_id
WHERE 1=1";
$params = [];
// Фильтрация по доступности
if (!$show_all && !$isAdmin) {
$sql .= " AND p.is_available = TRUE";
}
// Фильтрация по категории
if ($category_id > 0) {
$sql .= " AND p.category_id = ?";
$params[] = $category_id;
}
// Фильтрация по цене
if ($min_price > 0 || $max_price < 1000000) {
$sql .= " AND p.price BETWEEN ? AND ?";
$params[] = $min_price;
$params[] = $max_price;
}
// Поиск
if (!empty($search)) {
$sql .= " AND (p.name LIKE ? OR p.description LIKE ?)";
$params[] = "%$search%";
$params[] = "%$search%";
}
$sql .= " ORDER BY p.product_id ASC LIMIT 9"; // Ограничиваем 9 товаров
$stmt = $db->prepare($sql);
$stmt->execute($params);
$filteredProducts = $stmt->fetchAll();
// Оригинальные размеры для первых 9 товаров (ID 1-9)
$originalSizes = [
1 => 'small', // Светильник MINNIGHT
2 => 'large', // Диван MODERN (Кровать MODER)
3 => 'tall align-right', // Торшер MARCIA
4 => 'wide', // Светильник POLET
5 => 'small1', // Стол NORD
6 => 'wide2', // Диван ROYALTY
7 => 'wide3', // Кресло MINIMAL
8 => 'wide2_1', // Стол LONKI
9 => 'full-width' // Диван HEMMINS
];
// Классы для изображений
$imgClasses = ['small1', 'wide2', 'wide3', 'wide2_1'];
} catch (PDOException $e) {
die("Ошибка базы данных: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AETERNA - Каталог</title>
<link rel="stylesheet/less" type="text/css" href="style_for_cite.less">
<script src="https://cdn.jsdelivr.net/npm/less"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
/* В стилях для catalog.php добавьте: */
.catalog-dropdown__menu {
max-height: 400px;
overflow-y: auto;
width: 250px;
background: white;
border-radius: 8px;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.catalog-dropdown__menu ul {
padding: 10px 0;
}
.catalog-dropdown__menu li {
padding: 8px 15px;
transition: all 0.3s ease;
}
.catalog-dropdown__menu li:hover {
background: #f5f5f5;
}
.catalog-dropdown__menu a {
color: #333;
display: block;
text-decoration: none;
}
.catalog-dropdown__menu a:hover {
color: #453227;
}
/* СТИЛИ ТОЧНО КАК В HTML МАКЕТЕ */
.user-profile-dropdown {
position: relative;
display: inline-block;
}
.user-profile-toggle {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
padding: 8px 12px;
border-radius: 4px;
transition: all 0.3s ease;
}
.user-profile-toggle:hover {
background-color: rgba(0, 0, 0, 0.05);
}
.user-avatar {
width: 36px;
height: 36px;
border-radius: 50%;
background: linear-gradient(135deg, #617365 0%, #453227 100%);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 16px;
}
.user-info {
display: flex;
flex-direction: column;
}
.user-email {
font-size: 12px;
color: #666;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.user-status {
font-size: 10px;
padding: 2px 8px;
border-radius: 12px;
text-transform: uppercase;
font-weight: bold;
text-align: center;
margin-top: 2px;
}
.user-status.admin {
background-color: #617365;
color: white;
}
.user-status.user {
background-color: #28a745;
color: white;
}
.admin-panel {
background: #f8f9fa;
padding: 15px;
margin: 20px 0;
border-radius: 8px;
border-left: 4px solid #617365;
}
.admin-btn {
background: #617365;
color: white;
padding: 8px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
margin: 0 5px 5px 0;
text-decoration: none;
display: inline-block;
}
.admin-btn:hover {
background: #453227;
color: white;
}
.delete-btn {
background: #dc3545;
}
.delete-btn:hover {
background: #c82333;
}
.user-welcome {
background: #e8f5e9;
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
}
.user-profile-menu {
display: none;
position: absolute;
background: white;
padding: 15px;
border-radius: 8px;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
min-width: 250px;
z-index: 1000;
right: 0;
top: 50px;
border: 1px solid #eee;
}
.user-profile-header {
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.user-profile-name {
font-weight: bold;
margin-bottom: 5px;
color: #333;
}
.user-profile-email {
font-size: 12px;
color: #666;
margin-bottom: 5px;
}
.user-profile-details {
font-size: 11px;
color: #999;
}
.user-profile-links {
list-style: none;
padding: 0;
margin: 0;
}
.user-profile-links li {
margin-bottom: 5px;
}
.user-profile-links a {
display: block;
padding: 8px 10px;
color: #333;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
}
.user-profile-links a:hover {
background-color: #f5f5f5;
color: #617365;
}
.logout-link {
color: #dc3545 !important;
border-top: 1px solid #eee;
margin-top: 10px;
padding-top: 12px !important;
}
.logout-link:hover {
background-color: #ffe6e6 !important;
}
.sub-categories {
margin-top: 10px;
}
.product-img1 {
width: 100%;
height: auto;
object-fit: cover;
}
.product-img {
width: 100%;
height: 100%;
object-fit: cover;
}
.align-right {
text-align: right;
}
/* Стили для названий товаров внизу слева - ПОЛНОСТЬЮ ПРОЗРАЧНЫЕ */
.product-name-overlay {
position: absolute;
left: 15px;
bottom: 15px;
z-index: 3;
max-width: 70%;
background: transparent !important;
padding: 0 !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
border-radius: 0 !important;
border-left: none !important;
text-align: left !important;
}
.product-name-overlay .name {
font-size: 18px;
font-weight: bold;
color: #453227;
margin: 0;
line-height: 1.2;
text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8);
text-align: left !important;
}
.product-name-overlay .price {
font-size: 16px;
color: #617365;
margin-top: 5px;
font-weight: 600;
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.6);
text-align: left !important;
}
/* Специальный стиль для стола Lonki - текст справа */
.product-name-overlay.lonki-right {
left: auto !important;
right: 15px !important;
bottom: 15px !important;
text-align: right !important;
}
/* Для Lonki цена тоже справа */
.product-name-overlay.lonki-right .name,
.product-name-overlay.lonki-right .price {
text-align: right !important;
}
/* Специальный стиль для дивана HEMMINS - текст слева сверху */
.product-name-overlay.compact-top-left {
left: 15px !important;
top: 15px !important;
bottom: auto !important;
text-align: left !important;
}
/* Для дивана HEMMINS цена тоже сверху */
.product-name-overlay.compact-top-left .name,
.product-name-overlay.compact-top-left .price {
text-align: left !important;
}
/* Стили для иконки корзины */
.product-wishlist-icon {
position: absolute;
bottom: 15px;
right: 15px;
background: rgba(255, 255, 255, 0.9);
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 4;
transition: all 0.3s ease;
color: #453227;
border: 1px solid #eee;
}
.product-wishlist-icon:hover {
background: #453227;
color: white;
transform: scale(1.1);
}
.product-image-container {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.product-card {
position: relative;
cursor: pointer;
}
.product-card:hover {
transform: translateY(-5px);
transition: transform 0.3s ease;
}
/* Убираем старый overlay внизу */
.product-info-overlay {
display: none;
}
/* Стиль для акционных товаров */
.product-card .product-discount {
position: absolute;
top: 15px;
right: 15px;
background: #dc3545;
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: bold;
z-index: 3;
}
/* Стиль для недоступных товаров */
.product-card.unavailable {
opacity: 0.6;
filter: grayscale(0.7);
position: relative;
}
.product-card.unavailable::before {
content: "ТОВАР ЗАКОНЧИЛСЯ";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(0, 0, 0, 0.85);
color: white;
padding: 15px 25px;
border-radius: 5px;
font-weight: bold;
font-size: 16px;
text-align: center;
z-index: 10;
white-space: nowrap;
pointer-events: none;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
}
.product-card.unavailable .product-name-overlay .name,
.product-card.unavailable .product-name-overlay .price {
color: #999 !important;
text-shadow: none !important;
}
.product-card.unavailable .add-to-cart-btn {
display: none;
}
.product-card.unavailable .product-wishlist-icon {
display: none;
}
.out-of-stock-badge {
position: absolute;
top: 10px;
left: 10px;
background: #6c757d;
color: white;
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
font-weight: bold;
z-index: 10;
}
.admin-tools {
background: #f8f9fa;
padding: 15px;
margin-bottom: 20px;
border-radius: 8px;
border-left: 4px solid #617365;
}
/* Адаптивность для мобильных */
@media (max-width: 768px) {
.product-name-overlay {
left: 10px;
bottom: 10px;
max-width: 60%;
}
.product-name-overlay .name {
font-size: 14px;
}
.product-name-overlay .price {
font-size: 12px;
}
.product-card.unavailable::before {
font-size: 12px;
padding: 10px 15px;
white-space: normal;
width: 90%;
text-align: center;
}
}
.filter-options {
list-style: none;
padding: 0;
margin: 0;
}
.filter-options li {
margin-bottom: 8px;
}
.filter-options input[type="checkbox"] {
margin-right: 8px;
}
.filter-options label {
cursor: pointer;
color: #453227;
font-size: 14px;
}
.filter-apply-btn {
background: #453227;
color: white;
border: none;
padding: 12px 24px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
font-weight: bold;
width: 100%;
margin-top: 20px;
transition: all 0.3s ease;
}
.filter-apply-btn:hover {
background: #617365;
}
.filter-title {
color: #453227;
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
border-bottom: 2px solid #453227;
padding-bottom: 5px;
}
.filter-list {
list-style: none;
padding: 0;
margin: 0;
}
.filter-list li {
margin-bottom: 8px;
}
.filter-list a {
color: #453227;
text-decoration: none;
font-size: 14px;
transition: all 0.3s ease;
}
.filter-list a:hover {
color: #617365;
padding-left: 5px;
}
.active-category {
font-weight: bold !important;
color: #617365 !important;
}
.price-display {
font-size: 16px;
font-weight: bold;
color: #453227;
margin-top: 10px;
text-align: center;
}
/* Стили для уведомлений */
.notification {
position: fixed;
top: 20px;
right: 20px;
padding: 15px 20px;
background: #28a745;
color: white;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
z-index: 10000;
transform: translateX(150%);
transition: transform 0.3s ease;
max-width: 300px;
}
.notification.show {
transform: translateX(0);
}
.notification.error {
background: #dc3545;
}
.notification.info {
background: #17a2b8;
}
/* Стили для админ-панели */
.admin-catalog-btn {
background: #453227;
color: white;
padding: 10px 20px;
border-radius: 4px;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 10px;
}
.admin-catalog-btn:hover {
background: #617365;
color: white;
}
</style>
</head>
<body>
<div id="notification" class="notification"></div>
<header class="header">
<div class="header__top">
<div class="container header__top-content">
<div class="logo">AETERNA</div>
<div class="search-catalog">
<div class="catalog-dropdown">
Все категории <span>&#9660;</span>
<div class="catalog-dropdown__menu">
<ul>
<li><a href="catalog.php">Все товары</a></li>
<?php foreach ($categories as $category): ?>
<li><a href="catalog.php?category=<?= $category['category_id'] ?>">
<?= htmlspecialchars($category['name']) ?>
</a></li>
<?php endforeach; ?>
</ul>
</div>
</div>
<div class="search-box">
<form method="GET" action="catalog.php" style="display: flex; width: 100%;">
<input type="text" name="search" placeholder="Поиск товаров"
value="<?= htmlspecialchars($search) ?>"
style="border: none; width: 100%; padding: 10px;">
<button type="submit" style="background: none; border: none; cursor: pointer;">
<span class="search-icon"><i class="fas fa-search"></i></span>
</button>
</form>
</div>
</div>
<div class="header__icons--top">
<a href="оформлениеаказа.php" class="icon cart-icon">
<i class="fas fa-shopping-cart"></i>
<span class="cart-count" id="cartCount">0</span>
</a>
<div class="user-profile-dropdown">
<div class="user-profile-toggle" id="profileToggle">
<div class="user-avatar">
<?= !empty($userEmail) ? strtoupper(substr($userEmail, 0, 1)) : 'U' ?>
</div>
<div class="user-info">
<div class="user-email"><?= htmlspecialchars($userEmail) ?></div>
<div class="user-status <?= $isAdmin ? 'admin' : 'user' ?>">
<?= $isAdmin ? 'Админ' : 'Пользователь' ?>
</div>
</div>
<i class="fas fa-chevron-down" style="font-size: 12px; color: #666;"></i>
</div>
<div class="user-profile-menu" id="profileMenu">
<div class="user-profile-header">
<div class="user-profile-name">
<i class="fas fa-user"></i> <?= htmlspecialchars($fullName) ?>
</div>
<div class="user-profile-email">
<i class="fas fa-envelope"></i> <?= htmlspecialchars($userEmail) ?>
</div>
<div class="user-profile-details">
<i class="fas fa-clock"></i> Вошел: <?= date('d.m.Y H:i', $loginTime) ?>
</div>
<?php if (isset($user['created_at'])): ?>
<div class="user-profile-details">
<i class="fas fa-calendar"></i> Зарегистрирован: <?= date('d.m.Y', strtotime($user['created_at'])) ?>
</div>
<?php endif; ?>
</div>
<ul class="user-profile-links">
<li><a href="профиль.php"><i class="fas fa-user-cog"></i> Мой профиль</a></li>
<li><a href="оформлениеаказа.php"><i class="fas fa-shopping-bag"></i> Мои заказы</a></li>
<?php if ($isAdmin): ?>
<li><a href="admin_panel.php"><i class="fas fa-user-shield"></i> Админ-панель</a></li>
<?php endif; ?>
<li><a href="logout.php" class="logout-link"><i class="fas fa-sign-out-alt"></i> Выйти</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="header__bottom">
<div class="container header__bottom-content">
<div class="catalog-menu">
<a href="catalog.php" class="catalog-link active-catalog">
<div class="catalog-icon">
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
</div>
<span class="catalog-lines">☰</span>
Каталог
</a>
</div>
<nav class="nav">
<ul class="nav-list">
<li><a href="cite_mebel.php">Главная</a></li>
<li><a href="услуги.php">Услуги</a></li>
<li><a href="Доставка.php">Доставка и оплата</a></li>
<li><a href="Гарантия.php">Гарантия</a></li>
<li><a href="#footer">Контакты</a></li>
</ul>
</nav>
<div class="header-phone">+7(912)999-12-23</div>
</div>
</div>
</header>
<main class="catalog-main">
<div class="container">
<div class="breadcrumbs">
<a href="cite_mebel.php">Главная</a> • <span class="current-page">Каталог</span>
</div>
<?php if ($success_message): ?>
<div class="notification show" style="position: relative; top: 0; right: 0; margin: 20px 0; background: #28a745;">
<?php
$messages = [
'category_added' => 'Категория успешно добавлена!',
'category_updated' => 'Категория успешно обновлена!',
'category_deleted' => 'Категория успешно удалена!',
'product_added' => 'Товар успешно добавлен!',
'product_updated' => 'Товар успешно обновлен!',
'product_deleted' => 'Товар успешно удален!'
];
echo $messages[$success_message] ?? 'Операция выполнена успешно!';
?>
</div>
<?php endif; ?>
<?php if ($error_message): ?>
<div class="notification error show" style="position: relative; top: 0; right: 0; margin: 20px 0;">
Ошибка: <?= htmlspecialchars($error_message) ?>
</div>
<?php endif; ?>
<?php if ($isAdmin): ?>
<!-- В файле catalog.php найдите эти строки: -->
<div class="admin-panel">
<h3 style="margin-bottom: 15px; color: #453227;">
<i class="fas fa-user-shield"></i> Панель управления каталогом
<span style="font-size: 12px; color: #666; margin-left: 10px;">
Вы вошли как администратор
</span>
</h3>
<div>
<!-- КНОПКА КАТАЛОГ ДОБАВЛЕНА -->
<a href="admin_panel.php?action=catalog" class="admin-btn">
<i class="fas fa-boxes"></i> Управление каталогом
</a>
<a href="admin_panel.php?action=add_product" class="admin-btn">
<i class="fas fa-plus"></i> Добавить товар
</a>
<!-- КНОПКА УПРАВЛЕНИЯ КАТЕГОРИЯМИ - ПЕРЕХОД В ОТДЕЛЬНЫЙ РАЗДЕЛ -->
<a href="admin_panel.php?action=categories" class="admin-btn">
<i class="fas fa-tags"></i> Управление категориями
</a>
<a href="admin_panel.php?action=orders" class="admin-btn">
<i class="fas fa-shopping-cart"></i> Управление заказами
</a>
<a href="admin_panel.php?action=users" class="admin-btn">
<i class="fas fa-users"></i> Управление пользователями
</a>
</div>
</div>
<div class="admin-tools">
<h4 style="margin-bottom: 10px; color: #453227;">
<i class="fas fa-eye"></i> Настройки отображения
</h4>
<?php if ($show_all): ?>
<a href="catalog.php?<?= http_build_query(array_merge($_GET, ['show_all' => 0])) ?>"
class="btn btn-primary" style="background: #453227; color: white; padding: 8px 15px; border-radius: 4px; text-decoration: none; display: inline-block;">
<i class="fas fa-eye-slash"></i> Скрыть недоступные товары
</a>
<?php else: ?>
<a href="catalog.php?<?= http_build_query(array_merge($_GET, ['show_all' => 1])) ?>"
class="btn btn-info" style="background: #17a2b8; color: white; padding: 8px 15px; border-radius: 4px; text-decoration: none; display: inline-block;">
<i class="fas fa-eye"></i> Показать все товары
</a>
<?php endif; ?>
<span style="margin-left: 15px; color: #666; font-size: 14px;">
<i class="fas fa-info-circle"></i> Недоступные товары отмечены серым цветом
</span>
</div>
<?php endif; ?>
<div class="user-welcome" style="background: #f5e9dc; color: #453227; border-left: 4px solid #453227;">
<i class="fas fa-user-check"></i> Добро пожаловать, <strong><?= htmlspecialchars($fullName) ?></strong>!
<?php if ($isAdmin): ?>
<span style="background: #453227; color: white; padding: 3px 8px; border-radius: 4px; font-size: 12px; margin-left: 10px;">
<i class="fas fa-user-shield"></i> Администратор
</span>
<?php endif; ?>
<?php if ($show_all && $isAdmin): ?>
<span style="background: #17a2b8; color: white; padding: 3px 8px; border-radius: 4px; font-size: 12px; margin-left: 10px;">
<i class="fas fa-eye"></i> Показаны все товары
</span>
<?php endif; ?>
</div>
<div class="catalog-wrapper">
<aside class="catalog-sidebar">
<form method="GET" action="catalog.php" id="filterForm">
<?php if ($category_id): ?>
<input type="hidden" name="category" value="<?= $category_id ?>">
<?php endif; ?>
<?php if ($show_all): ?>
<input type="hidden" name="show_all" value="1">
<?php endif; ?>
<div class="filter-group">
<h4 class="filter-title">КАТЕГОРИИ</h4>
<ul class="filter-list">
<li><a href="catalog.php<?= $show_all ? '?show_all=1' : '' ?>"
class="<?= !$category_id ? 'active-category' : '' ?>">
Все товары
</a></li>
<?php foreach ($categories as $category): ?>
<li>
<a href="catalog.php?category=<?= $category['category_id'] ?><?= $show_all ? '&show_all=1' : '' ?>"
class="<?= $category_id == $category['category_id'] ? 'active-category' : '' ?>">
<?= htmlspecialchars($category['name']) ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php if (!empty($subcategories)): ?>
<div class="filter-group sub-categories">
<h4 class="filter-title">ПОДКАТЕГОРИИ</h4>
<ul class="filter-list">
<?php foreach ($subcategories as $sub): ?>
<li><a href="catalog.php?category=<?= $category_id ?>&subcategory=<?= $sub['subcategory_id'] ?><?= $show_all ? '&show_all=1' : '' ?>">
<?= htmlspecialchars($sub['name']) ?>
</a></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<div class="filter-group">
<h4 class="filter-title">СТОИМОСТЬ</h4>
<div class="price-range">
<div class="range-slider">
<input type="range" min="0" max="100000" value="<?= $max_price ?>"
step="1000" id="priceSlider" name="max_price">
</div>
<div class="price-display" id="priceDisplay">
До <?= number_format($max_price, 0, '', ' ') ?> ₽
</div>
</div>
</div>
<?php if ($hasColorColumn && !empty($availableColors)): ?>
<div class="filter-group">
<h4 class="filter-title">ЦВЕТ</h4>
<ul class="filter-options">
<?php foreach ($availableColors as $color): ?>
<li>
<input type="checkbox" id="color_<?= preg_replace('/[^a-z0-9]/i', '_', $color) ?>" name="colors[]"
value="<?= htmlspecialchars($color) ?>"
<?= in_array($color, $colors) ? 'checked' : '' ?>>
<label for="color_<?= preg_replace('/[^a-z0-9]/i', '_', $color) ?>"><?= htmlspecialchars($color) ?></label>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<?php if ($hasMaterialColumn && !empty($availableMaterials)): ?>
<div class="filter-group">
<h4 class="filter-title">МАТЕРИАЛ</h4>
<ul class="filter-options">
<?php foreach ($availableMaterials as $material): ?>
<li>
<input type="checkbox" id="material_<?= preg_replace('/[^a-z0-9]/i', '_', $material) ?>" name="materials[]"
value="<?= htmlspecialchars($material) ?>"
<?= in_array($material, $materials) ? 'checked' : '' ?>>
<label for="material_<?= preg_replace('/[^a-z0-9]/i', '_', $material) ?>"><?= htmlspecialchars($material) ?></label>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<button type="submit" class="filter-apply-btn">
ПРИМЕНИТЬ ФИЛЬТРЫ
</button>
</form>
</aside>
<section class="catalog-products">
<div style="margin-bottom: 20px;">
<h2 style="color: #453227; margin-bottom: 10px;">
Каталог мебели
<span style="font-size: 14px; color: #666; font-weight: normal;">
(<?php
$activeCount = 0;
foreach ($filteredProducts as $p) {
if ($p['is_available']) $activeCount++;
}
echo $activeCount . ' активных';
if ($show_all) {
echo ', ' . count($filteredProducts) . ' всего';
}
?> товаров)
</span>
</h2>
<?php if ($search): ?>
<p style="color: #666;">
Результаты поиска по запросу: "<strong><?= htmlspecialchars($search) ?></strong>"
<a href="catalog.php<?= $show_all ? '?show_all=1' : '' ?>" style="margin-left: 10px; color: #617365; text-decoration: none;">
<i class="fas fa-times"></i> Очистить поиск
</a>
</p>
<?php endif; ?>
<?php if ($show_all): ?>
<div style="background: #e8f4fd; padding: 10px 15px; border-radius: 4px; margin-top: 10px;">
<i class="fas fa-info-circle" style="color: #17a2b8;"></i>
<span style="color: #0c5460; font-size: 14px;">
Показаны все товары, включая недоступные. Недоступные товары отмечены серым цветом.
</span>
</div>
<?php endif; ?>
</div>
<!-- В catalog.php, в секции вывода товаров: -->
<div class="products-container">
<?php
// Оригинальные 9 товаров с их размерами
$originalProducts = [
1 => ['name' => 'Светильник MINNIGHT', 'price' => 7999, 'image' => 'img2/1_2.png', 'size' => 'small'],
2 => ['name' => 'Кровать MODER', 'price' => 45999, 'image' => 'img2/3_3.png', 'size' => 'large'],
3 => ['name' => 'Торшер MARCIA', 'price' => 11999, 'image' => 'img2/2_2.png', 'size' => 'tall align-right'],
4 => ['name' => 'Светильник POLET', 'price' => 5499, 'image' => 'img2/4.jpg', 'size' => 'wide'],
5 => ['name' => 'Стол NORD', 'price' => 23999, 'image' => 'img2/5_5.png', 'size' => 'small1'],
6 => ['name' => 'Диван ROYALTY', 'price' => 78999, 'image' => 'img2/6_6.png', 'size' => 'wide2'],
7 => ['name' => 'Кресло MINIMAL', 'price' => 29999, 'image' => 'img2/7_7.png', 'size' => 'wide3'],
8 => ['name' => 'Стол LONKI', 'price' => 34999, 'image' => 'img2/8_8.png', 'size' => 'wide2_1'],
9 => ['name' => 'Диван HEMMINS', 'price' => 89999, 'image' => 'img2/9_9.png', 'size' => 'full-width']
];
// Если в базе данных товаров нет, показываем оригинальные
if (empty($filteredProducts)) {
foreach ($originalProducts as $id => $product): ?>
<div class="product-card <?= $product['size'] ?>"
data-product-id="<?= $id ?>"
data-available="true">
<div class="product-image-container">
<img src="<?= $product['image'] ?>"
alt="<?= $product['name'] ?>"
class="<?= strpos($product['size'], 'small1') !== false ? 'product-img1' : 'product-img' ?>">
<div class="product-name-overlay">
<div class="name"><?= $product['name'] ?></div>
<div class="price"><?= number_format($product['price'], 0, '', ' ') ?> ₽</div>
</div>
<i class="fas fa-shopping-cart product-wishlist-icon add-to-cart-btn"
data-product-id="<?= $id ?>"
data-product-name="<?= $product['name'] ?>"
data-product-price="<?= $product['price'] ?>"
title="Добавить в корзину"></i>
</div>
</div>
<?php endforeach;
} else {
// Вывод товаров из базы данных
foreach ($filteredProducts as $product):
// Определяем размер по ID
$productId = $product['product_id'];
if ($productId <= 9 && isset($originalProducts[$productId])) {
$sizeClass = $originalProducts[$productId]['size'];
} else {
$sizeClass = 'small'; // Все новые товары - размер small
}
?>
<div class="product-card <?= $sizeClass ?>"
data-product-id="<?= $productId ?>"
data-available="<?= $product['is_available'] && $product['stock_quantity'] > 0 ? 'true' : 'false' ?>">
<div class="product-image-container">
<img src="<?= htmlspecialchars($product['image_url'] ?? 'img2/default.jpg') ?>"
alt="<?= htmlspecialchars($product['name']) ?>"
class="<?= strpos($sizeClass, 'small1') !== false ? 'product-img1' : 'product-img' ?>">
<div class="product-name-overlay">
<div class="name"><?= htmlspecialchars($product['name']) ?></div>
<div class="price"><?= number_format($product['price'], 0, '', ' ') ?> ₽</div>
</div>
<i class="fas fa-shopping-cart product-wishlist-icon add-to-cart-btn"
data-product-id="<?= $productId ?>"
data-product-name="<?= htmlspecialchars($product['name']) ?>"
data-product-price="<?= $product['price'] ?>"
title="Добавить в корзину"></i>
</div>
</div>
<?php endforeach;
} ?>
</div>
</section>
</div>
</div>
</main>
<footer class="footer" id="footer">
<div class="container footer__content">
<div class="footer__col footer--logo">
<div class="logo" style="color: #453227;">AETERNA</div>
</div>
<div class="footer__col">
<h5 style="color: #453227;">ПОКУПАТЕЛЮ</h5>
<ul>
<li><a href="catalog.php" style="color: #453227;">Каталог</a></li>
<li><a href="услуги.php" style="color: #453227;">Услуги</a></li>
</ul>
</div>
<div class="footer__col">
<h5 style="color: #453227;">ПОМОЩЬ</h5>
<ul>
<li><a href="Доставка.php" style="color: #453227;">Доставка и оплата</a></li>
<li><a href="Гарантия.php" style="color: #453227;">Гарантия и возврат</a></li>
<li><a href="cite_mebel.php#faq" style="color: #453227;">Ответы на вопросы</a></li>
<li><a href="#footer" style="color: #453227;">Контакты</a></li>
</ul>
</div>
<div class="footer__col">
<h5 style="color: #453227;">КОНТАКТЫ</h5>
<p style="color: #453227;">aeterna@mail.ru</p>
<p style="color: #453227;">+7(912)999-12-23</p>
<div class="social-icons">
<span class="icon" style="color: #453227;"><i class="fab fa-telegram"></i></span>
<span class="icon" style="color: #453227;"><i class="fab fa-instagram"></i></span>
<span class="icon" style="color: #453227;"><i class="fab fa-vk"></i></span>
</div>
</div>
<div class="footer__col">
<h5 style="color: #453227;">ПРИНИМАЕМ К ОПЛАТЕ</h5>
<div class="payment-icons">
<span class="pay-icon" style="color: #453227;"><i class="fab fa-cc-visa"></i></span>
<span class="pay-icon" style="color: #453227;"><i class="fab fa-cc-mastercard"></i></span>
</div>
</div>
</div>
<div class="copyright" style="color: #453227;">
<p>© 2025 AETERNA. Все права защищены.</p>
</div>
</footer>
<script>
$(document).ready(function() {
// Слайдер цены
$('#priceSlider').on('input', function() {
const value = $(this).val();
$('#priceDisplay').text('До ' + new Intl.NumberFormat('ru-RU').format(value) + ' ₽');
});
// Профиль пользователя
$('#profileToggle').click(function(e) {
e.stopPropagation();
$('#profileMenu').toggle();
});
$(document).click(function(e) {
if (!$(e.target).closest('.user-profile-dropdown').length) {
$('#profileMenu').hide();
}
});
// Обновление счетчика корзины
updateCartCount();
// Добавление в корзину
$('.add-to-cart-btn').click(function(e) {
e.stopPropagation();
const productId = $(this).data('product-id');
const productName = $(this).data('product-name');
const productPrice = $(this).data('product-price');
const isAvailable = $(this).closest('.product-card').data('available');
if (isAvailable) {
addToCart(productId, productName, productPrice);
} else {
showNotification('Этот товар временно недоступен', 'error');
}
});
// Клик по карточке товара
// В catalog.php, в разделе JavaScript:
$('.product-card').click(function(e) {
if (!$(e.target).closest('.add-to-cart-btn').length &&
!$(e.target).closest('.product-wishlist-icon').length) {
const productId = $(this).data('product-id');
const isAvailable = $(this).data('available');
if (isAvailable) {
// Для дивана MODERN (ID 2) ведем на отдельную страницу
if (productId == 2) {
window.location.href = 'product_modern.php';
} else {
window.location.href = 'product_detail.php?id=' + productId;
}
}
}
});
// Показываем уведомления, если они есть
<?php if ($success_message): ?>
showNotification('<?= $messages[$success_message] ?? "Операция выполнена успешно!" ?>', 'success');
<?php endif; ?>
<?php if ($error_message): ?>
showNotification('Ошибка: <?= addslashes($error_message) ?>', 'error');
<?php endif; ?>
});
function updateCartCount() {
$.ajax({
url: 'get_cart_count.php',
method: 'GET',
success: function(response) {
try {
const result = JSON.parse(response);
if (result.success) {
$('#cartCount').text(result.cart_count);
}
} catch(e) {
console.error('Ошибка при получении корзины:', e);
}
},
error: function() {
console.error('Ошибка при обновлении корзины');
}
});
}
function addToCart(productId, productName, productPrice) {
$.ajax({
url: 'add_to_cart.php',
method: 'POST',
data: {
product_id: productId,
quantity: 1
},
success: function(response) {
try {
const result = JSON.parse(response);
if (result.success) {
showNotification('Товар "' + productName + '" добавлен в корзину!');
updateCartCount();
} else {
showNotification('Ошибка: ' + result.message, 'error');
}
} catch(e) {
showNotification('Ошибка при добавлении в корзину', 'error');
}
},
error: function() {
showNotification('Ошибка сервера', 'error');
}
});
}
function showNotification(message, type = 'success') {
const notification = $('#notification');
notification.text(message);
notification.removeClass('success error info').addClass(type + ' show');
setTimeout(function() {
notification.removeClass('show');
}, 3000);
}
</script>
</body>
</html>