в админку добавлена сортировка

This commit is contained in:
2026-01-11 18:58:53 +05:00
parent 4e038df3ff
commit 3f36156951
4 changed files with 67 additions and 20 deletions

View File

@@ -310,28 +310,48 @@ function commentListShow($tpl_dir)
$comments = array();
// --- ВЫБОРКА ИЗ БД ---
// Логика формирования SQL-сортировки
$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':
$sql_sort = "comment_published DESC";
break;
case 'ASC':
default:
$sql_sort = "comment_published ASC";
break;
}
if ($settings['comment_use_page_nav'] == 1)
{
$limit = (int)$settings['comment_page_nav_count'];
if ($limit <= 0)
{
$sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . $where_visibility . " ORDER BY comment_published ASC");
$sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . $where_visibility . " ORDER BY parent_id ASC, " . $sql_sort);
$page_nav = '';
}
else
{
$start = get_current_page() * $limit - $limit;
// 1. Считаем только РОДИТЕЛЕЙ для пагинации (с учетом видимости)
// 1. Считаем только РОДИТЕЛЕЙ для пагинации
$num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' AND parent_id = '0' " . $where_visibility)->GetCell();
// 2. Основной запрос
// 2. Основной запрос (сортировка применяется к родителям в подзапросе)
$sql = $AVE_DB->Query("
SELECT * FROM " . PREFIX . "_module_comment_info
WHERE document_id = '" . $document_id . "'
AND (
id IN (SELECT id FROM (SELECT id FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' AND parent_id = '0' " . $where_visibility . " ORDER BY comment_published ASC LIMIT " . (int)$start . "," . (int)$limit . ") as tmp)
id IN (SELECT id FROM (SELECT id FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' AND parent_id = '0' " . $where_visibility . " ORDER BY " . $sql_sort . " LIMIT " . (int)$start . "," . (int)$limit . ") as tmp)
OR
parent_id != '0'
)
@@ -358,7 +378,8 @@ function commentListShow($tpl_dir)
}
else
{
$sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . $where_visibility . " ORDER BY comment_published ASC");
// Если навигация отключена
$sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . $where_visibility . " ORDER BY parent_id ASC, " . $sql_sort);
$page_nav = '';
}
@@ -1479,6 +1500,9 @@ function commentAdminSettingsEdit($tpl_dir)
$post_user_groups_read = $_POST['comment_user_groups_read'] ?? array();
$post_allow_self_answer = $_POST['comment_allow_self_answer'] ?? 0;
// НОВАЯ НАСТРОЙКА: Порядок сортировки
$post_sort_order = $_POST['comment_sort_order'] ?? 'ASC';
$post_need_approve = $_POST['comment_need_approve'] ?? 0;
$post_active = $_POST['comment_active'] ?? 0;
$post_use_antispam = $_POST['comment_use_antispam'] ?? 0;
@@ -1522,6 +1546,10 @@ function commentAdminSettingsEdit($tpl_dir)
{
$max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars;
// Валидация сортировки (ASC, DESC или RATING)
$allowed_sorts = ['ASC', 'DESC', 'RATING', 'USER_RATING'];
$sort_order = in_array(strtoupper($post_sort_order), $allowed_sorts) ? strtoupper($post_sort_order) : 'ASC';
// Подготовка имен полей и настроек файлов
$clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES);
$clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES);
@@ -1542,6 +1570,7 @@ function commentAdminSettingsEdit($tpl_dir)
comment_page_nav_count = '" . (int)$post_page_nav_count . "',
comment_ajax_replies_limit = '" . (int)$post_ajax_replies_limit . "',
comment_allow_self_answer = '" . (int)$post_allow_self_answer . "',
comment_sort_order = '" . $sort_order . "',
comment_allow_files = '" . (int)$post_allow_files . "',
comment_allow_files_anon = '" . (int)$post_allow_files_anon . "',
comment_allowed_extensions = '" . addslashes($clean_extensions) . "',

View File

@@ -122,9 +122,6 @@ COMMENT_JS_ERR_SRV = "Ошибка связи с сервером"
COMMENT_WAITING_MODERATION = "Ваш комментарий на проверке и виден пока только вам."
[admin]
COMMENT_MODULE_NAME = "Комментарии"
COMMENT_MODULE_COMENTS = "Список комментариев"
@@ -135,6 +132,11 @@ COMMENT_DOC_TITLE = "Документ"
COMMENT_DATE_FORMAT = "%d/%m/%Y %H:%M"
COMMENT_ENABLE_COMMENT = "Разрешить комментарии?"
COMMENT_CHECK_ADMIN = "Опубликовывать только после проверки?"
COMMENT_SORT = "Сортировка:"
COMMENT_SORT_ASC = "Сначала старые (новые внизу)"
COMMENT_SORT_DESC = "Сначала новые (старые внизу)"
COMMENT_SORT_RATING = "По общему рейтингу (лучшие вверху)"
COMMENT_SORT_AUTOR_STARS = "По оценке автора (кол-ву звезд)"
COMMENT_FOR_GROUPS = "Группы пользователей, которым разрешено оставлять комментарии:"
COMMENT_MAX_CHARS = "Максимальное количество символов:"
COMMENT_BUTTON_SAVE = "Сохранить настройки"

View File

@@ -45,7 +45,8 @@
`comment_edit_time` int(11) NOT NULL DEFAULT '60',
`comment_cookie_life` int(11) NOT NULL DEFAULT '30',
`comment_ajax_replies_limit` tinyint(3) NOT NULL DEFAULT '5',
`comment_allow_self_answer` tinyint(1) NOT NULL DEFAULT '0',
`comment_allow_self_answer` tinyint(1) NOT NULL DEFAULT '0',
`comment_sort_order` varchar(20) NOT NULL DEFAULT 'ASC',
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1;
";
@@ -96,10 +97,8 @@
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1;
";
// Начальные настройки (Добавлен 0 в конце для comment_allow_self_answer)
$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);";
$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');";
// 3. ОБНОВЛЕНИЕ
$module_sql_update[] = "
UPDATE `%%PRFX%%_module`
SET

View File

@@ -42,6 +42,25 @@
<td><input name="comment_need_approve" type="checkbox" value="1" {if $comment_need_approve=='1'}checked{/if} /></td>
</tr>
<tr>
<td>{#COMMENT_USE_ANSWER_ALL#}</td>
<td style="border-right: 1px solid #ddd;">
<div style="display: flex; align-items: center;">
<input name="comment_allow_self_answer" type="checkbox" value="1" {if $comment_allow_self_answer=='1'}checked{/if} style="margin-right: 10px; width: auto; cursor: pointer;" />
<span style="color: #888; font-size: 11px; margin-left: 5px;">{#COMMENT_USE_ANSWER_ALL_A#}</span>
</div>
</td>
<td>{#COMMENT_SORT#}</td>
<td>
<select name="comment_sort_order" style="width: 180px; padding: 2px;">
<option value="ASC" {if $comment_sort_order == 'ASC'}selected{/if}>{#COMMENT_SORT_ASC#}</option>
<option value="DESC" {if $comment_sort_order == 'DESC'}selected{/if}>{#COMMENT_SORT_DESC#}</option>
<option value="RATING" {if $comment_sort_order == 'RATING'}selected{/if}>{#COMMENT_SORT_RATING#}</option>
<option value="USER_RATING" {if $comment_sort_order == 'USER_RATING'}selected{/if}>{#COMMENT_SORT_AUTOR_STARS#}</option>
</select>
</td>
</tr>
<tr>
<td colspan="4" style="background: #f9f9f9; font-weight: bold; text-align: center;">{#COMMENT_USE_PAGE_TITEL#}</td>
</tr>
@@ -49,7 +68,10 @@
<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><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>
<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>
</tr>
<tr>
<td>{#COMMENT_USE_PAGE_ANSWER#}</td>
@@ -57,13 +79,8 @@
<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>{#COMMENT_USE_ANSWER_ALL#}</td>
<td>
<div style="display: flex; align-items: center;">
<input name="comment_allow_self_answer" type="checkbox" value="1" {if $comment_allow_self_answer=='1'}checked{/if} style="margin-right: 10px; width: auto; cursor: pointer;" />
<span style="color: #888; font-size: 11px; margin-left: 5px;">{#COMMENT_USE_ANSWER_ALL_A#}</span>
</div>
</td>
<td></td>
<td></td>
</tr>
<tr>