Добавлен выбор шаблонов пагинации (шаблоны находятся Системные настройки-->Настройка пагинации)
This commit is contained in:
@@ -46,6 +46,7 @@
|
||||
* Если Анонимный пользователь, в течении жизни куки, сменит имя, под которым он опубликовал свой первый комментарий, рядом с именем появится плашка с тултипом в котором будут перечислены все его имена.
|
||||
* Пагинация
|
||||
* Пагинация работает только для родительских комментариев, количество ответов (дети и внуки) на родительский комментарий - задается в Админ панели отдельно. Если общее количество ответов превышает лимит ответов, установленный в Админке, будет выведена кнопка Показать еще N ответов, при клике по которой AJAX подгрузит и выведет оставшиеся комментарии на страницу.
|
||||
* Добавлен выбор шаблонов пагинации
|
||||
* Сортировка
|
||||
* В админ панели доступен поиск комментария по следующим параметрам: по Имени, IP адресу, по тексту комментария. Сортировка: сначала новые, сначала старые, популярные (согласно Рейтингу пользователей), обсуждаемые - по количеству ответов на комментарий-родитель, оценки Автора (у кого больше всех звезд). Фильтрация: выводить все сообщения, только с файлами, только скрытые. Вывод комментариев по умолчанию - плоский список, но для удобства есть и древовидный список, что позволяет видеть сразу всю ветку. Количество на странице: выводит желаемое количество комментариев на страницу. Период: вам доступен календарь, в котором вы сами выбираете нужный вам период для просмотра - от и до.
|
||||
* В публичной части также можно менять вывод комментариев (выбирается в Настройках модуля):
|
||||
|
||||
@@ -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
|
||||
. '&doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias)
|
||||
. ((isset($artpage) && is_numeric($artpage)) ? '&artpage=' . $artpage : '')
|
||||
. ((isset($apage) && is_numeric($apage)) ? '&apage=' . $apage : '')
|
||||
. '&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 .
|
||||
'&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('/(?<!:)\/\//', '/', $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']);
|
||||
|
||||
2
info.php
2
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,
|
||||
|
||||
@@ -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
10
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` ;";
|
||||
|
||||
?>
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user