Админ теперь правильно удаляет всю ветку
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user