Админ теперь правильно удаляет всю ветку

This commit is contained in:
2025-12-20 17:40:33 +05:00
parent 866c6a98ad
commit 4ece03dd74

View File

@@ -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 = "<span class='comment-deleted'>Комментарий удален автором.</span>";
$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();
}