From b48aeaba0fb120caa05c4391933633d72f0c5807 Mon Sep 17 00:00:00 2001 From: Repellent Date: Thu, 15 Jan 2026 17:54:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=8C=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=20=D0=B2=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/comment.php | 191 ++++++++++++---------- templates/admin_comments.tpl | 296 ++++++++++++++++++++++++++--------- 2 files changed, 327 insertions(+), 160 deletions(-) diff --git a/class/comment.php b/class/comment.php index 60b7550..70034bf 100644 --- a/class/comment.php +++ b/class/comment.php @@ -1331,102 +1331,129 @@ function commentPostDelete($comment_id) * * @param string $tpl_dir - путь к шаблонам модуля */ - function commentAdminListShow($tpl_dir) - { - global $AVE_DB, $AVE_Template; - - // Используем оператор объединения с null для PHP 8.4 - $request_sort = $_REQUEST['sort'] ?? ''; - $session_id = SESSION ?? ''; +function commentAdminListShow($tpl_dir) +{ + global $AVE_DB, $AVE_Template; + + $session_id = SESSION ?? ''; - // Получаем общее количество комментариев - $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info")->GetCell(); + // --- ОБРАБОТКА (Иконки и Кнопка "Применить") --- + $action = $_REQUEST['admin_action'] ?? ''; + $items = []; - // Определяем количество страниц, учитывая параметр _limit, который опроеделяет количество - // комментариев отображаемых на одной странице - @$seiten = @ceil($num / $this->_limit); - $start = get_current_page() * $this->_limit - $this->_limit; + // Собираем ID из разных источников для универсальности + if (!empty($_REQUEST['ids'])) { + // Если пришли ID через запятую (массово) + $items = explode(',', $_REQUEST['ids']); + } elseif (!empty($_REQUEST['id'])) { + // Если пришел один ID (иконка) + $items = (is_array($_REQUEST['id'])) ? $_REQUEST['id'] : [$_REQUEST['id']]; + } - $docs = array(); + if (!empty($action) && !empty($items)) { + $ids = array_map('intval', $items); + $id_list = implode(',', $ids); - $def_sort = 'ORDER BY doc.Id DESC'; - $def_nav = ''; + switch ($action) { + case 'approve': + case 'set_status_1': + $AVE_DB->Query("UPDATE " . PREFIX . "_module_comment_info SET comment_status = '1' WHERE Id IN ($id_list)"); + break; + case 'unapprove': + case 'set_status_0': + $AVE_DB->Query("UPDATE " . PREFIX . "_module_comment_info SET comment_status = '0' WHERE Id IN ($id_list)"); + break; + case 'delete': + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_comment_info WHERE Id IN ($id_list)"); + break; + } + header("Location: index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp=" . $session_id); + exit; + } - // Определяем условия сортировки комментариев - if (!empty($request_sort)) - { - switch ($request_sort) - { - case 'document_desc': - $def_sort = 'ORDER BY doc.Id ASC'; - $def_nav = '&sort=document_desc'; - break; + // --- ОРИГИНАЛЬНАЯ ЛОГИКА ВЫВОДА --- + $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info")->GetCell(); + $limit = $this->_limit; + $seiten = ceil($num / $limit); + $start = get_current_page() * $limit - $limit; - case 'document': - $def_sort = 'ORDER BY doc.Id DESC'; - $def_nav = '&sort=document'; - break; + $sql = $AVE_DB->Query(" + SELECT cmnt.*, doc.document_title + FROM " . PREFIX . "_module_comment_info AS cmnt + LEFT JOIN " . PREFIX . "_documents AS doc ON doc.Id = cmnt.document_id + ORDER BY cmnt.comment_published DESC + LIMIT " . (int)$start . "," . (int)$limit + ); - case 'comment_desc': - $def_sort = 'ORDER BY cmnt.comment_text ASC'; - $def_nav = '&sort=comment_desc'; - break; + $docs = array(); + $format = "%d %B %Y, %H:%M"; - case 'comment': - $def_sort = 'ORDER BY cmnt.comment_text DESC'; - $def_nav = '&sort=comment'; - break; + while ($row = $sql->FetchAssocArray()) { + $name = !empty($row['comment_author_name']) ? stripslashes($row['comment_author_name']) : 'Guest'; + if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0) { + $row['avatar'] = getAvatar($row['comment_author_id'], 48); + } else { $row['avatar'] = ''; } - case 'created_desc': - $def_sort = 'ORDER BY cmnt.comment_published ASC'; - $def_nav = '&sort=created_desc'; - break; + if (empty($row['avatar']) || strpos($row['avatar'], 'user.png') !== false) { + $row['avatar'] = ''; + $row['first_letter'] = mb_strtoupper(mb_substr(trim($name), 0, 1, 'UTF-8')); + $row['avatar_color_index'] = (abs(crc32($name)) % 12) + 1; + } - case 'created': - $def_sort = 'ORDER BY cmnt.comment_published DESC'; - $def_nav = '&sort=created'; - break; - } - } + // --- ОБРАБОТКА ФАЙЛОВ ДЛЯ АДМИНКИ --- + $row['images'] = []; + $row['files'] = []; + if (!empty($row['comment_file'])) { + $img_exts = ['jpg', 'jpeg', 'png', 'gif', 'webp']; + $all_files = explode(',', $row['comment_file']); + + foreach ($all_files as $f_name) { + $f_name = trim($f_name); + if (!$f_name) continue; - // Выполняем запрос к БД на получение комметариев с учетом параметров сортировки и лимита. - $sql = $AVE_DB->Query(" - SELECT - doc.Id, - doc.document_title, - cmnt.Id AS CId, - cmnt.document_id, - cmnt.comment_text, - cmnt.comment_published, - cmnt.comment_status - FROM - " . PREFIX . "_module_comment_info AS cmnt - JOIN - " . PREFIX . "_documents AS doc - ON doc.Id = cmnt.document_id - " . $def_sort . " - LIMIT " . $start . "," . $this->_limit - ); + $ext = strtolower(pathinfo($f_name, PATHINFO_EXTENSION)); + + // Чистим имя (убираем временную метку _12345678) + $clean_name = preg_replace('/_[0-9]+(?=\.[a-z0-9]+$)/i', '', $f_name); - while ($row = $sql->FetchAssocArray()) - { - $row['Comments'] = $this->_commentPostCountGet($row['Id']); - array_push($docs, $row); - } + $file_data = [ + 'orig_name' => $f_name, + 'clean_name' => $clean_name, + 'ext' => $ext + ]; - // Если количество комментариев полученных из БД превышает допустимое на странице, тогда формируем - // меню постраницной навигации - if ($num > $this->_limit) - { - $page_nav = ' {t} '; - $page_nav = get_pagination($seiten, 'page', $page_nav); - $AVE_Template->assign('page_nav', $page_nav); - } + if (in_array($ext, $img_exts)) { + $row['images'][] = $file_data; + } else { + $row['files'][] = $file_data; + } + } + } + // ------------------------------------ - // Передаем данные в шаблон для вывода и отображаем шаблон - $AVE_Template->assign('docs', $docs); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_comments_tpl)); - } + $row['CId'] = $row['Id']; + $row['comment_text'] = stripslashes($row['comment_text']); + $ts_pub = (int)$row['comment_published']; + $row['date_pub'] = ($ts_pub > 0) ? pretty_date(ave_date_format($format, $ts_pub)) : '—'; + $ts_changed = (int)$row['comment_changed']; + $row['date_edit'] = ($ts_changed > 0 && $ts_changed > $ts_pub) ? pretty_date(ave_date_format($format, $ts_changed)) : ''; + + $row['user_rating'] = (int)($row['user_rating'] ?? 0); + $row['rating_sum'] = (int)($row['rating_sum'] ?? 0); + $row['r_count'] = (int)($row['rating_count'] ?? 0); + $row['star_public'] = ($row['r_count'] > 0) ? round($row['rating_sum'] / $row['r_count']) : 0; + + $docs[] = $row; + } + + $AVE_Template->assign([ + 'docs' => $docs, + 'page_nav' => ($num > $limit) ? get_pagination($seiten, 'page', ' {t} ') : '', + 'sess' => $session_id + ]); + + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_comments_tpl)); +} /** * Метод, предназначенный для редактирования комментариев в Административной части. diff --git a/templates/admin_comments.tpl b/templates/admin_comments.tpl index d8f7591..3d31757 100644 --- a/templates/admin_comments.tpl +++ b/templates/admin_comments.tpl @@ -1,89 +1,229 @@ - + -
{#COMMENT_MODULE_NAME#}
+
{#COMMENT_MODULE_NAME#} (Всего: {$docs|count})
-
-
- {#COMMENT_MODULE_COMENTS#} +
+
+
{#COMMENT_MODULE_COMENTS#}
+ +
+ + + + + + + + + + + + {if $docs} + {foreach from=$docs item=row} + + + + + + + {/foreach} + {else} + + {/if} + +
IDДанные АвтораТекст комментария и файлы
{$row.CId} +
+
+
+ {if $row.avatar}{else} +
{$row.first_letter}
{/if} +
+ {$row.comment_author_name|escape} +
+
+
+ {section name=s start=1 loop=6}{if $smarty.section.s.index <= $row.user_rating}★{else}{/if}{/section} +
+
📅 {$row.date_pub}
+ {if $row.date_edit}
📝 ред. {$row.date_edit}
{/if} +
🌐 {$row.comment_author_ip}
+
+
+
+
+
+ + {$row.document_title|default:"Документ"|truncate:25} + + [#] к отзыву +
+ + {if $row.comment_status=='1'}Одобрен{else}Скрыт{/if} + + {if $row.comment_status == '1'} + + {else} + + {/if} + + +
+
+ +
{$row.comment_text|nl2br}
+ + {if $row.images || $row.files} +
+ {foreach from=$row.images item=img} +
+
+ + + +
+ {$img.clean_name} +
+ {/foreach} + {foreach from=$row.files item=f} +
+ + {$f.ext|upper} + + + {$f.clean_name} +
+ {/foreach} +
+ {/if} + +
+
+ {section name=s start=1 loop=6}{if $smarty.section.s.index <= $row.star_public}{else}{/if}{/section} +
+ (Голосов: {$row.r_count|default:0}) +
+
+
Список пуст
+ +
+
+ + +
+
+ \ No newline at end of file