diff --git a/README.md b/README.md index 06bc5c9..2013a2c 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ * Если Анонимный пользователь, в течении жизни куки, сменит имя, под которым он опубликовал свой первый комментарий, рядом с именем появится плашка с тултипом в котором будут перечислены все его имена. * Пагинация * Пагинация работает только для родительских комментариев, количество ответов (дети и внуки) на родительский комментарий - задается в Админ панели отдельно. Если общее количество ответов превышает лимит ответов, установленный в Админке, будет выведена кнопка Показать еще N ответов, при клике по которой AJAX подгрузит и выведет оставшиеся комментарии на страницу. + * Добавлен выбор шаблонов пагинации * Сортировка * В админ панели доступен поиск комментария по следующим параметрам: по Имени, IP адресу, по тексту комментария. Сортировка: сначала новые, сначала старые, популярные (согласно Рейтингу пользователей), обсуждаемые - по количеству ответов на комментарий-родитель, оценки Автора (у кого больше всех звезд). Фильтрация: выводить все сообщения, только с файлами, только скрытые. Вывод комментариев по умолчанию - плоский список, но для удобства есть и древовидный список, что позволяет видеть сразу всю ветку. Количество на странице: выводит желаемое количество комментариев на страницу. Период: вам доступен календарь, в котором вы сами выбираете нужный вам период для просмотра - от и до. * В публичной части также можно менять вывод комментариев (выбирается в Настройках модуля): diff --git a/class/comment.php b/class/comment.php index 9c4cb2c..ae40506 100644 --- a/class/comment.php +++ b/class/comment.php @@ -352,11 +352,9 @@ function commentListShow($tpl_dir) $sort_setting = $settings['comment_sort_order'] ?? 'ASC'; switch ($sort_setting) { case 'USER_RATING': - // Сначала самые высокие оценки автора (5 звезд), затем дата $sql_sort = "user_rating DESC, comment_published DESC"; break; case 'RATING': - // Сначала самые залайканные пользователями, затем дата $sql_sort = "rating_sum DESC, comment_published DESC"; break; case 'DESC': @@ -368,7 +366,6 @@ function commentListShow($tpl_dir) break; } - // ОПРЕДЕЛЯЕМ НАПРАВЛЕНИЕ ДЛЯ ID (чтобы не было конфликта при одинаковых датах) $final_direction = (stripos($sql_sort, 'DESC') !== false) ? 'DESC' : 'ASC'; if ($settings['comment_use_page_nav'] == 1) @@ -387,7 +384,7 @@ function commentListShow($tpl_dir) // Считаем только РОДИТЕЛЕЙ для пагинации $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' AND parent_id = '0' " . $where_visibility)->GetCell(); - // Основной запрос (сортировка применяется к родителям в подзапросе) + // Основной запрос $sql = $AVE_DB->Query(" SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' @@ -400,26 +397,44 @@ function commentListShow($tpl_dir) ORDER BY " . $sql_sort . ", Id " . $final_direction . " "); - if ($num > $limit) + // --- НАЧАЛО ИСПРАВЛЕННОГО БЛОКА ПАГИНАЦИИ --- + $num_pages = ($limit > 0) ? ceil($num / $limit) : 1; + + if ($num > $limit && $num_pages > 1) { - $page_nav = '{t} '; - - $total_pages = ceil($num / $limit); - $page_nav = get_pagination($total_pages, 'page', $page_nav, get_settings('navi_box')); + // Синхронизируем страницу в глобальном массиве + @$GLOBALS['page_id'][$document_id]['page'] = (isset($GLOBALS['page_id'][$document_id]['page']) && $GLOBALS['page_id'][$document_id]['page'] > $num_pages) ? @$GLOBALS['page_id'][$document_id]['page'] : $num_pages; + + // Формируем базовый URL + $pagination_base = 'index.php?id=' . $document_id . + '&doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias) . + '&page={s}'; + + $pagination_params = ((isset($artpage) && is_numeric($artpage)) ? '&artpage=' . $artpage : '') . + ((isset($apage) && is_numeric($apage)) ? '&apage=' . $apage : ''); + + $pagination_full = $pagination_base . $pagination_params; + + // ID шаблона пагинации из настроек + $pagination_id = (int)($settings['comment_pagination'] ?? 1); + + // Вызов через класс ядра + $page_nav = AVE_Paginations::getPagination($num_pages, 'page', $pagination_full, $pagination_id); + + // Очистка и ЧПУ-обработка $page_nav = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($page_nav))); + $page_nav = str_ireplace('"//' . (defined('URL_SUFF') ? URL_SUFF : '.html') . '"', '"/"', $page_nav); $page_nav = preg_replace('/(? $total_pages ? $GLOBALS['page_id'][$document_id]['page'] : $total_pages); } - else { $page_nav = ''; } + else + { + $page_nav = ''; + } + // --- КОНЕЦ ИСПРАВЛЕННОГО БЛОКА --- } } else { - // Если навигация отключена $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . $where_visibility . " ORDER BY " . $sql_sort . ", Id " . $final_direction); $page_nav = ''; } @@ -438,7 +453,6 @@ function commentListShow($tpl_dir) ]; } - // Аватар if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0) { $row['avatar'] = getAvatar($row['comment_author_id'], 48); } else { @@ -455,7 +469,6 @@ function commentListShow($tpl_dir) $row['avatar_color_index'] = (abs(crc32($name)) % 12) + 1; } - // --- ТАЙМЕР И ПРАВА --- $row['can_edit'] = 0; $is_admin = ($user_group === 1); $is_author = ($current_user_id > 0 && $current_user_id == $row['comment_author_id']) || @@ -475,7 +488,6 @@ function commentListShow($tpl_dir) } $row['is_my_own'] = $is_author; - // История имен $row['past_names'] = []; if (!empty($row['anon_key'])) { $row['past_names'] = $this->_getAnonNamesHistory($row['anon_key'], $row['comment_author_name']); @@ -499,7 +511,6 @@ function commentListShow($tpl_dir) $page_nav = ''; } - // --- СНАЧАЛА ДЕТИ ВСЕГДА ОТ СТАРЫХ К НОВЫМ (Причесываем всю очередь) --- if (!empty($comments)) { foreach ($comments as $parentId => &$subList) { if ($parentId > 0) { @@ -511,7 +522,6 @@ function commentListShow($tpl_dir) unset($subList); } - // --- И ТОЛЬКО ПОТОМ AJAX ЛИМИТЫ (Отрезаем лишнее от уже правильной очереди) --- $assign['more_counts'] = []; $requested_branch = (int)($_REQUEST['ajax_load_branch'] ?? 0); @@ -522,7 +532,6 @@ function commentListShow($tpl_dir) continue; } $assign['more_counts'][$parentId] = count($subList) - $assign['ajax_replies_limit']; - // Теперь array_slice заберет именно ПЕРВЫЕ (старые) ответы $comments[$parentId] = array_slice($subList, 0, $assign['ajax_replies_limit']); } } @@ -2204,7 +2213,8 @@ function commentAdminSettingsEdit($tpl_dir) $post_max_chars = $_POST['comment_max_chars'] ?? 0; $post_user_groups = $_POST['comment_user_groups'] ?? array(); $post_user_groups_read = $_POST['comment_user_groups_read'] ?? array(); - $post_allow_self_answer = $_POST['comment_allow_self_answer'] ?? 0; + $post_allow_self_answer = $_POST['comment_allow_self_answer'] ?? 0; + $post_pagination = $_POST['comment_pagination'] ?? 1; // Порядок сортировки $post_sort_order = $_POST['comment_sort_order'] ?? 'ASC'; @@ -2277,6 +2287,7 @@ function commentAdminSettingsEdit($tpl_dir) comment_use_antispam = '" . (int)$post_use_antispam . "', comment_use_page_nav = '" . (int)$post_use_page_nav . "', comment_page_nav_count = '" . (int)$post_page_nav_count . "', + comment_pagination = '" . (int)$post_pagination . "', comment_ajax_replies_limit = '" . (int)$post_ajax_replies_limit . "', comment_allow_self_answer = '" . (int)$post_allow_self_answer . "', comment_sort_order = '" . $sort_order . "', @@ -2316,6 +2327,12 @@ function commentAdminSettingsEdit($tpl_dir) } // Получаем данные для отображения в шаблоне + $paginations = array(); + $sql_pag = $AVE_DB->Query("SELECT id, pagination_name FROM " . PREFIX . "_paginations ORDER BY id ASC"); + while ($p_row = $sql_pag->FetchRow()) { + $paginations[] = $p_row; + } + $AVE_Template->assign('paginations', $paginations); $row = $this->_commentSettingsGet(); $row['comment_user_groups'] = explode(',', $row['comment_user_groups']); diff --git a/info.php b/info.php index 7f3890e..ff00090 100644 --- a/info.php +++ b/info.php @@ -3,7 +3,7 @@ if (!defined('BASE_DIR')) exit; $module = array( 'ModuleSysName' => 'comment', - 'ModuleVersion' => '3.35', + 'ModuleVersion' => '3.36', 'ModuleAutor' => 'Repellent', 'ModuleCopyright' => '© 2025-' . date('Y') . ' ave4cms.ru', 'ModuleStatus' => 1, diff --git a/lang/ru.txt b/lang/ru.txt index 063e39d..f9ec4ef 100644 --- a/lang/ru.txt +++ b/lang/ru.txt @@ -323,4 +323,5 @@ COMMENT_ADD_FILES_ALLOW = "Разрешены:" COMMENT_ADD_FILES_MAX_SIZE = "Макс. размер:" COMMENT_ADD_FILES_SIZE = "KB" COMMENT_ADD_FILES_MAX_COUNT = "Макс. количество:" -COMMENT_ADD_FILES_COUNT_PIC = "шт." \ No newline at end of file +COMMENT_ADD_FILES_COUNT_PIC = "шт." +COMMENT_NAVI_TPL = "Шаблон постраничной навигации" \ No newline at end of file diff --git a/sql.php b/sql.php index f9fdec3..a812c10 100644 --- a/sql.php +++ b/sql.php @@ -5,6 +5,7 @@ * AVE.cms - Модуль Комментарии * Исправлено: Поддержка Emoji (utf8mb4) * Добавлено: Управление логом опасных файлов + * Добавлено: Выбор шаблона пагинации (comment_pagination) */ $module_sql_install = array(); @@ -28,6 +29,7 @@ `comment_use_antispam` enum('1','0') NOT NULL DEFAULT '1', `comment_use_page_nav` enum('1','0') NOT NULL DEFAULT '1', `comment_page_nav_count` varchar(5) NOT NULL, + `comment_pagination` tinyint(3) unsigned NOT NULL DEFAULT '1', `comment_show_f1` tinyint(1) NOT NULL DEFAULT '1', `comment_req_f1` tinyint(1) NOT NULL DEFAULT '0', `comment_name_f1` varchar(255) NOT NULL DEFAULT '', @@ -100,8 +102,7 @@ ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PACK_KEYS=0 AUTO_INCREMENT=1; "; - // Добавлена 0 в конце (для comment_log_dangerous) - $module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '', 1, 0, '', 1, 0, '', 0, 'jpg,jpeg,png,gif,webp', 2048, 5, 0, 1, 0, 0, 0, 0, 60, 30, 5, 0, 'ASC', 0);"; + $module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '', 1, 1, 0, '', 1, 0, '', 0, 'jpg,jpeg,png,gif,webp', 2048, 5, 0, 1, 0, 0, 0, 0, 60, 30, 5, 0, 'ASC', 0);"; $module_sql_update[] = " UPDATE `%%PRFX%%_module` @@ -114,7 +115,8 @@ LIMIT 1; "; -// ---- ОБНОВЛЕНИЕ ДЛЯ ВЕРСИЙ НИЖЕ 3.34 ----- -$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD IF NOT EXISTS `comment_log_dangerous` tinyint(1) NOT NULL DEFAULT '0' AFTER `comment_sort_order`"; +// ---- ОБНОВЛЕНИЕ ДЛЯ СУЩЕСТВУЮЩИХ ТАБЛИЦ ----- +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD IF NOT EXISTS `comment_pagination` tinyint(3) unsigned NOT NULL DEFAULT '1' AFTER `comment_page_nav_count` ;"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD IF NOT EXISTS `comment_log_dangerous` tinyint(1) NOT NULL DEFAULT '0' AFTER `comment_sort_order` ;"; ?> \ No newline at end of file diff --git a/templates/admin_settings.tpl b/templates/admin_settings.tpl index 943b860..a4c27aa 100644 --- a/templates/admin_settings.tpl +++ b/templates/admin_settings.tpl @@ -91,20 +91,27 @@ {#COMMENT_USE_PAGE_NAV#} - {#COMMENT_PAGE_NAV_COUNT#} + + {#COMMENT_NAVI_TPL#} - - {#COMMENT_USE_PAGE_NO_LIMIT#} + - {#COMMENT_USE_PAGE_ANSWER#} + {#COMMENT_PAGE_NAV_COUNT#} + + {#COMMENT_USE_PAGE_NO_LIMIT#} + + {#COMMENT_USE_PAGE_ANSWER#} + {#COMMENT_USE_PAGE_NO_LIMIT#} - - diff --git a/templates/comments_tree.tpl b/templates/comments_tree.tpl index 83c1ecc..a19e2f1 100644 --- a/templates/comments_tree.tpl +++ b/templates/comments_tree.tpl @@ -224,11 +224,13 @@ {/if} - {if $page_nav} - - {/if} +{if $page_nav} + +{/if} {* Модальное окно удаления *}