Файл: upload/pages/catalog/subcategory.php
Строк: 81
<?php
require_once ($_SERVER['DOCUMENT_ROOT'] . '/core/core.php');
$id = abs((int)($_GET['id'] ?? 0));
$subcategory = FetchAssoc(dbquery("SELECT * FROM `subcategory` WHERE `id` = ?", [$id]));
if (empty($subcategory['id'])) {
header("HTTP/1.0 404 Not Found");
include ($_SERVER['DOCUMENT_ROOT'] . '/pages/err_pages/404.php');
exit();
}
$category = FetchAssoc(dbquery("SELECT * FROM `category` WHERE `id` = ?", [$subcategory['category']]));
$breadcrumbs = generateBreadcrumbs([
['/', 'Главная'],
['/category' . $subcategory['category'], $category['name']],
['#', $subcategory['name']]
]);
// Получаем работы
$q = dbquery("SELECT * FROM works WHERE subcategory = ? ORDER BY up_time DESC, id DESC", [$id]);
$filtered = [];
while ($work = FetchAssoc($q)) {
$flag = CryptorHash('1', $work['salt']);
$us_ban = FetchAssoc(dbquery("SELECT id FROM users_banned WHERE us = ?", [$work['user_work']]));
if ($us_ban) continue;
if ($work['k_off'] === $flag) continue;
if ($work['del'] === $flag) continue;
$filtered[] = $work;
}
$total = count($filtered);
$limit = 52;
$first_52 = array_slice($filtered, 0, $limit);
$works_html = [];
foreach ($first_52 as $work) {
// Передаём $work в компонент
$GLOBALS['work'] = $work;
$GLOBALS['user'] = $user;
// Подключаем компонент, который создаёт $work_item
require $_SERVER['DOCUMENT_ROOT'] . '/core/elements/work-box.php';
// Добавляем HTML в массив
$works_html[] = $work_item;
}
// Сайдбар
include $_SERVER['DOCUMENT_ROOT'] . '/core/elements/sidebars/subcategory.php';
$page_html = $view->render('pages/catalog/subcategory.html', [
'breadcrumbs_html' => $breadcrumbs['html'],
'breadcrumbs_json' => $breadcrumbs['json_ld'],
'subcategory' => [
'name' => $subcategory['name']
],
'subcategory_id' => $id,
'limit' => $limit,
'sidebar' => $sidebar,
'works' => $works_html,
'show_more' => $total > $limit
]);
require_once ($_SERVER['DOCUMENT_ROOT'] . '/layout.php');
?>
<script>
$(document).on('click', '.sort-btn', function(e) {
e.preventDefault();
let categoryId = $(this).data('id');
let isActive = $(this).hasClass('active');
let group = $(this).closest('.sort_flex');
// --- ЛОГИКА АКТИВАЦИИ ---
// каждая группа независима
if ($(this).data('sort').includes('price')) {
group.find('[data-sort^="price"]').removeClass('active');
if (!isActive) $(this).addClass('active');
}
if ($(this).data('sort').includes('rating')) {
group.find('[data-sort^="rating"]').removeClass('active');
if (!isActive) $(this).addClass('active');
}
if ($(this).data('sort') === 'sale' || $(this).data('sort') === 'order') {
group.find('[data-sort="sale"], [data-sort="order"]').removeClass('active');
if (!isActive) $(this).addClass('active');
}
// --- СБОР КОМБИНИРОВАННОЙ СОРТИРОВКИ ---
let parts = [];
// тип
let typeSort = $('.sort-btn.active[data-sort="sale"], .sort-btn.active[data-sort="order"]').data('sort');
if (typeSort) parts.push(typeSort);
// рейтинг
let ratingSort = $('.sort-btn.active[data-sort^="rating"]').data('sort');
if (ratingSort) parts.push(ratingSort);
// цена
let priceSort = $('.sort-btn.active[data-sort^="price"]').data('sort');
if (priceSort) parts.push(priceSort);
// итоговый ключ
let sortKey = parts.length ? parts.join('_') : 'default';
// --- AJAX ---
$.ajax({
url: '/core/ajax/sort_subcategory_handler.php',
type: 'POST',
data: {
id: categoryId,
sort: sortKey
},
success: function(response) {
let order = response.split(',');
let container = $('.category_list');
order.forEach(function(id) {
let el = container.find('[data-id="' + id + '"]');
if (el.length) container.append(el);
});
}
});
});
</script>
<script>
$(document).on('click', '#load-more', function() {
let btn = $(this);
let offset = parseInt(btn.data('offset'));
let id = btn.data('id');
$.ajax({
url: '/core/ajax/load_more_subcategory.php',
type: 'POST',
dataType: 'json',
data: { id, offset },
success: function(res) {
$('.category_list').append(res.html);
if (!res.show_more) {
btn.remove();
} else {
btn.data('offset', offset + 52);
}
}
});
});
</script>