Вход Регистрация
Файл: 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(0count($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($uploadDir0777true);

        foreach (
$_FILES['images']['name'] as $key => $nameFile) {
            if (
$_FILES['images']['error'][$key] !== UPLOAD_ERR_OK) continue;

            
$ext strtolower(pathinfo($nameFilePATHINFO_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 === && 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 >= && 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>
Онлайн: 5
Реклама