в админку добавил возможность для Авторских звезд вкл выкл Использовать в ответах
This commit is contained in:
@@ -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) . "',
|
||||
|
||||
143
js/comment.js
143
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('<span class="text-danger small"><i class="bi bi-clock-history"></i> Время на правку истекло</span>');
|
||||
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('<span class="text-danger small"><i class="bi bi-clock-history"></i> Время на правку истекло</span>');
|
||||
} else {
|
||||
// Если открыта форма редактирования, просто меняем текст, не удаляя кнопки
|
||||
$('#timer_container_' + cid).html('<span class="text-warning small fw-bold"><i class="bi bi-exclamation-triangle"></i> Время вышло! Завершите правку.</span>');
|
||||
}
|
||||
// --- КОНЕЦ ИЗМЕНЕНИЯ 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) {
|
||||
</div>`;
|
||||
}
|
||||
}
|
||||
// --- КОНЕЦ ИЗМЕНЕНИЯ 2 ---
|
||||
|
||||
// Обертка для ТЕКУЩЕГО изображения с крестиком (как при загрузке)
|
||||
var currentImgPreview = '';
|
||||
|
||||
20
sql.php
20
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';";
|
||||
|
||||
@@ -154,6 +154,7 @@
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="4" style="background: #f9f9f9; font-weight: bold; text-align: center;">Настройка авторского рейтинга</td>
|
||||
</tr>
|
||||
@@ -165,7 +166,13 @@
|
||||
Включить "Авторские звезды"
|
||||
</label>
|
||||
</td>
|
||||
<td>Права на оценку:</td>
|
||||
{* Новая позиция для управления в ответах *}
|
||||
<td style="border-right: 1px solid #ddd;">
|
||||
<label style="cursor: pointer; display: flex; align-items: center; font-weight: normal;">
|
||||
<input name="comment_show_user_rating_replies" type="checkbox" value="1" {if $comment_show_user_rating_replies=='1'}checked{/if} style="margin-right: 10px;" />
|
||||
Использовать в ответах
|
||||
</label>
|
||||
</td>
|
||||
<td>
|
||||
<label style="cursor: pointer; display: flex; align-items: center; font-weight: normal;">
|
||||
<input name="comment_rating_anon_set" type="checkbox" value="1" {if $comment_rating_anon_set=='1'}checked{/if} style="margin-right: 10px;" />
|
||||
@@ -199,11 +206,8 @@
|
||||
<div class="rowElem" style="border:none; padding: 10px;">
|
||||
<div class="saveBtn" style="float: left; width: 100%;">
|
||||
<input type="submit" class="basicBtn" value="{#COMMENT_BUTTON_SAVE#}" style="margin-right: 5px;" />
|
||||
|
||||
<span style="margin: 0 5px;">или</span>
|
||||
|
||||
<input type="button" id="apply_comment_settings" class="blackBtn" value="Применить" style="margin-left: 5px;" />
|
||||
|
||||
<a class="button redBtn" href="index.php?do=modules&cp={$sess}" style="float:right; height: 18px; padding: 0 10px; line-height: 18px;">Отменить</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -217,7 +221,6 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
// Выносим логику сохранения в отдельную функцию, чтобы вызывать её и по клику, и по кнопкам
|
||||
function saveCommentSettings() {
|
||||
var form = $("#commentSettingsForm");
|
||||
var formData = form.serialize();
|
||||
@@ -246,17 +249,14 @@ $(document).ready(function() {
|
||||
});
|
||||
}
|
||||
|
||||
// 1. Обработка клика по кнопке "Применить"
|
||||
$(document).on("click", "#apply_comment_settings", function () {
|
||||
saveCommentSettings();
|
||||
return false;
|
||||
});
|
||||
|
||||
// 2. Обработка Ctrl + S (или Cmd + S на Mac)
|
||||
$(document).keydown(function(e) {
|
||||
// Проверяем: нажата S (код 83) + Ctrl (или Meta для Mac)
|
||||
if ((e.ctrlKey || e.metaKey) && e.which === 83) {
|
||||
e.preventDefault(); // Отменяем стандартное сохранение страницы браузером
|
||||
e.preventDefault();
|
||||
saveCommentSettings();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -19,13 +19,11 @@
|
||||
</h3>
|
||||
|
||||
<div class="d-flex mb-4 align-items-center">
|
||||
{* Кнопка "Добавить комментарий" - ведет к якорю формы *}
|
||||
<a href="#end" class="btn btn-sm btn-outline-primary">
|
||||
<i class="bi bi-plus-circle me-1"></i> {#COMMENT_SITE_ADD#}
|
||||
</a>
|
||||
|
||||
{if $smarty.const.UGROUP==1}
|
||||
{* Кнопки управления комментированием для Администратора *}
|
||||
{if $closed==1}
|
||||
<a id="mod_comment_open" href="javascript:void(0);" class="btn btn-sm btn-outline-success ms-3">
|
||||
<i class="bi bi-lock-fill me-1"></i> {#COMMENT_SITE_OPEN#}
|
||||
@@ -66,9 +64,7 @@
|
||||
<fieldset>
|
||||
<legend class="d-none">Форма добавления комментария</legend>
|
||||
|
||||
{* Блок для имени и email *}
|
||||
{if $smarty.session.user_group != '2'}
|
||||
{* АВТОРИЗОВАННЫЙ ПОЛЬЗОВАТЕЛЬ *}
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
<label for="in_author_name_display" class="form-label">{#COMMENT_YOUR_NAME#}</label>
|
||||
@@ -81,9 +77,7 @@
|
||||
</div>
|
||||
<input name="comment_author_name" type="hidden" id="in_author_name" value="{$smarty.session.user_name|default:''|escape|stripslashes}" />
|
||||
<input name="comment_author_email" type="hidden" id="in_author_email" value="{$smarty.session.user_email|default:''|escape|stripslashes}" />
|
||||
|
||||
{else}
|
||||
{* ГОСТЬ *}
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
<label for="in_author_name" class="form-label">{#COMMENT_YOUR_NAME#}*</label>
|
||||
@@ -96,7 +90,6 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{* ДИНАМИЧЕСКИЕ ПОЛЯ (Field 1 и Field 2) *}
|
||||
<div class="row mb-3">
|
||||
{if $comment_show_f1 == 1}
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
@@ -117,17 +110,15 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{* Текст комментария *}
|
||||
<div class="mb-3">
|
||||
<label for="in_message" class="form-label">{#COMMENT_YOUR_TEXT#}*</label>
|
||||
<textarea rows="8" name="comment_text" id="in_message" class="form-control" placeholder="{#COMMENT_YOUR_TEXT#}"></textarea>
|
||||
</div>
|
||||
|
||||
{* --- ВНЕДРЕНИЕ: ВЫБОР РЕЙТИНГА АВТОРОМ С ПРОВЕРКОЙ НАСТРОЙКИ --- *}
|
||||
{* --- ВНЕДРЕНИЕ: ВЫБОР РЕЙТИНГА (ДОБАВЛЕН ID rating_wrapper) --- *}
|
||||
{if $comment_show_user_rating == 1}
|
||||
{* Показываем только если не гость ИЛИ если гостям разрешено в настройках *}
|
||||
{if $smarty.session.user_group != '2' || $comment_rating_anon_set == 1}
|
||||
<div class="mb-3">
|
||||
<div class="mb-3" id="rating_wrapper">
|
||||
<label class="form-label d-block small fw-bold text-muted text-uppercase mb-1">Оцените материал:</label>
|
||||
<div class="d-flex align-items-center">
|
||||
<div id="user_rating_stars" class="fs-4" style="color: #ffc107; display: inline-block;">
|
||||
@@ -141,53 +132,36 @@
|
||||
<i class="bi bi-x-circle"></i> Сбросить
|
||||
</a>
|
||||
</div>
|
||||
{* Скрытое поле, куда JS запишет выбранное число *}
|
||||
<input name="comment_user_rating" type="hidden" id="comment_user_rating" value="0" />
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{* --- КОНЕЦ ВНЕДРЕНИЯ --- *}
|
||||
|
||||
{* Оставшиеся символы *}
|
||||
<p class="text-end text-muted small">
|
||||
{#COMMENT_CHARS_LEFT#} <span class="charsLeft fw-bold" id="charsLeft_new"></span>
|
||||
</p>
|
||||
|
||||
{* Блок загрузки изображения *}
|
||||
{if $comment_allow_files == 1}
|
||||
{* ПРОВЕРКА: Разрешено ли текущему пользователю загружать файлы *}
|
||||
{if $smarty.session.user_group != '2' || $comment_allow_files_anon == 1}
|
||||
<div class="mb-3">
|
||||
<label for="comment_image" class="form-label text-muted small">
|
||||
<i class="bi bi-camera me-1"></i> Прикрепить изображение (JPG, PNG, GIF)
|
||||
<i class="bi bi-camera me-1"></i> Прикрепить изображение
|
||||
</label>
|
||||
|
||||
<input type="file" name="comment_image" id="comment_image" class="form-control form-control-sm" accept="image/*">
|
||||
|
||||
{* Контейнер для превью *}
|
||||
<div id="image_preview_wrapper" class="mt-2 d-none position-relative" style="width: fit-content;">
|
||||
<img id="image_preview_img" src="#" alt="Предпросмотр" class="img-thumbnail" style="max-height: 120px;">
|
||||
<button type="button" id="remove_image_btn" class="btn btn-danger btn-sm position-absolute top-0 end-0"
|
||||
style="padding: 0 5px; margin: 2px;" title="Удалить фото">
|
||||
<i class="bi bi-x-lg"></i>
|
||||
</button>
|
||||
<button type="button" id="remove_image_btn" class="btn btn-danger btn-sm position-absolute top-0 end-0" style="padding: 0 5px; margin: 2px;"><i class="bi bi-x-lg"></i></button>
|
||||
</div>
|
||||
|
||||
{* --- НОВОЕ: ИНДИКАТОР ЗАГРУЗКИ (PROGRESS BAR) --- *}
|
||||
<div id="upload_progress_container" class="mt-2 d-none">
|
||||
<div class="progress" style="height: 8px;">
|
||||
<div id="upload_progress_bar" class="progress-bar progress-bar-striped progress-bar-animated bg-success" role="progressbar" style="width: 0%"></div>
|
||||
</div>
|
||||
<div id="upload_status_text" class="small text-muted mt-1">Загрузка: 0%</div>
|
||||
</div>
|
||||
{* --- КОНЕЦ ИНДИКАТОРА --- *}
|
||||
|
||||
<div id="file_error" class="text-danger small mt-1 d-none"></div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{* CAPTCHA *}
|
||||
{if $im}
|
||||
<div class="row mb-3 align-items-center">
|
||||
<div class="col-md-4">
|
||||
@@ -196,9 +170,7 @@
|
||||
<span id="captcha" class="d-block mb-1">
|
||||
<img src="{$ABS_PATH}inc/captcha.php" alt="{#COMMENT_FORM_CODE#}" class="img-fluid border rounded" style="cursor: pointer;" width="120" height="60" border="0" />
|
||||
</span>
|
||||
<a href="javascript:void(0);" id="reload_captcha" class="small text-decoration-none text-muted">
|
||||
<i class="bi bi-arrow-clockwise"></i> {if #COMMENT_RELOAD_CODE#}{#COMMENT_RELOAD_CODE#}{else}Обновить код{/if}
|
||||
</a>
|
||||
<a href="javascript:void(0);" id="reload_captcha" class="small text-decoration-none text-muted"><i class="bi bi-arrow-clockwise"></i> Обновить код</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
@@ -208,7 +180,6 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{* Кнопки отправки *}
|
||||
<div class="mt-4">
|
||||
<button type="submit" class="btn btn-success me-2">
|
||||
<i class="bi bi-send-fill me-1"></i> {#COMMENT_BUTTON_ADD#}
|
||||
@@ -218,7 +189,6 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{* Скрытые поля *}
|
||||
<input name="module" type="hidden" value="comment" />
|
||||
<input name="action" type="hidden" value="comment" />
|
||||
<input name="sub" type="hidden" value="send" />
|
||||
@@ -239,26 +209,22 @@
|
||||
{/if}
|
||||
|
||||
{* Модальное окно удаления *}
|
||||
<div class="modal fade" id="deleteCommentModal" tabindex="-1" aria-labelledby="deleteCommentModalLabel" aria-hidden="true">
|
||||
<div class="modal fade" id="deleteCommentModal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-danger text-white">
|
||||
<h5 class="modal-title" id="deleteCommentModalLabel">Подтверждение действия</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Закрыть"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
Вы уверены, что хотите **удалить этот комментарий**?
|
||||
Это действие необратимо.
|
||||
<h5 class="modal-title">Подтверждение удаления</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">Вы уверены? Это действие необратимо.</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
|
||||
<button type="button" class="btn btn-danger" id="confirmDeleteButton">Удалить комментарий</button>
|
||||
<button type="button" class="btn btn-danger" id="confirmDeleteButton">Удалить</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{* ПЕРЕМЕННЫЕ JAVASCRIPT *}
|
||||
<script type="text/javascript">
|
||||
var COMMENT_SITE_CLOSE = '{#COMMENT_SITE_CLOSE#}';
|
||||
var COMMENT_SITE_OPEN = '{#COMMENT_SITE_OPEN#}';
|
||||
@@ -288,17 +254,13 @@
|
||||
var MAX_CHARS = '{$comment_max_chars}';
|
||||
var aveabspath = '{$ABS_PATH}';
|
||||
|
||||
// Глобальная переменная для JS
|
||||
// --- ОБНОВЛЕННЫЕ ПЕРЕМЕННЫЕ ---
|
||||
var SHOW_USER_RATING = '{$comment_show_user_rating|default:0}';
|
||||
var SHOW_USER_RATING_REPLIES = '{$comment_show_user_rating_replies|default:0}';
|
||||
var RATING_ANON_SET = '{$comment_rating_anon_set|default:0}';
|
||||
// ДОБАВЛЕНО: Настройка прав на загрузку для JS
|
||||
var ALLOW_FILES_ANON = '{$comment_allow_files_anon|default:0}';
|
||||
</script>
|
||||
<script src="{$ABS_PATH}modules/comment/js/comment.js" type="text/javascript"></script>
|
||||
<style>
|
||||
.fade-out { opacity: 0; transition: opacity 0.5s ease; }
|
||||
.italic { font-style: italic; }
|
||||
</style>
|
||||
|
||||
{/if}
|
||||
{/if}
|
||||
@@ -1,5 +1,9 @@
|
||||
{foreach from=$subcomments item=c}
|
||||
<div class="card mb-3 mod_comment_comment{if $c.parent_id} ms-2 ms-md-4{/if}" id="comment_wrapper_{$c.Id}" data-user-rating="{$c.user_rating|default:0}" data-is-own="{if isset($c.is_my_own) && $c.is_my_own}1{else}0{/if}">
|
||||
<div class="card mb-3 mod_comment_comment{if $c.parent_id} ms-2 ms-md-4{/if}"
|
||||
id="comment_wrapper_{$c.Id}"
|
||||
data-parent="{$c.parent_id|default:0}"
|
||||
data-user-rating="{$c.user_rating|default:0}"
|
||||
data-is-own="{if isset($c.is_my_own) && $c.is_my_own}1{else}0{/if}">
|
||||
|
||||
{if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id}
|
||||
<div class="border border-warning border-3 rounded p-0">
|
||||
@@ -107,7 +111,7 @@
|
||||
{if $c.can_edit && isset($c.edit_time_left) && $c.edit_time_left > 0}
|
||||
<div class="text-muted small d-flex align-items-center" id="timer_container_{$c.Id}">
|
||||
<i class="bi bi-hourglass-split text-primary me-1"></i>
|
||||
<span id="timer_{$c.Id}" data-left="{$c.edit_time_left}" class="fw-bold">
|
||||
<span id="timer_{$c.Id}" data-left="{$c.edit_time_left}" class="timer-count fw-bold">
|
||||
{math equation="floor(x/60)" x=$c.edit_time_left}:{if ($c.edit_time_left%60) < 10}0{/if}{math equation="x%60" x=$c.edit_time_left}
|
||||
</span>
|
||||
</div>
|
||||
@@ -124,10 +128,13 @@
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{if $c.can_edit}
|
||||
<a class="btn btn-sm btn-link text-warning mod_comment_edit px-2" title="Редактировать" href="javascript:void(0);" data-id="{$c.Id}"><i class="bi bi-pencil-square"></i></a>
|
||||
<a class="btn btn-sm btn-link text-danger mod_comment_delete px-2" title="Удалить" href="javascript:void(0);" data-id="{$c.Id}"><i class="bi bi-trash"></i></a>
|
||||
{/if}
|
||||
{* Контейнер для кнопок, которые скрываются таймером *}
|
||||
<span id="controls_{$c.Id}" class="d-flex align-items-center gap-1">
|
||||
{if $c.can_edit}
|
||||
<a class="btn btn-sm btn-link text-warning mod_comment_edit px-2" title="Редактировать" href="javascript:void(0);" data-id="{$c.Id}"><i class="bi bi-pencil-square"></i></a>
|
||||
<a class="btn btn-sm btn-link text-danger mod_comment_delete px-2" title="Удалить" href="javascript:void(0);" data-id="{$c.Id}"><i class="bi bi-trash"></i></a>
|
||||
{/if}
|
||||
</span>
|
||||
|
||||
{if $smarty.const.UGROUP==1}
|
||||
<a class="btn btn-sm btn-link text-dark mod_comment_lock px-2" href="javascript:void(0);" data-id="{$c.Id}">
|
||||
|
||||
Reference in New Issue
Block a user