в админку добавил возможность для Авторских звезд вкл выкл Использовать в ответах

This commit is contained in:
2025-12-28 23:30:51 +05:00
parent 29a9ed0eec
commit c233fbf0b8
6 changed files with 148 additions and 130 deletions

View File

@@ -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) . "',

View File

@@ -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
View File

@@ -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';";

View File

@@ -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 @@
&nbsp;Включить "Авторские звезды"
</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;" />
&nbsp;Использовать в ответах
</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;
}

View File

@@ -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}

View File

@@ -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}">