From 00c7f4a22657555c93cf7f29be4cdf771a5ce132 Mon Sep 17 00:00:00 2001 From: Repellent Date: Sun, 21 Dec 2025 23:35:08 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=90=D0=B2=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B7=D0=B2=D0=B5=D0=B7=D0=B4=D1=8B=20+=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B0=20=D0=90=D0=BD=D0=BE=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D0=BC=20=D0=BD=D0=B0=20=D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D0=BE=D0=B1=D1=89=D0=B5=D0=BC=20=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D1=81=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B8?= =?UTF-8?q?=20=D0=90=D0=B2=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0=B8=D1=85=20?= =?UTF-8?q?=D0=B7=D0=B2=D0=B5=D0=B7=D0=B4=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/comment.php | 167 +++++++++++++++++++------------- js/comment.js | 132 +++++++++++++++++++++---- sql.php | 86 +++++++++------- templates/admin_settings.tpl | 36 ++++++- templates/comments_tree.tpl | 29 ++++++ templates/comments_tree_sub.tpl | 129 ++++++++++++------------ 6 files changed, 386 insertions(+), 193 deletions(-) diff --git a/class/comment.php b/class/comment.php index 4b6324f..449bad9 100644 --- a/class/comment.php +++ b/class/comment.php @@ -496,6 +496,11 @@ function commentListShow($tpl_dir) $new_comment['comment_status'] = $comment_status; $new_comment['comment_file'] = $comment_file_name; + // --- ВОТ ЭТИ ТРИ СТРОЧКИ: ПОЛУЧАЕМ РЕЙТИНГ ИЗ ФОРМЫ --- + $user_rating = (int)($_POST['comment_user_rating'] ?? 0); + if ($user_rating < 0) $user_rating = 0; if ($user_rating > 5) $user_rating = 5; + $new_comment['user_rating'] = $user_rating; + $comment_text_raw = $_POST['comment_text'] ?? ''; $comment_max_chars = $settings['comment_max_chars']; $comment_max_chars = (!empty($comment_max_chars) && $comment_max_chars > 10) ? $comment_max_chars : 200; @@ -648,6 +653,10 @@ function commentPostEdit($comment_id) $new_file_sql = ", comment_file = ''"; } + // --- ВОТ ЭТО ДОБАВИЛ --- + $user_rating = isset($_POST['user_rating']) ? (int)$_POST['user_rating'] : (int)$row['user_rating']; + // ----------------------- + // 6. Обновление базы данных // Если в настройках стоит "нужна премодерация", после правки статус меняется на 0 (если не админ) $new_status = $is_admin ? (int)$row['comment_status'] : ($row['comment_need_approve'] == '1' ? 0 : 1); @@ -657,7 +666,8 @@ function commentPostEdit($comment_id) SET comment_changed = '" . time() . "', comment_text = '" . addslashes($comment_text_cut) . "', - comment_status = '" . $new_status . "' + comment_status = '" . $new_status . "', + user_rating = '" . $user_rating . "' $new_file_sql WHERE Id = '" . $comment_id . "' @@ -780,6 +790,7 @@ function commentPostDelete($comment_id) /** * Метод для обработки голосования за комментарий * Защита: ID для залогиненных, Пара (Ключ + IP) для анонимов. + * Добавлена проверка глобальной настройки прав для анонимов. */ function commentVote() { @@ -807,6 +818,18 @@ function commentPostDelete($comment_id) $user_id = empty($_SESSION['user_id']) ? 0 : (int)$_SESSION['user_id']; $anon_key = $this->_getAnonKey(); + // 1.5 ПРОВЕРКА ПРАВ ГОЛОСОВАНИЯ (Новое) + // Получаем настройки модуля, чтобы узнать, разрешено ли анонимам голосовать + $settings = $this->_commentSettingsGet(); + if (empty($user_id) && empty($settings['comment_rating_anon_vote'])) { + if ($ajax) { + if (ob_get_length()) ob_end_clean(); + echo 'forbidden_anon'; // Специальный статус для JS + exit; + } + return; + } + // 2. Получаем данные о комментарии, за который голосуют $comment_row = $AVE_DB->Query(" SELECT comment_author_id, anon_key, comment_author_ip @@ -1189,82 +1212,92 @@ function commentPostDelete($comment_id) } /** -/** -/** - * Метод, предназначенный для управления настройками модуля - * - * @param string $tpl_dir - путь к шаблонам модуля - */ - function commentAdminSettingsEdit($tpl_dir) - { - global $AVE_DB, $AVE_Template; + * Метод, предназначенный для управления настройками модуля + * + * @param string $tpl_dir - путь к шаблонам модуля + */ +function commentAdminSettingsEdit($tpl_dir) +{ + global $AVE_DB, $AVE_Template; - $request_sub = $_REQUEST['sub'] ?? ''; - $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_need_approve = $_POST['comment_need_approve'] ?? 0; - $post_active = $_POST['comment_active'] ?? 0; - $post_use_antispam = $_POST['comment_use_antispam'] ?? 0; - $post_use_page_nav = $_POST['comment_use_page_nav'] ?? 0; - $post_page_nav_count = $_POST['comment_page_nav_count'] ?? 0; + $request_sub = $_REQUEST['sub'] ?? ''; + $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_need_approve = $_POST['comment_need_approve'] ?? 0; + $post_active = $_POST['comment_active'] ?? 0; + $post_use_antispam = $_POST['comment_use_antispam'] ?? 0; + $post_use_page_nav = $_POST['comment_use_page_nav'] ?? 0; + $post_page_nav_count = $_POST['comment_page_nav_count'] ?? 0; - // НОВОЕ: Настройка разрешения загрузки файлов - $post_allow_files = $_POST['comment_allow_files'] ?? 0; + // НОВОЕ: Настройка разрешения загрузки файлов + $post_allow_files = $_POST['comment_allow_files'] ?? 0; - // НОВОЕ: Тип рейтинга (0 - звезды, 1 - лайки) - $post_rating_type = $_POST['comment_rating_type'] ?? 0; + // НОВОЕ: Тип рейтинга (0 - звезды, 1 - лайки) + $post_rating_type = $_POST['comment_rating_type'] ?? 0; - // Данные для универсальных полей - $post_show_f1 = $_POST['comment_show_f1'] ?? 0; - $post_req_f1 = $_POST['comment_req_f1'] ?? 0; - $post_name_f1 = $_POST['comment_name_f1'] ?? ''; + // НОВОЕ: ВКЛ/ВЫКЛ авторских звезд + $post_show_user_rating = $_POST['comment_show_user_rating'] ?? 0; - $post_show_f2 = $_POST['comment_show_f2'] ?? 0; - $post_req_f2 = $_POST['comment_req_f2'] ?? 0; - $post_name_f2 = $_POST['comment_name_f2'] ?? ''; + // НОВОЕ: Разрешение голосования анонимам + $post_rating_anon_vote = $_POST['comment_rating_anon_vote'] ?? 0; - if ($request_sub == 'save') - { - $max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars; + // НОВОЕ: Разрешение анонимам ставить звезды (Авторский рейтинг) + $post_rating_anon_set = $_POST['comment_rating_anon_set'] ?? 0; - $clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES); - $clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES); + // Данные для универсальных полей + $post_show_f1 = $_POST['comment_show_f1'] ?? 0; + $post_req_f1 = $_POST['comment_req_f1'] ?? 0; + $post_name_f1 = $_POST['comment_name_f1'] ?? ''; - $AVE_DB->Query(" - UPDATE " . PREFIX . "_module_comments - SET - comment_max_chars = '" . (int)$max_chars . "', - comment_user_groups = '" . implode(',', $post_user_groups) . "', - comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "', - comment_need_approve = '" . (int)$post_need_approve . "', - comment_active = '" . (int)$post_active . "', - 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_allow_files = '" . (int)$post_allow_files . "', - comment_rating_type = '" . (int)$post_rating_type . "', - comment_show_f1 = '" . (int)$post_show_f1 . "', - comment_req_f1 = '" . (int)$post_req_f1 . "', - comment_name_f1 = '" . $clean_name_f1 . "', - comment_show_f2 = '" . (int)$post_show_f2 . "', - comment_req_f2 = '" . (int)$post_req_f2 . "', - comment_name_f2 = '" . $clean_name_f2 . "' - WHERE - Id = 1 - "); - } + $post_show_f2 = $_POST['comment_show_f2'] ?? 0; + $post_req_f2 = $_POST['comment_req_f2'] ?? 0; + $post_name_f2 = $_POST['comment_name_f2'] ?? ''; - $row = $this->_commentSettingsGet(); - - $row['comment_user_groups'] = explode(',', $row['comment_user_groups']); - $row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']); + if ($request_sub == 'save') + { + $max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars; - $AVE_Template->assign($row); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_settings_tpl)); - } + $clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES); + $clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES); + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_comments + SET + comment_max_chars = '" . (int)$max_chars . "', + comment_user_groups = '" . implode(',', $post_user_groups) . "', + comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "', + comment_need_approve = '" . (int)$post_need_approve . "', + comment_active = '" . (int)$post_active . "', + 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_allow_files = '" . (int)$post_allow_files . "', + comment_rating_type = '" . (int)$post_rating_type . "', + comment_show_user_rating = '" . (int)$post_show_user_rating . "', + comment_rating_anon_vote = '" . (int)$post_rating_anon_vote . "', + comment_rating_anon_set = '" . (int)$post_rating_anon_set . "', + comment_show_f1 = '" . (int)$post_show_f1 . "', + comment_req_f1 = '" . (int)$post_req_f1 . "', + comment_name_f1 = '" . $clean_name_f1 . "', + comment_show_f2 = '" . (int)$post_show_f2 . "', + comment_req_f2 = '" . (int)$post_req_f2 . "', + comment_name_f2 = '" . $clean_name_f2 . "' + WHERE + Id = 1 + "); + } + + $row = $this->_commentSettingsGet(); + + $row['comment_user_groups'] = explode(',', $row['comment_user_groups']); + $row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']); + + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_settings_tpl)); +} } ?> \ No newline at end of file diff --git a/js/comment.js b/js/comment.js index 42efdad..302b397 100644 --- a/js/comment.js +++ b/js/comment.js @@ -119,14 +119,77 @@ initCommentTimers(); var $doc = $(document); - // --- ЛОГИКА ГОЛОСОВАНИЯ (РЕЙТИНГ) --- + // --- ЛОГИКА ВЫБОРА РЕЙТИНГА В ФОРМЕ (НОВОЕ) --- + $doc.on('mouseenter', '.star-choice', function() { + var val = $(this).data('value'); + $(this).parent().find('.star-choice').each(function() { + if ($(this).data('value') <= val) { + $(this).removeClass('bi-star').addClass('bi-star-fill'); + } else { + $(this).removeClass('bi-star-fill').addClass('bi-star'); + } + }); + }); + + $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('click', '.star-choice', function() { + var val = $(this).data('value'); + var $parent = $(this).parent(); + + // 1. Ищем инпут для формы редактирования (он находится внутри .rating-edit-block) + var ratingInput = $(this).closest('.rating-edit-block').find('input[type="hidden"]'); + + if (ratingInput.length) { + ratingInput.val(val); + } else { + // 2. Ищем инпут для основной формы (по ID) + $('#comment_user_rating').val(val); + } + + // Визуально фиксируем звезды сразу после клика + $(this).prevAll().addBack().removeClass('bi-star').addClass('bi-star-fill'); + $(this).nextAll().removeClass('bi-star-fill').addClass('bi-star'); + }); + + // Сброс звезд при очистке всей формы (кнопка Reset) + $doc.on('click', '#buttonReset', function() { + $('#comment_user_rating').val(0); + $('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star'); + }); + + // Сброс только звезд по кнопке "Сбросить" в основной форме + $doc.on('click', '#reset_stars', function(e) { + e.preventDefault(); + $('#comment_user_rating').val(0); + $('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star'); + }); + + // Сброс звезд в форме редактирования + $doc.on('click', '.reset-edit-stars', function(e) { + e.preventDefault(); + var cid = $(this).data('id'); + $('#rating_input_' + cid).val(0); + $('#user_rating_stars_' + cid + ' .star-choice').removeClass('bi-star-fill').addClass('bi-star'); + }); + + // --- ЛОГИКА ГОЛОСОВАНИЯ (РЕЙТИНГ УЖЕ ОПУБЛИКОВАННЫХ) --- $doc.on('mouseenter', '.star-item', function() { var $parent = $(this).parent(); - // Если это лайки (сердце) if ($parent.hasClass('comment-like')) { $(this).css('transform', 'scale(1.2)'); } - // Если это звезды else { $(this).prevAll().addBack().removeClass('bi-star').addClass('bi-star-fill'); $(this).nextAll().removeClass('bi-star-fill').addClass('bi-star'); @@ -140,10 +203,6 @@ } }); - $doc.on('mouseleave', '.comment-stars', function() { - // При уходе мыши визуально ничего не меняем до клика или рефреша - }); - $doc.on('click', '.star-item', function() { var $container = $(this).closest('.comment-rating-container'); var commentId = $container.data('id'); @@ -159,7 +218,6 @@ }, success: function(response) { var res = response.toString().trim(); - if (res.indexOf('success') !== -1) { $container.html('Спасибо!'); setTimeout(function(){ location.reload(); }, 1000); @@ -167,18 +225,20 @@ alert('Вы уже голосовали за этот комментарий.'); } else if (res.indexOf('own_comment') !== -1) { alert('Нельзя голосовать за свой собственный комментарий.'); - } else { - console.warn("Server response:", response); + } + /* НОВОЕ: Обработка запрета голосования для незарегистрированных пользователей */ + else if (res.indexOf('forbidden_anon') !== -1) { + alert('Голосование доступно только зарегистрированным пользователям.'); + } + else { alert('Ошибка при обработке голоса сервером.'); } }, error: function(xhr) { - console.error("XHR Status:", xhr.status); alert('Ошибка связи с сервером. Статус: ' + xhr.status); } }); }); - // ------------------------------------ // Глобальные кнопки управления $doc.on('click', '#mod_comment_close', function(e) { @@ -193,13 +253,9 @@ e.preventDefault(); var cid = $(this).data('id'); var $form = $('#mod_comment_new'); - $form.insertAfter('#comment_' + cid).show(); $('#parent_id').val(cid); - - $('html, body').animate({ - scrollTop: $form.offset().top - 150 - }, 500); + $('html, body').animate({ scrollTop: $form.offset().top - 150 }, 500); $('#in_message').focus(); }); @@ -215,7 +271,7 @@ cAction(this, $(this).hasClass('mod_comment_lock') ? 'lock' : 'unlock'); }); - // Редактирование + // --- РЕДАКТИРОВАНИЕ (ОБНОВЛЕННОЕ С ПРОВЕРКОЙ is_my_own) --- $doc.off('click', '.mod_comment_edit').on('click', '.mod_comment_edit', function(e) { e.preventDefault(); var cid = $(this).data('id'); @@ -224,15 +280,49 @@ if ($wrapper.find('.edit-form-container').length > 0) return; + // ПРОВЕРКА АВТОРСТВА: используем флаг is_my_own из атрибута шаблона + var isMyOwn = $wrapper.attr('data-is-own') == '1'; + var currentRating = parseInt($wrapper.attr('data-user-rating')) || 0; + $('.edit-form-container').remove(); $('.mod_comment_text').show(); var cleanText = $textBlock.html().replace(//mg, "\n").trim(); var currentImg = $wrapper.find('.mod_comment_attached_image img').first().attr('src'); + // Рисуем звезды ТОЛЬКО если настройка включена И это собственный комментарий (is_my_own) + var starsEditBlock = ''; + if (typeof SHOW_USER_RATING !== 'undefined' && SHOW_USER_RATING == '1' && isMyOwn) { + + // ВНЕДРЕНИЕ: Проверка прав группы (Авторизован или разрешено анонимам) + if (typeof UGROUP !== 'undefined' && (UGROUP != '2' || RATING_ANON_SET == '1')) { + + var starsHtml = ''; + for(var i=1; i<=5; i++) { + var starClass = (i <= currentRating) ? 'bi-star-fill' : 'bi-star'; + starsHtml += ``; + } + + starsEditBlock = ` +
+ +
+
${starsHtml}
+ + Сбросить + +
+ +
`; + } + } + var editHtml = `
+ + ${starsEditBlock} + ${currentImg ? `
` : ''}
@@ -258,6 +348,12 @@ var fd = new FormData(); fd.append('module', 'comment'); fd.append('action', 'edit'); fd.append('Id', cid); fd.append('text', $('#ta_' + cid).val()); + + var rInput = $('#rating_input_' + cid); + if (rInput.length) { + fd.append('user_rating', rInput.val()); + } + fd.append('delete_image', $('#del_img_' + cid).is(':checked') ? 1 : 0); var file = $('#new_file_' + cid)[0].files[0]; if (file) fd.append('comment_image', file); diff --git a/sql.php b/sql.php index 78aa591..c4c6e68 100644 --- a/sql.php +++ b/sql.php @@ -5,6 +5,8 @@ * * Обновленная структура с поддержкой выбора типа рейтинга (звезды/лайки), * идентификации анонимных пользователей, загрузки файлов и защиты по IP. + * Добавлена поддержка "Авторских звезд" (user_rating) и настройки их отображения. + * ДОБАВЛЕНО: Настройка разрешения голосования для анонимов и выставления ими звезд. */ $module_sql_install = array(); @@ -36,7 +38,10 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comments` ( `comment_name_f2` varchar(255) NOT NULL default '', `comment_allow_files` tinyint(1) NOT NULL default '0', `comment_file_max_size` int(10) NOT NULL default '2048', - `comment_rating_type` tinyint(1) NOT NULL default '0', /* 0 - звезды, 1 - лайки */ + `comment_rating_type` tinyint(1) NOT NULL default '0', /* 0 - звезды, 1 - лайки, 2 - выключен */ + `comment_show_user_rating` 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', /* РАЗРЕШИТЬ АНОНИМАМ СТАВИТЬ ЗВЕЗДЫ ПРИ СОЗДАНИИ */ PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; @@ -50,40 +55,41 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` ( `comment_author_city` varchar(255) NOT NULL, `comment_author_website` varchar(255) NOT NULL, `comment_author_ip` varchar(45) NOT NULL, - `anon_key` varchar(32) DEFAULT NULL, + `anon_key` varchar(32) DEFAULT NULL, `comment_published` int(10) unsigned NOT NULL default '0', `comment_changed` int(10) unsigned NOT NULL default '0', `comment_text` text NOT NULL, `comment_status` tinyint(1) unsigned NOT NULL default '1', `comments_close` tinyint(1) unsigned NOT NULL default '0', `comment_file` varchar(255) NOT NULL default '', - /* ПОЛЯ РЕЙТИНГА */ - `rating_sum` int(10) NOT NULL default '0', - `rating_count` int(10) NOT NULL default '0', + `user_rating` tinyint(1) NOT NULL default '0', /* ЛИЧНАЯ ОЦЕНКА АВТОРА (1-5) */ + /* ПОЛЯ ОБЩЕГО РЕЙТИНГА (ГОЛОСОВАНИЕ) */ + `rating_sum` int(10) NOT NULL default '0', + `rating_count` int(10) NOT NULL default '0', PRIMARY KEY (`Id`), KEY `document_id` (`document_id`), KEY `parent_id` (`parent_id`), KEY `comment_status` (`comment_status`), - KEY `anon_key` (`anon_key`) + KEY `anon_key` (`anon_key`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;"; $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_votes` ( - `id` int(10) unsigned NOT NULL auto_increment, - `comment_id` int(10) unsigned NOT NULL, - `user_id` int(10) unsigned DEFAULT '0', - `anon_key` varchar(32) DEFAULT '', - `remote_addr` varchar(45) DEFAULT '', - `vote_value` tinyint(1) NOT NULL, - `date_voted` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `comment_id` (`comment_id`), - KEY `anon_key` (`anon_key`), - KEY `user_id` (`user_id`), - KEY `remote_addr` (`remote_addr`) + `id` int(10) unsigned NOT NULL auto_increment, + `comment_id` int(10) unsigned NOT NULL, + `user_id` int(10) unsigned DEFAULT '0', + `anon_key` varchar(32) DEFAULT '', + `remote_addr` varchar(45) DEFAULT '', + `vote_value` tinyint(1) NOT NULL, + `date_voted` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `comment_id` (`comment_id`), + KEY `anon_key` (`anon_key`), + KEY `user_id` (`user_id`), + KEY `remote_addr` (`remote_addr`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; -/* Добавили 0 в конце для comment_rating_type */ -$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);"; +/* Настройки по умолчанию (добавлен еще один 0 в конце для comment_rating_anon_set) */ +$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);"; // ================================================================================= // 2. ОБНОВЛЕНИЕ МОДУЛЯ (ALTER TABLE) @@ -99,28 +105,34 @@ $module_sql_update[] = " LIMIT 1; "; -/* Добавляем переключатель типа рейтинга, если его нет */ +/* Добавляем настройки рейтинга в таблицу конфигурации */ $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_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_comment_info` ADD `rating_sum` INT(10) NOT NULL DEFAULT '0';"; -$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_info` ADD `rating_count` INT(10) NOT NULL DEFAULT '0';"; +/* Добавляем поля для оценки и голосования в таблицу инфо */ +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_info` ADD COLUMN IF NOT EXISTS `user_rating` TINYINT(1) NOT NULL DEFAULT '0' AFTER `comment_file`;"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_info` ADD COLUMN IF NOT EXISTS `rating_sum` INT(10) NOT NULL DEFAULT '0';"; +$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_info` ADD COLUMN IF NOT EXISTS `rating_count` INT(10) NOT NULL DEFAULT '0';"; + +/* Обновляем типы полей */ $module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_info` MODIFY `comment_author_ip` VARCHAR(45) NOT NULL;"; +/* Создаем таблицу голосов, если обновляемся со старой версии */ $module_sql_update[] = "CREATE TABLE IF NOT EXISTS `%%PRFX%%_module_comment_votes` ( - `id` int(10) unsigned NOT NULL auto_increment, - `comment_id` int(10) unsigned NOT NULL, - `user_id` int(10) unsigned DEFAULT '0', - `anon_key` varchar(32) DEFAULT '', - `remote_addr` varchar(45) DEFAULT '', - `vote_value` tinyint(1) NOT NULL, - `date_voted` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `comment_id` (`comment_id`), - KEY `anon_key` (`anon_key`), - KEY `user_id` (`user_id`), - KEY `remote_addr` (`remote_addr`) + `id` int(10) unsigned NOT NULL auto_increment, + `comment_id` int(10) unsigned NOT NULL, + `user_id` int(10) unsigned DEFAULT '0', + `anon_key` varchar(32) DEFAULT '', + `remote_addr` varchar(45) DEFAULT '', + `vote_value` tinyint(1) NOT NULL, + `date_voted` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `comment_id` (`comment_id`), + KEY `anon_key` (`anon_key`), + KEY `user_id` (`user_id`), + KEY `remote_addr` (`remote_addr`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; -$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comment_votes` ADD COLUMN IF NOT EXISTS `remote_addr` VARCHAR(45) DEFAULT '' AFTER `anon_key`;"; - ?> \ No newline at end of file diff --git a/templates/admin_settings.tpl b/templates/admin_settings.tpl index e9eb0d6..db489d0 100644 --- a/templates/admin_settings.tpl +++ b/templates/admin_settings.tpl @@ -94,7 +94,7 @@ Заголовок поля 1: - +
   @@ -103,7 +103,7 @@ Заголовок поля 2: - +
   @@ -113,11 +113,11 @@ - Система оценки комментариев + Настройка общего рейтинга - Тип рейтинга: - + Тип общего рейтинга: +
@@ -133,6 +133,32 @@
+ Права на голосование: + + + + + + Настройка авторского рейтинга + + + Авторская оценка: + + + + Права на оценку: + + + diff --git a/templates/comments_tree.tpl b/templates/comments_tree.tpl index b6078dd..828263e 100644 --- a/templates/comments_tree.tpl +++ b/templates/comments_tree.tpl @@ -123,6 +123,31 @@
+ {* --- ВНЕДРЕНИЕ: ВЫБОР РЕЙТИНГА АВТОРОМ С ПРОВЕРКОЙ НАСТРОЙКИ --- *} + {if $comment_show_user_rating == 1} + {* Показываем только если не гость ИЛИ если гостям разрешено в настройках *} + {if $smarty.session.user_group != '2' || $comment_rating_anon_set == 1} +
+ +
+
+ + + + + +
+ + Сбросить + +
+ {* Скрытое поле, куда JS запишет выбранное число *} + +
+ {/if} + {/if} + {* --- КОНЕЦ ВНЕДРЕНИЯ --- *} + {* Оставшиеся символы *}

{#COMMENT_CHARS_LEFT#} @@ -249,6 +274,10 @@ var DOC_ID = '{$doc_id}'; var MAX_CHARS = '{$comment_max_chars}'; var aveabspath = '{$ABS_PATH}'; + + // Глобальная переменная для JS + var SHOW_USER_RATING = '{$comment_show_user_rating|default:0}'; + var RATING_ANON_SET = '{$comment_rating_anon_set|default:0}';