Добавлен выбор шаблонов пагинации (шаблоны находятся Системные настройки-->Настройка пагинации)

This commit is contained in:
2026-04-16 21:44:09 +05:00
parent 297ac75a98
commit 179e358f2c
7 changed files with 70 additions and 40 deletions

View File

@@ -46,6 +46,7 @@
* Если Анонимный пользователь, в течении жизни куки, сменит имя, под которым он опубликовал свой первый комментарий, рядом с именем появится плашка с тултипом в котором будут перечислены все его имена.
* Пагинация
* Пагинация работает только для родительских комментариев, количество ответов (дети и внуки) на родительский комментарий - задается в Админ панели отдельно. Если общее количество ответов превышает лимит ответов, установленный в Админке, будет выведена кнопка Показать еще N ответов, при клике по которой AJAX подгрузит и выведет оставшиеся комментарии на страницу.
* Добавлен выбор шаблонов пагинации
* Сортировка
* В админ панели доступен поиск комментария по следующим параметрам: по Имени, IP адресу, по тексту комментария. Сортировка: сначала новые, сначала старые, популярные (согласно Рейтингу пользователей), обсуждаемые - по количеству ответов на комментарий-родитель, оценки Автора (у кого больше всех звезд). Фильтрация: выводить все сообщения, только с файлами, только скрытые. Вывод комментариев по умолчанию - плоский список, но для удобства есть и древовидный список, что позволяет видеть сразу всю ветку. Количество на странице: выводит желаемое количество комментариев на страницу. Период: вам доступен календарь, в котором вы сами выбираете нужный вам период для просмотра - от и до.
* В публичной части также можно менять вывод комментариев (выбирается в Настройках модуля):

View File

@@ -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 = '<a class="page_nav" href="index.php?id=' . $AVE_Core->curentdoc->Id
. '&amp;doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias)
. ((isset($artpage) && is_numeric($artpage)) ? '&amp;artpage=' . $artpage : '')
. ((isset($apage) && is_numeric($apage)) ? '&amp;apage=' . $apage : '')
. '&amp;page={s}">{t}</a> ';
$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 .
'&amp;doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias) .
'&amp;page={s}';
$pagination_params = ((isset($artpage) && is_numeric($artpage)) ? '&amp;artpage=' . $artpage : '') .
((isset($apage) && is_numeric($apage)) ? '&amp;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('/(?<!:)\/\//', '/', $page_nav);
$GLOBALS['page_id'][$document_id]['page'] = ($GLOBALS['page_id'][$document_id]['page'] > $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']);

View File

@@ -3,7 +3,7 @@ if (!defined('BASE_DIR')) exit;
$module = array(
'ModuleSysName' => 'comment',
'ModuleVersion' => '3.35',
'ModuleVersion' => '3.36',
'ModuleAutor' => 'Repellent',
'ModuleCopyright' => '&copy; 2025-' . date('Y') . ' ave4cms.ru',
'ModuleStatus' => 1,

View File

@@ -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 = "шт."
COMMENT_ADD_FILES_COUNT_PIC = "шт."
COMMENT_NAVI_TPL = "Шаблон постраничной навигации"

10
sql.php
View File

@@ -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` ;";
?>

View File

@@ -91,20 +91,27 @@
<tr>
<td>{#COMMENT_USE_PAGE_NAV#}</td>
<td style="border-right: 1px solid #ddd;"><input name="comment_use_page_nav" type="checkbox" value="1" {if $comment_use_page_nav=='1'}checked{/if} /></td>
<td>{#COMMENT_PAGE_NAV_COUNT#}</td>
<td>{#COMMENT_NAVI_TPL#}</td>
<td>
<input name="comment_page_nav_count" type="text" value="{$comment_page_nav_count}" size="4" style="width: 50px;" />
<span style="color: #888; font-size: 11px; margin-left: 5px;">{#COMMENT_USE_PAGE_NO_LIMIT#}</span>
<select style="width:250px" id="comment_pagination" name="comment_pagination" class="mousetrap">
{foreach from=$paginations item=pagination}
<option value="{$pagination->id}"{if $comment_pagination == $pagination->id} selected="selected"{/if}>{$pagination->pagination_name|escape}</option>
{/foreach}
</select>
</td>
</tr>
<tr>
<td>{#COMMENT_USE_PAGE_ANSWER#}</td>
<td>{#COMMENT_PAGE_NAV_COUNT#}</td>
<td style="border-right: 1px solid #ddd;">
<input name="comment_page_nav_count" type="text" value="{$comment_page_nav_count}" size="4" style="width: 50px;" />
<span style="color: #888; font-size: 11px; margin-left: 5px;">{#COMMENT_USE_PAGE_NO_LIMIT#}</span>
</td>
<td>{#COMMENT_USE_PAGE_ANSWER#}</td>
<td>
<input name="comment_ajax_replies_limit" type="text" value="{$comment_ajax_replies_limit|default:'5'}" size="4" style="width: 50px;" />
<span style="color: #888; font-size: 11px; margin-left: 5px;">{#COMMENT_USE_PAGE_NO_LIMIT#}</span>
</td>
<td></td>
<td></td>
</tr>
<tr>

View File

@@ -224,11 +224,13 @@
{/if}
</div>
{if $page_nav}
<div class="page_navigation_box mt-4">
<nav aria-label="Comment Page Navigation">{$page_nav}</nav>
</div>
{/if}
{if $page_nav}
<div class="page_navigation_box mt-4 text-center">
<nav aria-label="Comment Page Navigation" style="display: inline-block;">
{$page_nav}
</nav>
</div>
{/if}
{* Модальное окно удаления *}
<div class="modal fade" id="deleteCommentModal" tabindex="-1">