From c233fbf0b82ebf96be9824384674df675f4d1a65 Mon Sep 17 00:00:00 2001 From: Repellent Date: Sun, 28 Dec 2025 23:30:51 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B2=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D1=83=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=90=D0=B2=D1=82=D0=BE=D1=80=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D1=85=20=D0=B7=D0=B2=D0=B5=D0=B7=D0=B4=20=20=D0=B2?= =?UTF-8?q?=D0=BA=D0=BB=20=D0=B2=D1=8B=D0=BA=D0=BB=20=D0=98=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/comment.php | 16 ++-- js/comment.js | 143 +++++++++++++++++++++----------- sql.php | 20 ++--- templates/admin_settings.tpl | 18 ++-- templates/comments_tree.tpl | 62 +++----------- templates/comments_tree_sub.tpl | 19 +++-- 6 files changed, 148 insertions(+), 130 deletions(-) diff --git a/class/comment.php b/class/comment.php index 88d33e3..76fa546 100644 --- a/class/comment.php +++ b/class/comment.php @@ -542,8 +542,12 @@ exit; $new_comment['comment_status'] = $comment_status; $new_comment['comment_file'] = $comment_file_name; - // --- ВОТ ЭТИ ТРИ СТРОЧКИ: ПОЛУЧАЕМ РЕЙТИНГ ИЗ ФОРМЫ --- + // --- ПОЛУЧАЕМ РЕЙТИНГ ИЗ ФОРМЫ --- $user_rating = (int)($_POST['comment_user_rating'] ?? 0); + // Если это ответ (parent_id > 0) И в настройках выключено "Использовать в ответах" + if ($parent_id > 0 && (!isset($settings['comment_show_user_rating_replies']) || $settings['comment_show_user_rating_replies'] == 0)) { + $user_rating = 0; // Принудительно сбрасываем оценку для ответов + } if ($user_rating < 0) $user_rating = 0; if ($user_rating > 5) $user_rating = 5; $new_comment['user_rating'] = $user_rating; @@ -1279,6 +1283,10 @@ function commentAdminSettingsEdit($tpl_dir) $post_allow_files_anon = $_POST['comment_allow_files_anon'] ?? 0; $post_rating_type = $_POST['comment_rating_type'] ?? 0; $post_show_user_rating = $_POST['comment_show_user_rating'] ?? 0; + + /* НОВОЕ: Настройка показа авторской оценки в ответах */ + $post_show_user_rating_replies = $_POST['comment_show_user_rating_replies'] ?? 0; + $post_rating_anon_vote = $_POST['comment_rating_anon_vote'] ?? 0; $post_rating_anon_set = $_POST['comment_rating_anon_set'] ?? 0; @@ -1300,7 +1308,7 @@ function commentAdminSettingsEdit($tpl_dir) { $max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars; - // Подготовка имен полей (оставляем твою логику с htmlspecialchars) + // Подготовка имен полей $clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES); $clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES); @@ -1319,13 +1327,11 @@ function commentAdminSettingsEdit($tpl_dir) comment_allow_files_anon = '" . (int)$post_allow_files_anon . "', comment_rating_type = '" . (int)$post_rating_type . "', comment_show_user_rating = '" . (int)$post_show_user_rating . "', + comment_show_user_rating_replies = '" . (int)$post_show_user_rating_replies . "', comment_rating_anon_vote = '" . (int)$post_rating_anon_vote . "', comment_rating_anon_set = '" . (int)$post_rating_anon_set . "', - - /* Новые поля времени и куки */ comment_edit_time = '" . (int)$post_edit_time . "', comment_cookie_life = '" . (int)$post_cookie_life . "', - comment_show_f1 = '" . (int)$post_show_f1 . "', comment_req_f1 = '" . (int)$post_req_f1 . "', comment_name_f1 = '" . addslashes($clean_name_f1) . "', diff --git a/js/comment.js b/js/comment.js index 4f778c6..38d32b9 100644 --- a/js/comment.js +++ b/js/comment.js @@ -11,42 +11,58 @@ window.aveabspath = '/'; } - /* --- ТАЙМЕРЫ --- */ - function initCommentTimers() { - $('.timer-count:not(.timer-running)').each(function() { - var $timer = $(this); - $timer.addClass('timer-running'); - var timeLeft = parseInt($timer.attr('data-left')); - var cid = $timer.attr('id').replace('timer_', ''); +function initCommentTimers() { + $('.timer-count:not(.timer-running)').each(function() { + var $timer = $(this); + var timeLeft = parseInt($timer.attr('data-left')); + + // Если время не определено или уже вышло — помечаем как запущенный и пропускаем + if (isNaN(timeLeft) || timeLeft <= 0) { + $timer.addClass('timer-running'); + return; + } - var countdown = setInterval(function() { - timeLeft--; -if (timeLeft <= 0) { - clearInterval(countdown); - - // Пытаемся найти блок управления по ID - var $controls = $('#controls_' + cid); - - if ($controls.length) { - // Скрываем кнопки - $controls.fadeOut(300, function() { - $(this).remove(); // Полностью удаляем из DOM для надежности - }); - } + $timer.addClass('timer-running'); + var cid = $timer.attr('id').replace('timer_', ''); - // Обновляем статус таймера - $('#timer_container_' + cid).html(' Время на правку истекло'); - return; -} - var minutes = Math.floor(timeLeft / 60); - var seconds = timeLeft % 60; - $timer.text(minutes + ':' + (seconds < 10 ? '0' : '') + seconds); - $timer.attr('data-left', timeLeft); - }, 1000); - $timer.data('interval-id', countdown); - }); + var countdown = setInterval(function() { + timeLeft--; + + if (timeLeft <= 0) { + clearInterval(countdown); + + // --- ИЗМЕНЕНИЕ 1: Проверка режима редактирования --- + var isEditing = $('#comment_wrapper_' + cid).find('.edit-form-container').length > 0; + + if (!isEditing) { + // Находим кнопки управления + var $controls = $('#controls_' + cid); // Убедитесь, что у контейнера кнопок есть такой ID + if ($controls.length) { + $controls.fadeOut(300, function() { $(this).remove(); }); + } + + // Обновляем статус визуально + $('#timer_container_' + cid).html(' Время на правку истекло'); + } else { + // Если открыта форма редактирования, просто меняем текст, не удаляя кнопки + $('#timer_container_' + cid).html(' Время вышло! Завершите правку.'); + } + // --- КОНЕЦ ИЗМЕНЕНИЯ 1 --- + return; } + // Форматируем вывод 00:00 + var minutes = Math.floor(timeLeft / 60); + var seconds = timeLeft % 60; + $timer.text(minutes + ':' + (seconds < 10 ? '0' : '') + seconds); + $timer.attr('data-left', timeLeft); + + }, 1000); + + $timer.data('interval-id', countdown); + }); +} + /* Limit Plugin */ $.fn.extend({ limit: function(limit, element) { @@ -204,17 +220,25 @@ if (timeLeft <= 0) { }); }); - $doc.on('mouseleave', '.rating-edit-block', function() { - var cid = $(this).find('input[type="hidden"]').attr('id').replace('rating_input_', ''); - var currentRating = parseInt($('#rating_input_' + cid).val()) || 0; - $(this).find('.star-choice').each(function() { - if ($(this).data('value') <= currentRating) { - $(this).removeClass('bi-star').addClass('bi-star-fill'); - } else { - $(this).removeClass('bi-star-fill').addClass('bi-star'); - } - }); - }); +$doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() { + var $block = $(this); + var currentRating; + + if ($block.attr('id') === 'rating_wrapper') { + currentRating = parseInt($('#comment_user_rating').val()) || 0; + } else { + var cid = $block.find('input[type="hidden"]').attr('id').replace('rating_input_', ''); + currentRating = parseInt($('#rating_input_' + cid).val()) || 0; + } + + $block.find('.star-choice').each(function() { + if ($(this).data('value') <= currentRating) { + $(this).removeClass('bi-star').addClass('bi-star-fill'); + } else { + $(this).removeClass('bi-star-fill').addClass('bi-star'); + } + }); +}); $doc.on('click', '.star-choice', function() { var val = $(this).data('value'); @@ -229,12 +253,14 @@ if (timeLeft <= 0) { }); $doc.on('click', '#buttonReset', function() { - $('#comment_user_rating').val(0); - $('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star'); - $('#image_preview_wrapper').addClass('d-none'); - $('#charsLeft_new').text(MAX_CHARS); - $('.form-control').removeClass('is-invalid'); - $('.invalid-feedback').remove(); + $('#comment_user_rating').val(0); + $('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star'); + $('#rating_wrapper').show(); // Показываем блок рейтинга обратно + $('#image_preview_wrapper').addClass('d-none'); + $('#charsLeft_new').text(1000); + $('.form-control').removeClass('is-invalid'); + $('.invalid-feedback').remove(); + $('#parent_id').val(''); // Очищаем ID родителя, чтобы комментарий снова стал корневым }); $doc.on('click', '#reset_stars', function(e) { @@ -305,6 +331,15 @@ if (timeLeft <= 0) { var $form = $('#mod_comment_new'); $form.insertAfter('#comment_' + cid).show(); $('#parent_id').val(cid); + // --- СКРЫТИЕ РЕЙТИНГА ДЛЯ ОТВЕТОВ --- + if (typeof SHOW_USER_RATING_REPLIES !== 'undefined' && SHOW_USER_RATING_REPLIES == '0') { + $('#rating_wrapper').hide(); // Скрываем весь блок рейтинга + $('#comment_user_rating').val(0); // Сбрасываем значение на всякий случай + $('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star'); + } else { + $('#rating_wrapper').show(); + } + // --- КОНЕЦ ЛОГИКИ --- $('html, body').animate({ scrollTop: $form.offset().top - 150 }, 500); $('#in_message').focus(); }); @@ -340,7 +375,14 @@ if (timeLeft <= 0) { var currentImg = $wrapper.find('.mod_comment_attached_image img').first().attr('src'); var starsEditBlock = ''; - if (typeof SHOW_USER_RATING !== 'undefined' && SHOW_USER_RATING == '1' && isMyOwn) { + + // --- ИЗМЕНЕНИЕ 2: Проверка запрета звезд для ответов при редактировании --- + // Добавлена более строгая проверка data-parent + var parentIdVal = parseInt($wrapper.attr('data-parent')) || 0; + var isReply = parentIdVal > 0; + var ratingForbiddenForReply = (isReply && typeof SHOW_USER_RATING_REPLIES !== 'undefined' && SHOW_USER_RATING_REPLIES == '0'); + + if (typeof SHOW_USER_RATING !== 'undefined' && SHOW_USER_RATING == '1' && isMyOwn && !ratingForbiddenForReply) { if (typeof UGROUP !== 'undefined' && (UGROUP != '2' || RATING_ANON_SET == '1')) { var starsHtml = ''; for(var i=1; i<=5; i++) { @@ -360,6 +402,7 @@ if (timeLeft <= 0) { `; } } + // --- КОНЕЦ ИЗМЕНЕНИЯ 2 --- // Обертка для ТЕКУЩЕГО изображения с крестиком (как при загрузке) var currentImgPreview = ''; diff --git a/sql.php b/sql.php index d819e71..82afc55 100644 --- a/sql.php +++ b/sql.php @@ -5,7 +5,7 @@ * * Обновленная структура с поддержкой выбора типа рейтинга, * идентификации анонимов, загрузки файлов и защиты по IP. - * ДОБАВЛЕНО: Настройки времени редактирования и жизни куки анонима. + * ДОБАВЛЕНО: Настройка отображения авторской оценки в ответах. */ $module_sql_install = array(); @@ -39,16 +39,17 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comments` ( `comment_file_max_size` int(10) NOT NULL default '2048', `comment_rating_type` tinyint(1) NOT NULL default '0', `comment_show_user_rating` tinyint(1) NOT NULL default '0', + /* НОВОЕ ПОЛЕ: Показывать оценку автора в ответах */ + `comment_show_user_rating_replies` tinyint(1) NOT NULL default '0', `comment_rating_anon_vote` tinyint(1) NOT NULL default '0', `comment_rating_anon_set` tinyint(1) NOT NULL default '0', `comment_allow_files_anon` tinyint(1) NOT NULL default '0', - /* НОВЫЕ ПОЛЯ */ `comment_edit_time` int(11) NOT NULL default '60', `comment_cookie_life` int(11) NOT NULL default '30', PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; -// ... (таблицы info и votes остаются без изменений) ... +// Таблица info (без изменений авторской оценки, она уже есть: user_rating) $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` ( `Id` int(10) unsigned NOT NULL auto_increment, `parent_id` int(10) unsigned NOT NULL default '0', @@ -91,22 +92,21 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_votes` ( KEY `remote_addr` (`remote_addr`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; -/* Настройки по умолчанию (добавлены 60 и 30 в конце) */ -$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, 2048, 0, 1, 0, 0, 0, 60, 30);"; +/* Настройки по умолчанию (добавлено 0 перед 0, 0, 0, 60, 30) */ +$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, 2048, 0, 1, 0, 0, 0, 0, 60, 30);"; // ================================================================================= // 2. ОБНОВЛЕНИЕ МОДУЛЯ (ALTER TABLE) // ================================================================================= -// ... (предыдущие запросы обновления ModuleAveTag и прочего) ... - -/* Добавляем новые настройки времени, если их еще нет */ $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_edit_time` INT(11) NOT NULL DEFAULT '60';"; $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_cookie_life` INT(11) NOT NULL DEFAULT '30';"; - -/* (Остальные ALTER TABLE из твоего списка остаются ниже без изменений) */ $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_rating_type` TINYINT(1) NOT NULL DEFAULT '0';"; $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_show_user_rating` TINYINT(1) NOT NULL DEFAULT '0';"; + +/* Добавляем настройку отображения рейтинга автора в ответах */ +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_show_user_rating_replies` TINYINT(1) NOT NULL DEFAULT '0';"; + $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_rating_anon_vote` TINYINT(1) NOT NULL DEFAULT '0';"; $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_rating_anon_set` TINYINT(1) NOT NULL DEFAULT '0';"; $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD COLUMN IF NOT EXISTS `comment_allow_files_anon` TINYINT(1) NOT NULL DEFAULT '0';"; diff --git a/templates/admin_settings.tpl b/templates/admin_settings.tpl index 53abe4e..02b5680 100644 --- a/templates/admin_settings.tpl +++ b/templates/admin_settings.tpl @@ -154,6 +154,7 @@ + Настройка авторского рейтинга @@ -165,7 +166,13 @@  Включить "Авторские звезды" - Права на оценку: + {* Новая позиция для управления в ответах *} + + +