diff --git a/class/comment.php b/class/comment.php index a81e53e..f3740b0 100644 --- a/class/comment.php +++ b/class/comment.php @@ -671,15 +671,12 @@ function commentPostDelete($comment_id) { global $AVE_DB; - // Очищаем буфер вывода. Если ядро системы уже что-то начало выводить, - // это может помешать чистому AJAX-ответу. if (ob_get_level()) ob_end_clean(); $comment_id = (int)$comment_id; if ($comment_id <= 0) die('Ошибка: Неверный ID'); // --- ШАГ 0. ПОЛУЧЕНИЕ ДАННЫХ И ПРОВЕРКА ПРАВ --- - $comment_data = $AVE_DB->Query(" SELECT comment_author_id, anon_key, comment_published, comment_file FROM " . PREFIX . "_module_comment_info @@ -688,23 +685,17 @@ function commentPostDelete($comment_id) if (!$comment_data) die('Ошибка: Комментарий не найден'); - // Определяем пользователя и его группу (приоритет сессии над константой) $current_user_id = (int)($_SESSION['user_id'] ?? 0); $user_group = (int)($_SESSION['user_group'] ?? (defined('UGROUP') ? UGROUP : 0)); $anon_key = $this->_getAnonKey(); $can_delete = false; - // 1. ПРАВО АДМИНА if ($user_group === 1) { $can_delete = true; - } - else { - // 2. ПРАВО АВТОРА (профиль или анонимный ключ) + } else { $is_author = ($current_user_id > 0 && $current_user_id == $comment_data['comment_author_id']) || ($comment_data['comment_author_id'] == 0 && !empty($comment_data['anon_key']) && $comment_data['anon_key'] == $anon_key); - - // Проверяем ограничение по времени из конфигурации модуля $is_time_ok = (time() - (int)$comment_data['comment_published'] < $this->conf_edit_time); if ($is_author && $is_time_ok) { @@ -713,57 +704,68 @@ function commentPostDelete($comment_id) } if (!$can_delete) { - // Вместо редиректа отдаем статус 403, чтобы JS-обработчик понял причину header('HTTP/1.1 403 Forbidden'); - die('Доступ запрещен или время на удаление истекло'); + die('Доступ запрещен'); } // --- ШАГ 1. ПРОВЕРКА НАЛИЧИЯ ОТВЕТОВ --- - - $has_children = $AVE_DB->Query(" - SELECT COUNT(*) - FROM " . PREFIX . "_module_comment_info - WHERE parent_id = '" . $comment_id . "' - ")->GetCell(); - + $has_children = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE parent_id = '" . $comment_id . "'")->GetCell(); $upload_dir = BASE_DIR . '/uploads/comments/'; - if ($has_children > 0) { - // --- ВАРИАНТ А: МЯГКОЕ УДАЛЕНИЕ (есть ответы) --- - + // Мягкое удаление ТОЛЬКО для авторов, если есть ответы + if ($has_children > 0 && $user_group != 1) { if (!empty($comment_data['comment_file'])) { - $file_path = $upload_dir . $comment_data['comment_file']; - if (file_exists($file_path)) @unlink($file_path); + if (file_exists($upload_dir . $comment_data['comment_file'])) @unlink($upload_dir . $comment_data['comment_file']); } $del_text = "Комментарий удален автором."; $AVE_DB->Query(" UPDATE " . PREFIX . "_module_comment_info - SET - comment_text = '" . addslashes($del_text) . "', - comment_file = '', - anon_key = '', - comment_changed = '" . time() . "' + SET comment_text = '" . addslashes($del_text) . "', comment_file = '', anon_key = '', comment_changed = '" . time() . "' WHERE Id = '" . $comment_id . "' "); - echo "OK_SOFT"; } else { - // --- ВАРИАНТ Б: ПОЛНОЕ УДАЛЕНИЕ (ответов нет) --- + // --- ВАРИАНТ Б: ПОЛНОЕ УДАЛЕНИЕ (Для админа или если нет детей) --- - if (!empty($comment_data['comment_file'])) { - $file_path = $upload_dir . $comment_data['comment_file']; - if (file_exists($file_path)) @unlink($file_path); + // Собираем массив ID для удаления. Сразу кладем туда родителя. + $ids_to_delete = [$comment_id]; + + // Если удаляет Админ, ищем ВСЮ ветку (любой вложенности) + if ($user_group == 1) { + $all_child_ids = []; + $parent_ids = [$comment_id]; + + // Рекурсивный поиск всех уровней вложенности + while (!empty($parent_ids)) { + $ids_string = implode(',', array_map('intval', $parent_ids)); + $res = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_module_comment_info WHERE parent_id IN ($ids_string)"); + + $parent_ids = []; // Сбрасываем для следующего уровня + while ($row = $res->FetchAssocArray()) { + $all_child_ids[] = (int)$row['Id']; + $parent_ids[] = (int)$row['Id']; + } + } + $ids_to_delete = array_merge($ids_to_delete, $all_child_ids); } - $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id = '" . $comment_id . "'"); - + // 1. Удаляем файлы всех комментариев из списка удаления + $final_ids_str = implode(',', $ids_to_delete); + $files_res = $AVE_DB->Query("SELECT comment_file FROM " . PREFIX . "_module_comment_info WHERE Id IN ($final_ids_str)"); + while ($f = $files_res->FetchAssocArray()) { + if (!empty($f['comment_file'])) { + $f_path = $upload_dir . $f['comment_file']; + if (file_exists($f_path)) @unlink($f_path); + } + } + + // 2. Удаляем все записи из БД одним запросом + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id IN ($final_ids_str)"); + echo "OK"; } - - // Использование die() гарантирует, что ядро AVE.cms не сделает - // автоматический редирект (302), который вызывал ошибку ERR_TOO_MANY_REDIRECTS. die(); }