Файл: upload/pages/work/work-edit.php
Строк: 402
<?php
require_once ($_SERVER['DOCUMENT_ROOT'] . '/core/core.php');
if (!isset($user['id'])) {
showAlert('Ошибка', 'fail', 'Сперва необходимо авторизоваться');
RedirectToPage('/');
exit();
}
$id = abs((int)($_GET['id'] ?? 0));
$work = FetchAssoc(dbquery("SELECT * FROM `works` WHERE `id` = ?", [$id]));
if (!$work || $work['user_work'] != $user['id']) {
RedirectToPage('/');
exit();
}
// Текущие изображения
$images = [];
$images_q = dbquery("SELECT * FROM `works_images` WHERE `k_work` = ?", [$id]);
while ($row = FetchAssoc($images_q)) {
$images[] = $row;
}
$oldCount = count($images);
if (isset($_POST['set'])) {
check_csrf();
$name = chars($_POST['name']);
$desc = chars($_POST['desc']);
$cena = intval($_POST['cena']);
$persone = intval($_POST['person']);
$category = intval($_POST['category']);
$section = intval($_POST['section']);
$podr = FetchAssoc(dbquery("SELECT * FROM `section` WHERE `id` = ?", [$section]));
if (mb_strlen($name) < 5) {
showAlert('Ошибка', 'fail', 'Введите название от 5 символов');
ReloadPage();
exit();
}
if (mb_strlen($desc) < 15) {
showAlert('Ошибка', 'fail', 'Введите описание от 15 символов');
ReloadPage();
exit();
}
if ($cena < 1) {
showAlert('Ошибка', 'fail', 'Введите цену');
ReloadPage();
exit();
}
// ============================
// УДАЛЕНИЕ СТАРЫХ ИЗОБРАЖЕНИЙ
// ============================
$deleteImages = isset($_POST['delete_images']) && is_array($_POST['delete_images']) ? $_POST['delete_images'] : [];
$deleteImages = isset($_POST['delete_images']) && is_array($_POST['delete_images']) ? $_POST['delete_images'] : [];
if (!empty($deleteImages)) {
// Уберём дубликаты и пустые
$deleteImages = array_unique(array_filter(array_map('intval', $deleteImages)));
if (!empty($deleteImages)) {
// Сначала достаём все строки разом
$in = implode(',', array_fill(0, count($deleteImages), '?'));
$rows = dbquery("SELECT * FROM `works_images` WHERE `k_work` = ? AND `id` IN ($in)", array_merge([$id], $deleteImages));
$toDeleteFiles = [];
while ($imgRow = FetchAssoc($rows)) {
$toDeleteFiles[] = $imgRow;
}
// Удаляем файлы
foreach ($toDeleteFiles as $imgRow) {
$fileName = $imgRow['k_image'];
if ($fileName !== 'non-image.png') {
$filePath = $_SERVER['DOCUMENT_ROOT'] . "/uploads/works/" . $fileName;
if (is_file($filePath)) {
unlink($filePath);
}
}
if ($fileName === $work['image_work']) {
$work['image_work'] = '';
}
}
// Удаляем строки из БД одним запросом
dbquery("DELETE FROM `works_images` WHERE `k_work` = ? AND `id` IN ($in)", array_merge([$id], $deleteImages));
}
}
// Пересобираем список старых изображений после удаления
$images = [];
$images_q = dbquery("SELECT * FROM `works_images` WHERE `k_work` = ?", [$id]);
while ($row = FetchAssoc($images_q)) {
$images[] = $row;
}
$oldCount = count($images);
// ============================
// ЗАГРУЗКА НОВЫХ ИЗОБРАЖЕНИЙ
// ============================
$uploaded_images = [];
if (!empty($_FILES['images']['name'][0])) {
$allowed_ext = ['jpg','jpeg','png','webp','heic'];
$uploadDir = $_SERVER['DOCUMENT_ROOT'] . "/uploads/works/";
if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true);
foreach ($_FILES['images']['name'] as $key => $nameFile) {
if ($_FILES['images']['error'][$key] !== UPLOAD_ERR_OK) continue;
$ext = strtolower(pathinfo($nameFile, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed_ext)) continue;
$new_name = uniqid($_SERVER['HTTP_HOST'] . "_", true) . "." . $ext;
if (move_uploaded_file($_FILES['images']['tmp_name'][$key], $uploadDir . $new_name)) {
$uploaded_images[] = $new_name;
}
}
}
// Проверка: хотя бы одно изображение должно остаться/быть
if ($oldCount === 0 && empty($uploaded_images) && empty($work['image_work'])) {
showAlert('Ошибка', 'fail', 'Добавьте хотя бы одно изображение');
ReloadPage();
exit();
}
// ============================
// ВЫБОР ГЛАВНОГО ИЗОБРАЖЕНИЯ
// ============================
$newMainFromOld = isset($_POST['main_image_old']) ? trim($_POST['main_image_old']) : '';
$newMainFromNew = isset($_POST['main_image_new']) ? intval($_POST['main_image_new']) : -1;
$currentMain = $work['image_work'];
// Явный выбор старого
if ($newMainFromOld !== '') {
$currentMain = $newMainFromOld;
}
// Явный выбор нового
if ($newMainFromNew >= 0 && isset($uploaded_images[$newMainFromNew])) {
$currentMain = $uploaded_images[$newMainFromNew];
}
// Автовыбор, если главное пустое (вариант B)
if (empty($currentMain)) {
// 1) если есть старые — берём первое
if (!empty($images)) {
$currentMain = $images[0]['k_image'];
}
// 2) если нет старых, но есть новые — берём первое новое
elseif (!empty($uploaded_images)) {
$currentMain = $uploaded_images[0];
}
}
// ============================
// ОБНОВЛЕНИЕ ОБЪЯВЛЕНИЯ
// ============================
dbquery("
UPDATE `works`
SET `name_work` = ?, `desc_work` = ?, `cena_work` = ?, `person_work` = ?,
`image_work` = ?, `category` = ?, `section` = ?, `subcategory` = ?
WHERE `id` = ? AND `user_work` = ?
", [
$name,
$desc,
$cena,
$persone,
$currentMain,
$category,
$section,
$podr['subcategory'],
$id,
$user['id']
]);
// ============================
// ВСТАВКА НОВЫХ ИЗОБРАЖЕНИЙ
// ============================
foreach ($uploaded_images as $img) {
dbquery("INSERT INTO `works_images` (`k_work`, `k_image`) VALUES (?, ?)", [$id, $img]);
}
RedirectToPage('/work' . $id);
exit();
}
// ============================
// ФОРМА
// ============================
$categories = dbquery("SELECT * FROM `category` ORDER BY `id`");
$breadcrumbs = generateBreadcrumbs([
['/', 'Главная'],
['#', 'Редактирование объявления']
]);
// Загружаем категории
$categories_list = [];
while ($c = FetchAssoc($categories)) {
$categories_list[] = [
'id' => $c['id'],
'name' => $c['name']
];
}
// Загружаем секции выбранной категории
$sections_list = [];
$current_section = FetchAssoc(dbquery("SELECT * FROM section WHERE id = ?", [$work['section']]));
if ($current_section) {
$q = dbquery("SELECT * FROM section WHERE category = ?", [$work['category']]);
while ($s = FetchAssoc($q)) {
$sections_list[] = [
'id' => $s['id'],
'name' => $s['name']
];
}
}
// Старые изображения
$old_images = [];
foreach ($images as $img) {
$old_images[] = [
'id' => $img['id'],
'file' => $img['k_image'],
'is_main' => ($img['k_image'] === $work['image_work'])
];
}
$page_html = $view->render('pages/work/edit.html', [
'breadcrumbs_html' => $breadcrumbs['html'],
'breadcrumbs_json' => $breadcrumbs['json_ld'],
'csrf' => $_SESSION['csrf_token'],
'work' => [
'name' => chars($work['name_work']),
'desc' => $work['desc_work'],
'price' => intval($work['cena_work']),
'person' => $work['person_work'],
'category' => $work['category'],
'section' => $work['section']
],
'categories' => $categories_list,
'sections' => $sections_list,
'old_images' => $old_images,
'old_images_count' => $oldCount,
'home' => homeLink()
]);
require_once ($_SERVER['DOCUMENT_ROOT'] . '/layout.php');
?>
<script type="text/javascript">
$(document).ready(function(){
$('#category').change(function(){
var selectedcategoryId = $(this).val();
$.ajax({
url: "/core/get_sections-set-work.php",
method: "POST",
data: { category_id: selectedcategoryId },
success: function(response){
$("#section").html(response);
}
});
});
});
</script>
<script>
// ===============================
// ГЛОБАЛЬНЫЕ ЭЛЕМЕНТЫ
// ===============================
const fileInput = document.getElementById("images");
const previewBox = document.getElementById("previewBox");
const addBtn = document.getElementById("addImagesBtn");
const form = document.getElementById("new_forms");
// новые файлы
let filesArray = [];
// старые изображения (кол-во)
let oldCount = typeof oldImagesCount !== "undefined" ? oldImagesCount : 0;
// ===============================
// КНОПКА ВСЕГДА В КОНЦЕ
// ===============================
function moveAddButtonToEnd() {
if (previewBox && addBtn) {
previewBox.appendChild(addBtn);
}
}
// ===============================
// ОБНОВЛЕНИЕ СОСТОЯНИЯ КНОПКИ
// ===============================
function updateAddButtonState() {
const total = oldCount + filesArray.length;
if (total >= 17) {
addBtn.style.display = "none";
fileInput.disabled = true;
} else {
addBtn.style.display = "flex";
fileInput.disabled = false;
}
moveAddButtonToEnd();
}
updateAddButtonState();
// ===============================
// ДОБАВЛЕНИЕ НОВЫХ ИЗОБРАЖЕНИЙ
// ===============================
addBtn.onclick = () => fileInput.click();
fileInput.addEventListener("change", function (e) {
const newFiles = Array.from(e.target.files);
if (oldCount + filesArray.length + newFiles.length > 17) {
alert("Можно загрузить максимум 17 изображений");
fileInput.value = "";
return;
}
const startIndex = filesArray.length;
filesArray = filesArray.concat(newFiles);
newFiles.forEach((file, i) => {
addNewPreview(file, startIndex + i);
});
updateAddButtonState();
updateInputFiles();
});
// ===============================
// ПРЕДПРОСМОТР НОВЫХ
// ===============================
function addNewPreview(file, index) {
const reader = new FileReader();
reader.onload = function (event) {
const item = document.createElement("div");
item.classList.add("preview-item");
item.dataset.index = index;
item.innerHTML = `
<img src="${event.target.result}" class="preview-img">
<span class="remove-img">×</span>
<div class="make-main-new" data-index="${index}">Сделать главным</div>
`;
previewBox.insertBefore(item, addBtn);
item.querySelector(".remove-img").onclick = () => {
removeNewImage(index, item);
};
item.querySelector(".make-main-new").onclick = () => {
setMainNew(index);
};
moveAddButtonToEnd();
};
reader.readAsDataURL(file);
}
// ===============================
// УДАЛЕНИЕ НОВОГО
// ===============================
function removeNewImage(index, domElement) {
domElement.remove();
filesArray.splice(index, 1);
updateAddButtonState();
updateInputFiles();
const items = previewBox.querySelectorAll(".preview-item:not(.old-item)");
items.forEach((item, newIndex) => {
item.dataset.index = newIndex;
item.querySelector(".remove-img").onclick = () => {
removeNewImage(newIndex, item);
};
const mainBtn = item.querySelector(".make-main-new");
if (mainBtn) {
mainBtn.dataset.index = newIndex;
mainBtn.onclick = () => setMainNew(newIndex);
}
});
moveAddButtonToEnd();
}
// ===============================
// ОБНОВЛЕНИЕ input[type=file]
// ===============================
function updateInputFiles() {
const dt = new DataTransfer();
filesArray.forEach(file => dt.items.add(file));
fileInput.files = dt.files;
}
// ===============================
// СМЕНА ГЛАВНОГО (НОВОЕ)
// ===============================
function setMainNew(index) {
clearMainHidden();
const hidden = document.createElement("input");
hidden.type = "hidden";
hidden.name = "main_image_new";
hidden.value = index;
form.appendChild(hidden);
resetMainVisuals();
const item = document.querySelector(`.preview-item[data-index="${index}"]`);
if (item) addMainBadge(item);
}
// ===============================
// УДАЛЕНИЕ СТАРОГО
// ===============================
document.querySelectorAll(".remove-old").forEach(btn => {
btn.onclick = () => {
let id = btn.dataset.id;
let item = btn.closest(".preview-item");
let hidden = document.createElement("input");
hidden.type = "hidden";
hidden.name = "delete_images[]";
hidden.value = id;
form.appendChild(hidden);
item.remove();
oldCount--;
updateAddButtonState();
};
});
// ===============================
// СМЕНА ГЛАВНОГО (СТАРОЕ)
// ===============================
document.querySelectorAll(".make-main").forEach(btn => {
btn.onclick = () => {
let img = btn.dataset.img;
clearMainHidden();
let hidden = document.createElement("input");
hidden.type = "hidden";
hidden.name = "main_image_old";
hidden.value = img;
form.appendChild(hidden);
resetMainVisuals();
addMainBadge(btn.closest(".preview-item"));
};
});
// ===============================
// ОБЩИЕ ФУНКЦИИ
// ===============================
function clearMainHidden() {
form.querySelectorAll("input[name='main_image_old']").forEach(e => e.remove());
form.querySelectorAll("input[name='main_image_new']").forEach(e => e.remove());
}
function resetMainVisuals() {
document.querySelectorAll(".main-badge").forEach(e => e.remove());
document.querySelectorAll(".make-main").forEach(e => e.style.display = "block");
document.querySelectorAll(".make-main-new").forEach(e => e.style.display = "block");
}
function addMainBadge(item) {
const badge = document.createElement("div");
badge.className = "main-badge";
badge.innerText = "Главное";
item.appendChild(badge);
const btn = item.querySelector(".make-main, .make-main-new");
if (btn) btn.style.display = "none";
}
</script>