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 @@ - + -