Файл: upload/pages/work/work.php
Строк: 197
<?php
require_once ($_SERVER['DOCUMENT_ROOT'] . '/core/core.php');
$id = abs((int)($_GET['id'] ?? 0));
$work = FetchAssoc(dbquery("SELECT * FROM works WHERE id = ?", [$id]));
if (empty($work['id'])) {
header("HTTP/1.0 404 Not Found");
include ($_SERVER['DOCUMENT_ROOT'] . '/pages/err_pages/404.php');
exit();
}
$imgs = dbquery("SELECT k_image FROM works_images WHERE k_work = ?", [$id]);
$images = [];
while ($img = FetchAssoc($imgs)) {
$images[] = ($img['k_image'] ?? '-');
}
$hashOne = CryptorHash('1', $work['salt']);
$hashNull = CryptorHash('0', $work['salt']);
$us = FetchAssoc(dbquery("SELECT * FROM `users` WHERE `id` = ?", [$work['user_work']]));
$count_rt = DataResult(dbquery("SELECT COUNT(*) AS total_count FROM `rating` WHERE `k_work` = ?", [$id]));
$order_work = null;
if ($user['id'] !== null && $work['user_work'] !== null) {
$order_work = FetchAssoc(dbquery("SELECT * FROM `works_transact_orders` WHERE `worker` = ? AND `us` = ? AND `k_work` = ?", [$user['id'], $work['user_work'], $id]));
}
$work_process = FetchAssoc(dbquery("SELECT * FROM `work_processed` WHERE `k_order` = ?", [$order_work['deal_order'] ?? '']));
$checkWorkProcess = DataResult(dbquery("SELECT COUNT(*) AS total_count FROM `work_processed` WHERE `worker` = ? AND `creator` = ? AND `stade` = 1", [$user['id'], $work['user_work']]), 0);
$count_transact_user = DataResult(dbquery("SELECT COUNT(*) FROM `transactions` WHERE `us` = ?", [$user['id']]), 0);
$blocks = getWorkBlocks($work, $work_process, $user, $users_perms, $hashNull, $hashOne, $order_work);
if (isset($user['id'])) {
// Генерация ключа заказа
$orderDigits = OrderGenKey();
// Оплата заказа
if (isset($_POST['pay'])) {
check_csrf();
processWorkPurchase($user, $work, $work_process, $checkWorkProcess, $orderDigits, $id, $us, $count_transact_user);
}
// Скрыть работу
if (isset($_POST['non-eye-work'])) {
check_csrf();
if ($work['user_work'] == $user['id'] || $users_perms['edit_works'] == 1) {
updateWorkVisibility($id, '1', $work['salt']);
} else {
showAlert('Ошибка', 'fail', 'Вы не можете скрыть чужое объявление!');
ReloadPage();
}
}
// Показать работу
if (isset($_POST['set-on-eye-work'])) {
check_csrf();
if ($work['user_work'] == $user['id'] || $users_perms['edit_works'] == 1) {
updateWorkVisibility($id, '0', $work['salt']);
} else {
showAlert('Ошибка', 'fail', 'Вы не можете показать чужое объявление!');
ReloadPage();
}
}
// Удалить работу
if (isset($_POST['delete-work'])) {
check_csrf();
if ($work['user_work'] == $user['id'] || $users_perms['edit_works'] == 1) {
deleteWork($id);
} else {
showAlert('Ошибка', 'fail', 'Вы не можете удалить чужое объявление!');
ReloadPage();
}
}
}
// --- Модалки: права ---
$can_order = ($work['user_work'] != $user['id']);
$can_edit = ($work['user_work'] == $user['id'] || $users_perms['edit_works'] == 1);
$section = FetchAssoc(dbquery("SELECT * FROM `section` WHERE `id` = ?", [$work['section']]));
$subcategory = FetchAssoc(dbquery("SELECT * FROM `subcategory` WHERE `id` = ?", [$work['subcategory']]));
$category = FetchAssoc(dbquery("SELECT * FROM `category` WHERE `id` = ?", [$work['category']]));
// --- Хлебные крошки ---
$breadcrumbs = generateBreadcrumbs([
['/', 'Главная'],
['/category' . $work['category'], $category['name']],
['/subcategory' . $work['subcategory'], $subcategory['name']],
['/section' . $work['section'], $section['name']],
['#', $work['name_work']]
]);
// --- Сайдбар ---
include $_SERVER['DOCUMENT_ROOT'] . '/core/elements/sidebars/work.php';
// --- Галерея ---
$images = $images;
// --- Комментарии ---
$comments_limit = 20;
$q = dbquery("
SELECT *
FROM rating
WHERE k_work = ?
ORDER BY id DESC
LIMIT ?
", [$id, $comments_limit]);
$comments = [];
while ($rt = FetchAssoc($q)) {
$ank_rating = FetchAssoc(dbquery("SELECT * FROM users WHERE id = ?", [$rt['us']]));
include $_SERVER['DOCUMENT_ROOT'] . '/core/elements/comment-box.php';
$comments[] = $comment_box;
}
$show_more_comments = ($count_rt > $comments_limit);
// --- Рендер ---
$page_html = $view->render('pages/work/work.html', [
'breadcrumbs_html' => $breadcrumbs['html'],
'breadcrumbs_json' => $breadcrumbs['json_ld'],
'csrf' => $_SESSION['csrf_token'],
'work' => [
'id' => $id,
'name' => nl2br(chars($work['name_work'])),
'desc' => nl2br(chars($work['desc_work']))
],
'images' => $images,
'non_image' => homeLink() . '/core/templates/' . $theme . '/images/work/non-image.png',
'sidebar' => $sidebar,
'can_order' => $can_order,
'can_edit' => $can_edit,
'comments' => $comments,
'comments_limit' => $comments_limit,
'show_more_comments' => $show_more_comments,
'home' => homeLink()
]);
require_once ($_SERVER['DOCUMENT_ROOT'] . '/layout.php');
?>
<script>
const track = document.getElementById("galleryTrack");
const prev = document.getElementById("galleryPrev");
const next = document.getElementById("galleryNext");
let index = 0;
const total = track.children.length;
// === Управление видимостью стрелок ===
function updateArrows() {
if (total <= 1) {
prev.style.display = "none";
next.style.display = "none";
return;
}
if (index === 0) {
prev.style.display = "none";
next.style.display = "flex";
} else if (index === total - 1) {
prev.style.display = "flex";
next.style.display = "none";
} else {
prev.style.display = "flex";
next.style.display = "flex";
}
}
function updateGallery() {
track.style.transform = `translateX(-${index * 100}%)`;
updateArrows();
}
// === Клики ===
next.onclick = () => {
if (index < total - 1) index++;
updateGallery();
};
prev.onclick = () => {
if (index > 0) index--;
updateGallery();
};
// === Свайп для телефона ===
let startX = 0;
track.addEventListener("touchstart", e => {
startX = e.touches[0].clientX;
});
track.addEventListener("touchend", e => {
let endX = e.changedTouches[0].clientX;
let diff = startX - endX;
if (diff > 50 && index < total - 1) {
index++;
} else if (diff < -50 && index > 0) {
index--;
}
updateGallery();
});
// === Инициализация ===
updateArrows();
</script>
<script>
$(document).on('click', '#load-more-work-comments', function() {
let btn = $(this);
let offset = parseInt(btn.data('offset'));
let id = btn.data('id');
$.ajax({
url: '/core/ajax/work/load_more_comments.php',
type: 'POST',
dataType: 'json',
data: { id: id, offset: offset },
success: function(res) {
$('.comments-list-work').append(res.html);
if (!res.show_more) {
btn.remove();
} else {
btn.data('offset', offset + 20);
}
}
});
});
</script>
<script>
$(document).ready(function() {
// Универсальная функция проверки статуса
function checkHeartStatus(workId, userId) {
$.ajax({
url: '/core/ajax/cart/check_in_cart.php',
type: 'POST',
dataType: 'json',
data: { work_id: workId, user_id: userId },
success: function(response) {
let icon = $('#set-hreat i');
if (!icon.length) return; // если кнопки нет — выходим
if (response.success) {
icon.removeClass('far').addClass('fas'); // красное сердце
} else {
icon.removeClass('fas').addClass('far'); // пустое сердце
}
},
error: function(xhr, status, error) {
console.error('Ошибка сети:', error);
}
});
}
// Проверяем статус при загрузке страницы
checkHeartStatus(<?= $id ?>, <?= $user['id'] ?>);
// Делегирование — работает даже если элемент появляется позже
$(document).on('click', '#set-hreat', function(e) {
e.preventDefault();
let icon = $('#set-hreat i');
if (!icon.length) return;
let isInCart = icon.hasClass('fas'); // есть ли в избранном
let url = isInCart
? '/core/ajax/cart/remove_from_cart.php'
: '/core/ajax/cart/add_to_cart.php';
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
data: { work_id: <?= $id ?>, user_id: <?= $user['id'] ?> },
success: function(response) {
if (response.success) {
if (isInCart) {
icon.removeClass('fas').addClass('far'); // убрали
} else {
icon.removeClass('far').addClass('fas'); // добавили
}
}
},
error: function(xhr, status, error) {
console.error('Ошибка сети:', error);
}
});
});
});
</script>