обновляем

This commit is contained in:
2025-12-15 22:11:35 +05:00
parent 4a44e350ba
commit f0eb9a584c
3 changed files with 252 additions and 146 deletions

View File

@@ -11,28 +11,63 @@
(function($){
// ====================================================================
// КОРРЕКЦИЯ: ПРИНУДИТЕЛЬНАЯ ФИКСАЦИЯ HTTPS
// КОРРЕКЦИЯ: ПРИНУДИТЕЛЬНАЯ ФИКСАЦИЯ HTTPS (если требуется)
// ====================================================================
if (typeof aveabspath !== 'undefined') {
aveabspath = 'https://bag.local/';
// ПРЕДУПРЕЖДЕНИЕ: Если aveabspath должен быть динамическим,
// удалите эту строку.
// aveabspath = 'https://bag.local/';
}
// ====================================================================
/*Limit symbols*/
(function($){$.fn.extend({limit:function(limit,element){var interval,f;var self=$(this);$(this).focus(function(){interval=window.setInterval(substring,100)});$(this).blur(function(){clearInterval(interval);substring()});substringFunction="function substring(){ var val = $(self).val();var length = val.length;if(length > limit){$(self).val($(self).val().substring(0,limit));}";if(typeof element!='undefined')substringFunction+="if($(element).html() != limit-length){$(element).html((limit-length<=0)?'0':limit-length);}";substringFunction+="}";eval(substringFunction);substring()}})})(jQuery);
/* Limit symbols */
(function($){
$.fn.extend({
limit: function(limit, element){
var interval, f;
var self = $(this);
function substring(){
var val = $(self).val();
var length = val.length;
if(length > limit){
$(self).val($(self).val().substring(0,limit));
length = limit;
}
if(typeof element !== 'undefined'){
if($(element).html() != limit - length){
$(element).html((limit - length <= 0) ? '0' : limit - length);
}
}
}
$(this).focus(function(){
interval = window.setInterval(substring, 100);
});
$(this).blur(function(){
clearInterval(interval);
substring();
});
substring();
}
})
})(jQuery);
function getCaptha(){
now = new Date();
$('#captcha img').attr('src', aveabspath+'inc/captcha.php?cd=' + now);
};
var now = new Date();
$('#captcha img').attr('src', aveabspath + 'inc/captcha.php?cd=' + now.getTime());
}
// ИСПРАВЛЕННАЯ ФУНКЦИЯ cAction
function cAction(obj,action){
function cAction(obj, action){
var cid;
// --- Логика для действий с документом (open/close) ---
if (action === 'open' || action === 'close') {
cid = DOC_ID;
cid = DOC_ID;
} else {
// 1. Пытаемся найти ссылку и взять ID из атрибута rel
var $link = $(obj).closest('a.mod_comment_answer');
@@ -49,79 +84,87 @@
return;
}
if (action=='answer'){
if (action === 'answer'){
$('#parent_id').val(cid);
// --- ИСПРАВЛЕНИЕ: Добавлено .show() для отображения формы после перемещения ---
$('#mod_comment_new').insertBefore('#end'+cid).show();
// Перемещаем форму и показываем ее
$('#mod_comment_new').insertBefore('#end' + cid).show();
return;
}
// ... (остальной код для admin actions: delete, lock, open/close)
if (UGROUP==1){
$.get(aveabspath+'index.php',{
// Действия администратора
if (UGROUP == 1){
$.get(aveabspath + 'index.php', {
module: 'comment',
action: action,
docid: DOC_ID,
Id: cid
},function(){
if (action=='delete'){
}, function(){
if (action === 'delete'){
// Удаляем блок комментария
$(obj).parents('.mod_comment_comment').eq(0).remove();
}
if (action=='open'){
$('#mod_comment_open').attr('id', 'mod_comment_close').html(COMMENT_SITE_CLOSE);
if (action === 'open'){
// 1. Меняем ID и текст
var $openButton = $('#mod_comment_open');
$openButton.attr('id', 'mod_comment_close').html('<i class="bi bi-unlock-fill me-1"></i> ' + COMMENT_SITE_CLOSE);
// 2. МЕНЯЕМ КЛАССЫ СТИЛЕЙ
$openButton.removeClass('btn-outline-success').addClass('btn-outline-danger');
}
if (action=='close'){
$('#mod_comment_close').attr('id', 'mod_comment_open').html(COMMENT_SITE_OPEN);
if (action === 'close'){
// 1. Меняем ID и текст
var $closeButton = $('#mod_comment_close');
$closeButton.attr('id', 'mod_comment_open').html('<i class="bi bi-lock-fill me-1"></i> ' + COMMENT_SITE_OPEN);
// 2. МЕНЯЕМ КЛАССЫ СТИЛЕЙ
$closeButton.removeClass('btn-outline-danger').addClass('btn-outline-success');
}
// ====================================================================
// ИСПРАВЛЕНИЕ: ДИНАМИЧЕСКАЯ СМЕНА ИКОНКИ ЗАМКА (Font Awesome)
// ====================================================================
if (action=='unlock'){
// Меняем классы: mod_comment_unlock (открыт) -> mod_comment_lock (закрыт)
// Меняем цвет: text-success (зеленый) -> text-dark (темный)
// Динамическая смена иконки замка для отдельного комментария
if (action === 'unlock'){
$(obj).removeClass('mod_comment_unlock text-success')
.addClass('mod_comment_lock text-dark')
.attr('title',COMMENT_LOCK_LINK)
.find('i.fa') // Ищем иконку FA
.removeClass('fa-unlock').addClass('fa-lock'); // Меняем иконку
.addClass('mod_comment_lock text-dark')
.attr('title', COMMENT_LOCK_LINK)
.find('i')
.removeClass('bi-unlock-fill').addClass('bi-lock-fill');
}
if (action=='lock'){
// Меняем классы: mod_comment_lock (закрыт) -> mod_comment_unlock (открыт)
// Меняем цвет: text-dark (темный) -> text-success (зеленый)
if (action === 'lock'){
$(obj).removeClass('mod_comment_lock text-dark')
.addClass('mod_comment_unlock text-success')
.attr('title',COMMENT_UNLOCK_LINK)
.find('i.fa') // Ищем иконку FA
.removeClass('fa-lock').addClass('fa-unlock'); // Меняем иконку
.addClass('mod_comment_unlock text-success')
.attr('title', COMMENT_UNLOCK_LINK)
.find('i')
.removeClass('bi-lock-fill').addClass('bi-unlock-fill');
}
// ====================================================================
});
}
};
}
// ИСПРАВЛЕННАЯ ФУНКЦИЯ VALIDATE: Устойчива к отсутствию полей
function validate(formData,jqForm,options){
function validate(formData, jqForm, options){
$('.alert').remove();
var form = jqForm ? jqForm[0] : $('#mod_comment_new form')[0];
var form = jqForm ? jqForm[0] : $('#mod_comment_new form')[0];
// Проверка имени
if (form.comment_author_name && !form.comment_author_name.value){
alert(COMMENT_ERROR_AUTHOR);
$(form.comment_author_name).focus();
return false;
}
// Проверка email
if (form.comment_author_email && !form.comment_author_email.value){
alert(COMMENT_ERROR_EMAIL);
$(form.comment_author_email).focus();
return false;
}
// Проверка текста
if (!form.comment_text || !form.comment_text.value){
alert(COMMENT_ERROR_TEXT);
if (form.comment_text) $(form.comment_text).focus();
return false;
}
// Проверка капчи (если требуется)
if (IS_IM && form.securecode && !form.securecode.value){
alert(COMMENT_ERROR_CAPTCHA);
$(form.securecode).focus();
@@ -129,35 +172,48 @@
}
return true;
};
}
function setClickable(){
// Отвязываем предыдущие обработчики, чтобы избежать множественных вызовов
$('.editable_text').off('click');
$('.editable_text').click(function(){
var cid = $(this).parents('.mod_comment_box').attr('id');
var revert = $(this).html();
var textarea = '<p><textarea rows="7" id="ta_'+cid+'" class="editable">'+revert+'</textarea></p>';
var charsLeft = '<p>'+COMMENT_CHARS_LEFT+' <span class="charsLeft" id="charsLeft_'+cid+'"></span></p>';
var buttonSave = '<input type="button" value="'+COMMENT_BUTTON_EDIT+'" class="button saveButton" /> ';
var buttonReset = '<input type="button" value="'+COMMENT_BUTTON_CANCEL+'" class="button cancelButton" />';
$(this).after('<div class="box"><div class="block" id="forms"><fieldset><legend>'+COMMENT_EDIT_TITLE
+'</legend>'+textarea+buttonSave+buttonReset+charsLeft+'</fieldset></div></div>').remove();
$('.saveButton').click(function(){saveChanges(this,false,cid);});
$('.cancelButton').click(function(){saveChanges(this,revert,cid);});
$('#ta_'+cid).limit(MAX_CHARS,'#charsLeft_'+cid);
var $this = $(this);
var cid = $this.parents('.mod_comment_box').attr('id');
var revert = $this.html();
var textarea = '<p><textarea rows="7" id="ta_' + cid + '" class="editable form-control">' + revert + '</textarea></p>';
var charsLeft = '<p>' + COMMENT_CHARS_LEFT + ' <span class="charsLeft badge bg-secondary" id="charsLeft_' + cid + '"></span></p>';
var buttonSave = '<button type="button" class="btn btn-primary saveButton">' + COMMENT_BUTTON_EDIT + '</button> ';
var buttonReset = '<button type="button" class="btn btn-secondary cancelButton">' + COMMENT_BUTTON_CANCEL + '</button>';
$this.after(
'<div class="box"><div class="block" id="forms"><fieldset><legend class="h6">' + COMMENT_EDIT_TITLE
+ '</legend>' + textarea + charsLeft + buttonSave + buttonReset + '</fieldset></div></div>'
).remove();
$('.saveButton').click(function(){saveChanges(this, false, cid);});
$('.cancelButton').click(function(){saveChanges(this, revert, cid);});
$('#ta_' + cid).limit(MAX_CHARS, '#charsLeft_' + cid);
})
.attr('title',COMMENT_EDIT_LINK)
.attr('title', COMMENT_EDIT_LINK)
.mouseover(function(){$(this).addClass('editable');})
.mouseout(function(){$(this).removeClass('editable');});
$('#in_message').limit(MAX_CHARS,'#charsLeft_new');
};
// ИСПРАВЛЕННАЯ ФУНКЦИЯ saveChanges
function saveChanges(obj,cancel,cid){
// Лимит символов для новой формы
$('#in_message').limit(MAX_CHARS, '#charsLeft_new');
}
function saveChanges(obj, cancel, cid){
var $box = $(obj).parents('.box');
if (!cancel){
var t = $(obj).parent().children().children().val();
var t = $box.find('#ta_' + cid).val();
$.ajax({
url: aveabspath+'index.php?ajax=1',
url: aveabspath + 'index.php?ajax=1',
type: 'POST',
data: {
module: 'comment',
@@ -166,84 +222,105 @@
text: t
},
success: function(txt){
$(obj).parent().parent().parent().after('<div class="mod_comment_text editable_text">'+txt+'</div>').remove();
$box.after('<div class="mod_comment_text editable_text">' + txt + '</div>').remove();
var now = new Date();
var date = now.toLocaleString();
$('#'+cid).find('.mod_comment_changed').html(' ('+COMMENT_TEXT_CHANGED+' '+date+')');
var date = now.toLocaleString();
$('#' + cid).find('.mod_comment_changed').html(' (' + COMMENT_TEXT_CHANGED + ' ' + date + ')');
setClickable();
},
error: function(xhr, status, error) {
console.error("AJAX Error (Edit):", status, error);
alert("Ошибка при редактировании комментария. Пожалуйста, проверьте консоль.");
alert("Ошибка при редактировании комментария.");
}
});
}
else {
$(obj).parent().parent().parent().after('<div class="mod_comment_text editable_text">'+cancel+'</div>').remove();
$box.after('<div class="mod_comment_text editable_text">' + cancel + '</div>').remove();
setClickable();
}
};
}
function displayNewComment(data){
if (data=='wrong_securecode'){
$('#captcha').after('<div class="alert alert-error">'+COMMENT_WRONG_CODE+'</div>');
if (data === 'wrong_securecode'){
$('#captcha').after('<div class="alert alert-danger">'+COMMENT_WRONG_CODE+'</div>');
$('#securecode').focus();
}
else {
$('#end'+$('#parent_id').val()).before(data);
$('#end' + $('#parent_id').val()).before(data);
$('#parent_id').val('');
$('#mod_comment_new form')[0].reset();
// --- Перемещаем форму обратно в конец. УБРАНО .hide() для сохранения видимости.
// Перемещаем форму обратно в конец
$('#mod_comment_new').insertAfter('#end');
setClickable();
}
getCaptha();
};
}
$(document).ready(function(){
setClickable();
setClickable();
// Делегирование событий
// Смена капчи
$(document).on('click', '#captcha img', function(){getCaptha();});
$(document).on('click', '.mod_comment_answer', function(){cAction(this,'answer');});
// Ответ на комментарий
$(document).on('click', '.mod_comment_answer', function(e){
e.preventDefault();
cAction(this, 'answer');
});
$(document).on('click', '.mod_comment_edit', function(){
// Редактирование (для администратора/автора)
$(document).on('click', '.mod_comment_edit', function(e){
e.preventDefault();
var cid = $(this).parents('.mod_comment_box').attr('id');
var commentTextBlock = $('#'+cid).find('.mod_comment_text');
var revert = commentTextBlock.html();
var commentTextBlock = $('#' + cid).find('.mod_comment_text');
var revert = commentTextBlock.html();
var textarea = '<p><textarea rows="7" id="ta_'+cid+'" class="editable">'+revert+'</textarea></p>';
var charsLeft = '<p>'+COMMENT_CHARS_LEFT+' <span class="charsLeft" id="charsLeft_'+cid+'"></span></p>';
var buttonSave = '<input type="button" value="'+COMMENT_BUTTON_EDIT+'" class="button saveButton" /> ';
var buttonReset = '<input type="button" value="'+COMMENT_BUTTON_CANCEL+'" class="button cancelButton" />';
var textarea = '<p><textarea rows="7" id="ta_' + cid + '" class="editable form-control">' + revert + '</textarea></p>';
var charsLeft = '<p>' + COMMENT_CHARS_LEFT + ' <span class="charsLeft badge bg-secondary" id="charsLeft_' + cid + '"></span></p>';
var buttonSave = '<button type="button" class="btn btn-primary saveButton">' + COMMENT_BUTTON_EDIT + '</button> ';
var buttonReset = '<button type="button" class="btn btn-secondary cancelButton">' + COMMENT_BUTTON_CANCEL + '</button>';
commentTextBlock.after(
'<div class="box"><div class="block" id="forms"><fieldset><legend>'+COMMENT_EDIT_TITLE
+'</legend>'+textarea+buttonSave+buttonReset+charsLeft+'</fieldset></div></div>'
).remove();
'<div class="box"><div class="block" id="forms"><fieldset><legend class="h6">' + COMMENT_EDIT_TITLE
+ '</legend>' + textarea + charsLeft + buttonSave + buttonReset + '</fieldset></div></div>'
).remove();
$('.saveButton').click(function(){saveChanges(this,false,cid);});
$('.cancelButton').click(function(){saveChanges(this,revert,cid);});
$('#ta_'+cid).limit(MAX_CHARS,'#charsLeft_'+cid);
$('.saveButton').click(function(){saveChanges(this, false, cid);});
$('.cancelButton').click(function(){saveChanges(this, revert, cid);});
$('#ta_' + cid).limit(MAX_CHARS, '#charsLeft_' + cid);
});
if (UGROUP == 1) {
$(document).on('click', '.mod_comment_delete', function(){
if (confirm('Вы уверены, что хотите удалить комментарий?')) {
cAction(this, 'delete');
}
// Удаление (с использованием Bootstrap Modal)
$(document).on('click', '.mod_comment_delete', function(e){
e.preventDefault();
var $deleteButton = $(this);
var $modal = $('#deleteCommentModal');
// Привязываем действие к кнопке подтверждения в модальном окне
$('#confirmDeleteButton').off('click').on('click', function() {
cAction($deleteButton[0], 'delete');
// Закрываем модальное окно (совместимость с BS5)
var modalInstance = bootstrap.Modal.getInstance($modal[0]) || new bootstrap.Modal($modal[0]);
modalInstance.hide();
});
// Открываем модальное окно (совместимость с BS5)
var modal = new bootstrap.Modal($modal[0]);
modal.show();
});
$(document).on('click', '.mod_comment_lock', function(){cAction(this, 'lock');});
$(document).on('click', '.mod_comment_unlock', function(){cAction(this, 'unlock');});
// Блокировка/разблокировка
$(document).on('click', '.mod_comment_lock', function(e){e.preventDefault(); cAction(this, 'lock');});
$(document).on('click', '.mod_comment_unlock', function(e){e.preventDefault(); cAction(this, 'unlock');});
$(document).on('click', '#mod_comment_open', function(){cAction(this,'open');});
$(document).on('click', '#mod_comment_close', function(){cAction(this,'close');});
// Открыть/Закрыть комментарии для документа
$(document).on('click', '#mod_comment_open', function(e){e.preventDefault(); cAction(this, 'open');});
$(document).on('click', '#mod_comment_close', function(e){e.preventDefault(); cAction(this, 'close');});
}
// Отправка формы (AJAX) - ИСПРАВЛЕНИЕ ДВОЙНОЙ ОТПРАВКИ
// Отправка формы (AJAX)
$('#mod_comment_new form').on('submit', function(e){
e.preventDefault();
@@ -253,32 +330,30 @@
}
var submitButton = form.find('input[type="submit"], button[type="submit"]').first();
var originalButtonText = submitButton.val();
var originalButtonText = submitButton.text();
if (!originalButtonText) originalButtonText = submitButton.val();
var formData = form.serialize();
$.ajax({
url: aveabspath+'index.php?ajax=1',
url: aveabspath + 'index.php?ajax=1',
type: 'POST',
data: formData,
dataType: 'html',
// Отключаем кнопку перед отправкой
beforeSend: function() {
submitButton.prop('disabled', true).val('Отправка...');
submitButton.prop('disabled', true).text('Отправка...');
},
// Включаем кнопку обратно и обрабатываем ответ
success: function(data) {
displayNewComment(data);
submitButton.prop('disabled', false).val(originalButtonText);
submitButton.prop('disabled', false).text(originalButtonText);
},
timeout: 3000,
error: function(xhr, status, error) {
error: function(xhr, status, error) {
console.error("AJAX Error (Creation):", status, error);
alert("Ошибка при отправке комментария. Пожалуйста, проверьте консоль.");
// Включаем кнопку обратно в случае ошибки
submitButton.prop('disabled', false).val(originalButtonText);
alert("Ошибка при отправке комментария.");
submitButton.prop('disabled', false).text(originalButtonText);
}
});
return false;

View File

@@ -1,19 +1,19 @@
{if $display_comments==1}
{* ===================================================================== *}
{* НОВОЕ: ПРОВЕРКА ПРАВ НА ЧТЕНИЕ (самый высокий приоритет) *}
{* ПРОВЕРКА ПРАВ НА ЧТЕНИЕ *}
{* ===================================================================== *}
{if $no_read_permission == 1}
<div class="alert alert-warning" role="alert">{#COMMENT_READ_FALSE#}</div>
{else}
{* ===================================================================== *}
{* ВСЁ СУЩЕСТВУЮЩЕЕ СОДЕРЖИМОЕ БЛОКА КОММЕНТАРИЕВ (если права есть) *}
{* БЛОК КОММЕНТАРИЕВ *}
{* ===================================================================== *}
<h3 class="mb-3">
{#COMMENT_SITE_TITLE#}
{if $closed==1 && $smarty.const.UGROUP!=1}
{if $closed==1 && $smarty.const.UGROUP!=1}
<span class="badge bg-secondary ms-2">{#COMMENT_SITE_CLOSED#}</span>
{/if}
</h3>
@@ -38,7 +38,6 @@
{/if}
</div>
{* ИСПРАВЛЕНИЕ 1: Добавлена проверка isset() для безопасного доступа к $comments[0] *}
{if isset($comments[0])}
<div class="comments-list">
{include file="$subtpl" subcomments=$comments[0]}
@@ -48,7 +47,7 @@
<a id="end"></a>
{* ===================================================================== *}
{* ФОРМА ДОБАВЛЕНИЯ КОММЕНТАРИЯ (MODAL/BLOCK) *}
{* ФОРМА ДОБАВЛЕНИЯ КОММЕНТАРИЯ *}
{* ===================================================================== *}
<div class="mt-5">
{if $closed==1 && $smarty.const.UGROUP!=1}
@@ -67,26 +66,35 @@
<fieldset>
<legend class="d-none">Форма добавления комментария</legend>
{* Блок для имени и email (скрытые поля для авторизованных) *}
{* Блок для имени и email *}
{if $smarty.session.user_group != '2'}
{* АВТОРИЗОВАННЫЙ ПОЛЬЗОВАТЕЛЬ *}
<input name="comment_author_name" type="hidden" id="in_author_name" value="{if isset($smarty.session.user_name)}{$smarty.session.user_name|escape|stripslashes}{/if}" />
{* ИСПРАВЛЕНИЕ: Добавлена проверка isset для user_email *}
{if isset($smarty.session.user_email) && $smarty.session.user_email != ''}
<input name="comment_author_email" type="hidden" id="in_author_email" value="{$smarty.session.user_email|escape|stripslashes}" />
{/if}
{* АВТОРИЗОВАННЫЙ ПОЛЬЗОВАТЕЛЬ: Отображаем поля как readonly *}
<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>
<input type="text" id="in_author_name_display" class="form-control" value="{$smarty.session.user_name|default:''|escape|stripslashes}" readonly />
</div>
<div class="col-md-6">
<label for="in_author_email_display" class="form-label">{#COMMENT_YOUR_EMAIL#}</label>
<input type="email" id="in_author_email_display" class="form-control" value="{$smarty.session.user_email|default:''|escape|stripslashes}" readonly />
</div>
</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>
<input name="comment_author_name" type="text" id="in_author_name" class="form-control" placeholder="{#COMMENT_YOUR_NAME#}" value="{if isset($smarty.request.comment_author_name)}{$smarty.request.comment_author_name|escape|stripslashes}{/if}" />
<label for="in_author_name" class="form-label">{#COMMENT_YOUR_NAME#}*</label>
<input name="comment_author_name" type="text" id="in_author_name" class="form-control" placeholder="{#COMMENT_YOUR_NAME#}" value="{$smarty.request.comment_author_name|default:''|escape|stripslashes}" />
</div>
{* ГОСТЬ (email) *}
<div class="col-md-6">
<label for="in_author_email" class="form-label">{#COMMENT_YOUR_EMAIL#}</label>
<input name="comment_author_email" type="email" id="in_author_email" class="form-control" placeholder="{#COMMENT_YOUR_EMAIL#}" value="{if isset($smarty.request.comment_author_email)}{$smarty.request.comment_author_email|escape|stripslashes}{/if}" />
<label for="in_author_email" class="form-label">{#COMMENT_YOUR_EMAIL#}*</label>
<input name="comment_author_email" type="email" id="in_author_email" class="form-control" placeholder="{#COMMENT_YOUR_EMAIL#}" value="{$smarty.request.comment_author_email|default:''|escape|stripslashes}" />
</div>
</div>
{/if}
@@ -95,14 +103,12 @@
<div class="row mb-3">
<div class="col-md-6 mb-3 mb-md-0">
<label for="in_author_website" class="form-label">{#COMMENT_YOUR_SITE#} (необязательно)</label>
{* ИСПРАВЛЕНИЕ 2: Безопасное чтение comment_author_website через if/else *}
<input name="comment_author_website" type="text" id="in_author_website" class="form-control" placeholder="{#COMMENT_YOUR_SITE#}" value="{if isset($smarty.request.comment_author_website)}{$smarty.request.comment_author_website|escape|stripslashes}{else}{/if}" />
<input name="comment_author_website" type="text" id="in_author_website" class="form-control" placeholder="{#COMMENT_YOUR_SITE#}" value="{$smarty.request.comment_author_website|default:''|escape|stripslashes}" />
</div>
<div class="col-md-6">
<label for="in_author_city" class="form-label">{#COMMENT_YOUR_FROM#} (необязательно)</label>
{* ИСПРАВЛЕНИЕ 3: Безопасное чтение comment_author_city через if/else *}
<input name="comment_author_city" type="text" id="in_author_city" class="form-control" placeholder="{#COMMENT_YOUR_FROM#}" value="{if isset($smarty.request.comment_author_city)}{$smarty.request.comment_author_city|escape|stripslashes}{else}{/if}" />
<input name="comment_author_city" type="text" id="in_author_city" class="form-control" placeholder="{#COMMENT_YOUR_FROM#}" value="{$smarty.request.comment_author_city|default:''|escape|stripslashes}" />
</div>
</div>
@@ -155,7 +161,7 @@
</div>
</div>
{/if}
</div> {* <-- Закрывает mt-5 для формы *}
</div>
{if $page_nav}
<div class="page_navigation_box mt-4">
@@ -163,6 +169,32 @@
</div>
{/if}
{* ===================================================================== *}
{* НОВОЕ: МОДАЛЬНОЕ ОКНО ПОДТВЕРЖДЕНИЯ УДАЛЕНИЯ КОММЕНТАРИЯ (Bootstrap 5) *}
{* ===================================================================== *}
<div class="modal fade" id="deleteCommentModal" tabindex="-1" aria-labelledby="deleteCommentModalLabel" aria-hidden="true">
<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">
Вы уверены, что хотите **удалить этот комментарий**?
Это действие необратимо.
</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>
</div>
</div>
</div>
</div>
{* ===================================================================== *}
{* ПЕРЕМЕННЫЕ JAVASCRIPT И ПОДКЛЮЧЕНИЕ ФАЙЛА *}
{* ===================================================================== *}
<script type="text/javascript">
var COMMENT_SITE_CLOSE = '{#COMMENT_SITE_CLOSE#}';
var COMMENT_SITE_OPEN = '{#COMMENT_SITE_OPEN#}';

View File

@@ -15,7 +15,7 @@
{* ===================================================================== *}
<div class="card-body p-3 d-flex align-items-start">
{* ----- БЛОК АВАТАРА (ИСПРАВЛЕНО) ----- *}
{* ----- БЛОК АВАТАРА ----- *}
{$avatar_url = "{$ABS_PATH}modules/comment/img/no_avatar.webp"}
{if isset($c.avatar) && $c.avatar != ''}
{$avatar_url = $c.avatar}
@@ -27,15 +27,14 @@
{* -------------------------- *}
<div class="flex-grow-1">
{* Информация об авторе и дате (Сохраняем полную информацию) *}
{* Информация об авторе и дате *}
<div class="mod_comment_meta mb-2 text-muted small">
{* Автор *}
<i class="fa fa-user me-1"></i> {#COMMENT_USER_ADD#} <a title="{#COMMENT_INFO#}" href="javascript:void(0);" onclick="popup('{$ABS_PATH}index.php?module=comment&action=postinfo&pop=1&Id={$c.Id}&theme={$theme}','comment','500','300','1');" class="fw-bold link-dark">{$c.comment_author_name|stripslashes|escape}</a>
{* Автор - ИКОНКА ОБНОВЛЕНА *}
<i class="bi bi-person me-1"></i> {#COMMENT_USER_ADD#} <a title="{#COMMENT_INFO#}" href="javascript:void(0);" onclick="popup('{$ABS_PATH}index.php?module=comment&action=postinfo&pop=1&Id={$c.Id}&theme={$theme}','comment','500','300','1');" class="fw-bold link-dark">{$c.comment_author_name|stripslashes|escape}</a>
{* Дата публикации *}
<span class="ms-2"><i class="fa fa-clock-o me-1"></i> {$c.comment_published}</span>
{* Дата публикации - ИКОНКА ОБНОВЛЕНА *}
<span class="ms-2"><i class="bi bi-clock me-1"></i> {$c.comment_published}</span>
{* IP-адрес (для Админа) *}
{if $smarty.const.UGROUP==1}
@@ -59,35 +58,35 @@
{* ===================================================================== *}
<div class="card-footer mod_comment_actions d-flex justify-content-end align-items-center bg-white border-top p-2">
{* Ссылка "Ответить" (fa-reply) *}
{* Ссылка "Ответить" - ИКОНКА ОБНОВЛЕНА *}
{if $c.comment_author_id!=$smarty.session.user_id|default:'*' && (($cancomment==1 && $closed!=1) || $smarty.const.UGROUP==1)}
<a class="mod_comment_answer p-2 text-primary" href="javascript:void(0);" rel="{$c.Id}" title="{#COMMENT_ANSWER_LINK#}">
<i class="fa fa-reply me-1"></i> {#COMMENT_ANSWER_LINK#}
<i class="bi bi-reply-fill me-1"></i> {#COMMENT_ANSWER_LINK#}
</a>
{/if}
{* ИКОНКА РЕДАКТИРОВАНИЯ (fa-pencil) *}
{* ИКОНКА РЕДАКТИРОВАНИЯ - ИКОНКА ОБНОВЛЕНА *}
{if $smarty.const.UGROUP==1 || $c.comment_author_id==$smarty.session.user_id|default:'*'}
<a class="mod_comment_edit p-2 text-secondary" href="javascript:void(0);" title="{#COMMENT_EDIT_LINK#}">
<i class="fa fa-pencil me-1"></i> Редактировать
<i class="bi bi-pencil-square me-1"></i> Редактировать
</a>
{/if}
{if $smarty.const.UGROUP==1}
{* Замок (Разблокировать/Заблокировать) *}
{* Замок (Разблокировать/Заблокировать) - ИКОНКИ ОБНОВЛЕНЫ *}
{if $c.comment_status!=1}
<a class="mod_comment_unlock p-2 text-success" href="javascript:void(0);" title="{#COMMENT_UNLOCK_LINK#}">
<i class="fa fa-unlock me-1"></i>
<i class="bi bi-unlock-fill me-1"></i>
</a>
{else}
<a class="mod_comment_lock p-2 text-dark" href="javascript:void(0);" title="{#COMMENT_LOCK_LINK#}">
<i class="fa fa-lock me-1"></i>
<i class="bi bi-lock-fill me-1"></i>
</a>
{/if}
{* Корзина (Удалить) *}
{* Корзина (Удалить) - ИКОНКА ОБНОВЛЕНА *}
<a class="mod_comment_delete p-2 text-danger" href="javascript:void(0);" title="{#COMMENT_DELETE_LINK#}">
<i class="fa fa-trash-o me-1"></i>
<i class="bi bi-trash me-1"></i>
</a>
{/if}