Add .gitignore and project files
This commit is contained in:
350
product_modern.php
Normal file
350
product_modern.php
Normal file
@@ -0,0 +1,350 @@
|
||||
<?php
|
||||
// product_modern.php - Страница товара "Диван MODERN"
|
||||
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();
|
||||
|
||||
// Получаем информацию о товаре "Диван MODERN" (ID 2 из базы данных)
|
||||
try {
|
||||
$productStmt = $db->prepare("
|
||||
SELECT p.*, c.name as category_name
|
||||
FROM products p
|
||||
LEFT JOIN categories c ON p.category_id = c.category_id
|
||||
WHERE p.product_id = 2 AND p.is_available = TRUE
|
||||
");
|
||||
$productStmt->execute();
|
||||
$product = $productStmt->fetch();
|
||||
|
||||
if (!$product) {
|
||||
header('Location: catalog.php?error=product_not_found');
|
||||
exit();
|
||||
}
|
||||
|
||||
// Получаем похожие товары
|
||||
$similarStmt = $db->prepare("
|
||||
SELECT * FROM products
|
||||
WHERE category_id = ? AND product_id != ? AND is_available = TRUE
|
||||
ORDER BY RANDOM()
|
||||
LIMIT 3
|
||||
");
|
||||
$similarStmt->execute([$product['category_id'], $product['product_id']]);
|
||||
$similarProducts = $similarStmt->fetchAll();
|
||||
|
||||
} catch (PDOException $e) {
|
||||
die("Ошибка базы данных: " . $e->getMessage());
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>AETERNA - <?= htmlspecialchars($product['name']) ?></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>
|
||||
.product-attributes {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.attribute-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.attribute-label {
|
||||
font-weight: bold;
|
||||
color: #453227;
|
||||
}
|
||||
.attribute-value {
|
||||
color: #617365;
|
||||
}
|
||||
.stock-status {
|
||||
font-weight: bold;
|
||||
padding: 5px 10px;
|
||||
border-radius: 4px;
|
||||
display: inline-block;
|
||||
}
|
||||
.in-stock {
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
}
|
||||
.low-stock {
|
||||
background: #fff3cd;
|
||||
color: #856404;
|
||||
}
|
||||
.out-of-stock {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
.product-gallery {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
}
|
||||
.main-image {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
.product-gallery img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.thumbnail {
|
||||
opacity: 0.7;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
.thumbnail:hover, .thumbnail.active {
|
||||
opacity: 1;
|
||||
border: 2px solid #453227;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<?php include 'header_common.php'; ?>
|
||||
|
||||
<main class="container">
|
||||
<div class="breadcrumbs">
|
||||
<a href="cite_mebel.php">Главная</a> •
|
||||
<a href="catalog.php">Каталог</a> •
|
||||
<a href="catalog.php?category=<?= $product['category_id'] ?>"><?= htmlspecialchars($product['category_name']) ?></a> •
|
||||
<span><?= htmlspecialchars($product['name']) ?></span>
|
||||
</div>
|
||||
|
||||
<div class="product__section">
|
||||
<div class="product__gallery">
|
||||
<div class="main-image">
|
||||
<img src="img/диван_modern_main.jpg" alt="Диван MODERN" id="mainImage" class="product__image">
|
||||
</div>
|
||||
<div class="thumbnail" onclick="changeImage('img/диван_modern_main.jpg')">
|
||||
<img src="img/диван_modern_main.jpg" alt="Диван MODERN - вид 1">
|
||||
</div>
|
||||
<div class="thumbnail" onclick="changeImage('img/диван_modern_side.jpg')">
|
||||
<img src="img/диван_modern_side.jpg" alt="Диван MODERN - вид 2">
|
||||
</div>
|
||||
<div class="thumbnail" onclick="changeImage('img/диван_modern_detail.jpg')">
|
||||
<img src="img/диван_modern_detail.jpg" alt="Диван MODERN - детали">
|
||||
</div>
|
||||
<div class="thumbnail" onclick="changeImage('img/диван_modern_inroom.jpg')">
|
||||
<img src="img/диван_modern_inroom.jpg" alt="Диван MODERN в интерьере">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="product__info">
|
||||
<h1 class="product__title">Диван MODERN</h1>
|
||||
|
||||
<div class="product__rating">
|
||||
<div class="stars">
|
||||
<span class="star filled">★</span>
|
||||
<span class="star filled">★</span>
|
||||
<span class="star filled">★</span>
|
||||
<span class="star filled">★</span>
|
||||
<span class="star half">★</span>
|
||||
</div>
|
||||
<span class="rating-value">4.5</span>
|
||||
<span class="reviews-count">(24 отзыва)</span>
|
||||
</div>
|
||||
|
||||
<div class="product__price">
|
||||
<span class="current-price">
|
||||
<?= number_format($product['price'], 0, '', ' ') ?> ₽
|
||||
</span>
|
||||
<?php if ($product['old_price'] && $product['old_price'] > $product['price']): ?>
|
||||
<span class="old-price">
|
||||
<?= number_format($product['old_price'], 0, '', ' ') ?> ₽
|
||||
</span>
|
||||
<span class="discount-badge">
|
||||
-<?= round(($product['old_price'] - $product['price']) / $product['old_price'] * 100) ?>%
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="product-attributes">
|
||||
<div class="attribute-row">
|
||||
<span class="attribute-label">Артикул:</span>
|
||||
<span class="attribute-value"><?= $product['sku'] ?? 'DIV-MOD-001' ?></span>
|
||||
</div>
|
||||
<div class="attribute-row">
|
||||
<span class="attribute-label">Категория:</span>
|
||||
<span class="attribute-value">Диваны</span>
|
||||
</div>
|
||||
<div class="attribute-row">
|
||||
<span class="attribute-label">Цвет:</span>
|
||||
<span class="attribute-value">Серый, Бежевый, Темно-синий</span>
|
||||
</div>
|
||||
<div class="attribute-row">
|
||||
<span class="attribute-label">Материал:</span>
|
||||
<span class="attribute-value">Экокожа, Дерево</span>
|
||||
</div>
|
||||
<div class="attribute-row">
|
||||
<span class="attribute-label">Размеры (Ш×Г×В):</span>
|
||||
<span class="attribute-value">220 × 95 × 85 см</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stock-status <?= $product['stock_quantity'] > 0 ? 'in-stock' : 'out-of-stock' ?>">
|
||||
<?php if ($product['stock_quantity'] > 0): ?>
|
||||
<i class="fas fa-check-circle"></i> В наличии: <?= $product['stock_quantity'] ?> шт.
|
||||
<?php else: ?>
|
||||
<i class="fas fa-times-circle"></i> Нет в наличии
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<p class="product__description">
|
||||
Угловой диван MODERN – сочетание современного дизайна и бескомпромиссного комфорта.
|
||||
Каркас из массива дерева обеспечивает долговечность, а наполнитель из высокоэластичного
|
||||
пенополиуретана гарантирует оптимальную поддержку спины. Диван оснащен механизмом
|
||||
трансформации «еврокнижка», что позволяет использовать его как спальное место.
|
||||
<br><br>
|
||||
Особенности:
|
||||
• Прочная конструкция из массива дерева
|
||||
• Механизм трансформации «еврокнижка»
|
||||
• Наполнитель: пенополиуретан + периотек
|
||||
• Съемные чехлы для легкой чистки
|
||||
• Встроенные подлокотники с полками
|
||||
</p>
|
||||
|
||||
<?php if ($product['stock_quantity'] > 0): ?>
|
||||
<div class="product__purchase">
|
||||
<div class="product__quantity">
|
||||
<button class="product__qty-btn minus">-</button>
|
||||
<input type="number" class="product__qty-value" value="1" min="1" max="<?= $product['stock_quantity'] ?>">
|
||||
<button class="product__qty-btn plus">+</button>
|
||||
</div>
|
||||
|
||||
<div class="product__actions">
|
||||
<button class="btn primary-btn" onclick="addToCart(<?= $product['product_id'] ?>)">
|
||||
<i class="fas fa-shopping-cart"></i> В корзину
|
||||
</button>
|
||||
<button class="btn secondary-btn" onclick="buyNow(<?= $product['product_id'] ?>)">
|
||||
<i class="fas fa-bolt"></i> Купить сейчас
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="product__actions">
|
||||
<button class="btn secondary-btn" onclick="notifyWhenAvailable(<?= $product['product_id'] ?>)">
|
||||
<i class="fas fa-bell"></i> Уведомить о поступлении
|
||||
</button>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($similarProducts)): ?>
|
||||
<section class="similar">
|
||||
<h2 class="similar__title">Похожие товары</h2>
|
||||
<div class="similar__grid">
|
||||
<?php foreach ($similarProducts as $similar): ?>
|
||||
<div class="similar__card">
|
||||
<div class="similar__card-image">
|
||||
<img src="<?= htmlspecialchars($similar['image_url'] ?? 'img1/default.jpg') ?>"
|
||||
alt="<?= htmlspecialchars($similar['name']) ?>">
|
||||
</div>
|
||||
<div class="similar__card-content">
|
||||
<h3><?= htmlspecialchars($similar['name']) ?></h3>
|
||||
<p class="similar__card-description">
|
||||
<?= htmlspecialchars(mb_substr($similar['description'] ?? '', 0, 80)) ?>...
|
||||
</p>
|
||||
<p class="similar__card-price">
|
||||
<?= number_format($similar['price'], 0, '', ' ') ?> ₽
|
||||
</p>
|
||||
<a href="product_detail.php?id=<?= $similar['product_id'] ?>"
|
||||
class="btn btn-primary">
|
||||
Подробнее
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
|
||||
<script>
|
||||
function changeImage(src) {
|
||||
$('#mainImage').attr('src', src);
|
||||
$('.thumbnail').removeClass('active');
|
||||
$(event.target).closest('.thumbnail').addClass('active');
|
||||
}
|
||||
|
||||
function addToCart(productId) {
|
||||
const quantity = $('.product__qty-value').val();
|
||||
|
||||
$.ajax({
|
||||
url: 'add_to_cart.php',
|
||||
method: 'POST',
|
||||
data: {
|
||||
product_id: productId,
|
||||
quantity: quantity
|
||||
},
|
||||
success: function(response) {
|
||||
try {
|
||||
const result = JSON.parse(response);
|
||||
if (result.success) {
|
||||
alert('Товар добавлен в корзину!');
|
||||
// Обновляем счетчик в шапке
|
||||
$('.cart-count').text(result.cart_count);
|
||||
} else {
|
||||
alert('Ошибка: ' + result.message);
|
||||
}
|
||||
} catch(e) {
|
||||
alert('Товар добавлен в корзину!');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function buyNow(productId) {
|
||||
const quantity = $('.product__qty-value').val();
|
||||
|
||||
$.ajax({
|
||||
url: 'add_to_cart.php',
|
||||
method: 'POST',
|
||||
data: {
|
||||
product_id: productId,
|
||||
quantity: quantity
|
||||
},
|
||||
success: function() {
|
||||
window.location.href = 'оформление_заказа.php';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// Управление количеством
|
||||
$('.product__qty-btn.plus').click(function() {
|
||||
const $input = $('.product__qty-value');
|
||||
let value = parseInt($input.val());
|
||||
let max = parseInt($input.attr('max'));
|
||||
if (value < max) {
|
||||
$input.val(value + 1);
|
||||
}
|
||||
});
|
||||
|
||||
$('.product__qty-btn.minus').click(function() {
|
||||
const $input = $('.product__qty-value');
|
||||
let value = parseInt($input.val());
|
||||
if (value > 1) {
|
||||
$input.val(value - 1);
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user