diff --git a/README.md b/README.md index 26706b6..5d295c9 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,13 @@ * Два дополнительных поля, их названия и обязательные или нет, настраивааются в Админпанели * Валидация обязательных полей на заполненность + проверка на разрешения для файлов * Комментарий - родитель (ветка комментариев) - * Если на комментарий Автора другие Пользователи сделали ответ, то удалить такой комментарий Автору будет невозможно, за исключением Администратора, вместо этого текст комментария будет заменен на текст Комментарий удален автором. + * Если на комментарий Автора другие Пользователи сделали ответ, то удалить такой комментарий Автору или Администратору в публичной части сайта будет невозможно, вместо этого будет произведено мягкое удаление - удалится все , что относится к данному комментарию (Рейтинги, файлы , текст) и вместо этого будет выводится специальный аватар и текст: Комментарий удален автором либо Комментарий удален администратором. Восстановить данные такого комментария невозможно. +* Удаление комментариев в Админке + * Одиночные комментарии (не имеющие ответов) удаляются сразу и навсегда. + * Комментарии родители (имеющие ответы/ветку ответов) получают два варианта одиночного удаления: + * Мягкое удаление (удалится все , что относится к данному комментарию (Рейтинги, файлы , текст) и вместо этого будет выводится специальный аватар и текст: Комментарий удален администратором. Восстановить данные такого комментария невозможно, + * Жесткое удаление самого комментария и всей ветки ответов на этот комментарий. Администратор выбирает сам какой вариант ему необходим. + * Массовое удаление - одиночные комментарии удаляются сразу, комментарии-родители удаляются Мягким вариантом (с подстановкой текста Комментарий удален Администратором). * Контроль Имен Анонима * Если Анонимный пользователь, в течении жизни куки, сменит имя под которым он опубликовал свой первый комментарий, рядом с именем появится плашка с тултипом в котором будут перечислены все его имена. * Пагинация diff --git a/class/comment.php b/class/comment.php index 9d7aba8..347787a 100644 --- a/class/comment.php +++ b/class/comment.php @@ -1222,33 +1222,68 @@ function commentPostDelete($comment_id) } } - function commentAdminDelete($comment_id) - { - global $AVE_DB; +function commentAdminDelete($comment_id) +{ + global $AVE_DB; + + // 1. Собираем ID в массив (поддерживаем и одиночное, и массовое удаление) + if (is_array($comment_id)) { + $ids = array_map('intval', $comment_id); + } else { + $ids = [(int)$comment_id]; + } + + if (empty($ids)) return; - $comment_id = (int)$comment_id; // Убедимся, что это целое число + // Читаем тип удаления из запроса (для одиночных кликов по иконкам) + // Для массового удаления через кнопку "Применить" этот параметр обычно не передается + $delete_type = $_REQUEST['admin_action_type'] ?? 'auto'; - // Выполняем запрос к БД на удаление родительского комментария - $AVE_DB->Query(" - DELETE - FROM " . PREFIX . "_module_comment_info - WHERE Id = '" . $comment_id . "' - "); + foreach ($ids as $id) { + if ($id <= 0) continue; - // Выполняем запрос к БД на удаление дочерних комментариев (ответов) - $AVE_DB->Query(" - DELETE - FROM " . PREFIX . "_module_comment_info - WHERE parent_id = '" . $comment_id . "' - AND parent_id != 0 - "); - - // Используем оператор объединения с null для PHP 8.4 - $session_id = SESSION ?? ''; - - header('Location:index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp=' . $session_id); - exit; - } + // Проверяем наличие детей + $has_children = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE parent_id = '$id'")->GetCell(); + + // ЛОГИКА СОГЛАСНО ДОГОВОРУ: + // Если тип 'soft' ИЛИ (тип 'auto' и есть дети) — делаем мягкое удаление + if (($delete_type == 'soft') || ($delete_type == 'auto' && $has_children > 0)) { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_comment_info + SET comment_text = '__DEL_BY_ADM__', + comment_author_name = '__DELETED__', + comment_author_id = '0', + comment_file = '', + comment_status = '1', + comment_changed = '" . time() . "' + WHERE Id = '$id' + "); + } + // Если детей нет или принудительно выбран 'full' — удаляем физически + else { + // Собираем дерево (на случай если это Full Delete для родителя) + $all_tree_ids = [$id]; + $parents = [$id]; + while (!empty($parents)) { + $p_str = implode(',', $parents); + $res = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_module_comment_info WHERE parent_id IN ($p_str)"); + $parents = []; + if ($res) { + while ($r = $res->FetchAssocArray()) { + $all_tree_ids[] = (int)$r['Id']; + $parents[] = (int)$r['Id']; + } + } + } + $final_ids_str = implode(',', array_unique($all_tree_ids)); + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id IN ($final_ids_str)"); + } + } + + $session_id = SESSION ?? ''; + header("Location: index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp=" . $session_id); + exit; +} /** * Метод, предназначенный для вывода детальной информации об авторе комментария @@ -1396,9 +1431,9 @@ function commentAdminListShow($tpl_dir) case 'set_status_0': $AVE_DB->Query("UPDATE " . PREFIX . "_module_comment_info SET comment_status = '0' WHERE Id IN ($final_id_list)"); break; - case 'delete': - $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id IN ($final_id_list)"); - break; + //case 'delete': + // $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id IN ($final_id_list)"); + //break; } header("Location: index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp=" . $session_id); exit; diff --git a/lang/ru.txt b/lang/ru.txt index ceeaaee..b4e44bf 100644 --- a/lang/ru.txt +++ b/lang/ru.txt @@ -215,4 +215,7 @@ COMMENT_SET_MAIN_TAG = "Основной тег (выводит форму COMMENT_SET_ADDIT_TAG = "Доп. тег (выводит X последних комментариев):" COMMENT_SET_ADDIT_TAG_NUM = "(X - число выводимых комментариев)" COMMENT_SET_COPY = "Скопировать в буфер обмена" -COMMENT_SET_GEN = "Общие настройки" \ No newline at end of file +COMMENT_SET_GEN = "Общие настройки" +COMMENT_TEXT_DEL_BY_ADMIN = "Комментарий удален администратором." +COMMENT_TEXT_DEL_BY_AUTHOR = "Комментарий удален автором." +COMMENT_STATUS_DELETED = "Удалено" diff --git a/module.php b/module.php index 25c582c..349ee53 100644 --- a/module.php +++ b/module.php @@ -171,10 +171,11 @@ if (defined('ACP') && !empty($_REQUEST['moduleaction'])) $comment->commentAdminSettingsEdit($tpl_dir); break; - case 'admin_del': - $comment->commentAdminDelete((int)$_REQUEST['Id']); - break; - } + case 'admin_del': + $comment_id = $_REQUEST['id'] ?? $_REQUEST['Id']; + $comment->commentAdminDelete($comment_id); + break; + } } ?> \ No newline at end of file diff --git a/templates/admin_comments.tpl b/templates/admin_comments.tpl index 2f2548d..f6fda65 100644 --- a/templates/admin_comments.tpl +++ b/templates/admin_comments.tpl @@ -1,32 +1,18 @@
| - | ID | -Данные Автора | -Текст комментария и файлы | ++ | ID | +Статус | +Автор и Рейтинг | +IP адрес | +Дата Создания / Редактирования | +Текст комментария | +Файлы | +Действия |
| {$row.CId} | ++ {if $row.comment_status == '1'} + + {else} + + {/if} + | -- | ||||||||||
| - - | -||||||||||||
| + + | +||||||||||||