обновляем , добавляем ...

This commit is contained in:
2025-12-15 15:44:36 +05:00
parent 967c46cd6d
commit 845481dc69
4 changed files with 222 additions and 75 deletions

View File

@@ -286,6 +286,25 @@ class Comment
$date_time_format = $AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT');
while ($row = $sql->FetchAssocArray())
{
// -----------------------------------------------------
// !!! НАЧАЛО: ВНЕДРЕНИЕ АВАТАРА !!!
// -----------------------------------------------------
if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0)
{
// Вызываем глобальную функцию getAvatar с нужным размером (48px)
// и сохраняем результат в поле 'avatar' для Smarty:
$row['avatar'] = getAvatar($row['comment_author_id'], 48);
}
else
{
// Для гостей (comment_author_id = 0) или неавторизованных:
// Передаем пустую строку, чтобы Smarty использовал заглушку.
$row['avatar'] = '';
}
// -----------------------------------------------------
// !!! КОНЕЦ: ВНЕДРЕНИЕ АВАТАРА !!!
// -----------------------------------------------------
$row['comment_published'] = ave_date_format($date_time_format, $row['comment_published']);
$row['comment_changed'] = ave_date_format($date_time_format, $row['comment_changed']);
@@ -475,6 +494,22 @@ class Comment
// на странице.
if ($ajax)
{
// ---------------------------------------------------------------------
// !!! НАЧАЛО: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА (ПОЛУЧЕНИЕ АВАТАРА) !!!
// ---------------------------------------------------------------------
if (isset($new_comment['comment_author_id']) && $new_comment['comment_author_id'] > 0)
{
// Вызываем глобальную функцию getAvatar с нужным размером (48px)
$new_comment['avatar'] = getAvatar($new_comment['comment_author_id'], 48);
}
else
{
// Для гостей
$new_comment['avatar'] = '';
}
// ---------------------------------------------------------------------
// !!! КОНЕЦ: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА !!!
// ----
$new_comment['comment_changed'] = 0;
$new_comment['comment_published'] = ave_date_format($AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT'), $new_comment['comment_published']);
$subcomments[] = $new_comment;

View File

@@ -0,0 +1,88 @@
/* ====================================================================
ОБЩИЕ СТИЛИ КОММЕНТАРИЕВ И АВАТАРОВ (НОВЫЕ И ОБНОВЛЕННЫЕ)
==================================================================== */
/* 1. Общие настройки для блока комментария */
.mod_comment_comment {
/* Можно добавить небольшой отступ снизу, если стандартный mb-3 недостаточен */
/* margin-bottom: 1.5rem !important; */
}
/* 2. Контейнер аватара */
.mod_comment_avatar {
/* Фиксируем размер и убедимся, что аватар не "съедет" */
width: 48px;
height: 48px;
margin-right: 20px !important;
/* Убедимся, что аватар имеет правильный отступ от метаданных/текста */
/* margin-right: 15px; */ /* Если вы используете me-3 в HTML, этот CSS не нужен */
}
/* 3. Стиль изображения аватара */
.mod_comment_avatar img {
/* Если rounded-circle не работает или его нет в Bootstrap */
border-radius: 50%;
width: 100%;
height: 100%;
object-fit: cover; /* Гарантирует, что изображение не исказится */
}
/* 4. Стиль метаданных (Автор, Дата, IP) */
.mod_comment_meta {
/* Делаем блок метаданных компактнее и выравниваем по верхнему краю */
line-height: 1.2;
margin-bottom: 5px !important; /* Чуть меньше отступ от текста */
}
/* 5. Стили текста комментария */
.mod_comment_text {
/* Увеличиваем межстрочный интервал для лучшей читабельности */
line-height: 1.5;
}
/* 6. Стили панели действий (Редактировать, Удалить, Ответить) */
.mod_comment_actions a {
text-decoration: none;
font-size: 0.9em;
padding-left: 10px;
padding-right: 10px;
}
/* ====================================================================
СТИЛИ ДЛЯ ДРЕВОВИДНОГО ОТОБРАЖЕНИЯ КОММЕНТАРИЕВ (Replies) - ВАШ КОД
==================================================================== */
/* 1. Общий контейнер ответа, который находится внутри .mod_comment_comment
и имеет отступ ms-4 */
.mod_comment_comment .mod_comment_comment.ms-4 {
/* Добавляем вертикальную линию слева */
border-left: 3px solid #dee2e6; /* Легкая граница */
/* Уменьшаем margin-left, который дает ms-4, чтобы освободить место
для линии и при этом не уходить слишком далеко вправо на каждом уровне. */
margin-left: 20px !important; /* Принудительно уменьшаем отступ */
padding-left: 15px; /* Отступ между линией и контентом ответа */
/* Опционально: немного отличающийся фон */
background-color: #f8f9fa;
}
/* 2. Отдельно стилизуем рамку для вложенных карточек, чтобы они не выглядели
громоздко внутри родителя */
.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box {
border: none !important; /* Убираем стандартную рамку карточки, чтобы осталась только наша вертикальная линия */
}
/* 3. Убираем рамки у вложенных заголовков, чтобы линия была чистой */
.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box > .card-header {
border-bottom: none !important;
}
/* 4. Более глубокий уровень вложенности (если ответов много) */
/* Если ответ на ответ имеет дополнительный ms-4, стилизуем его дальше */
.mod_comment_comment .mod_comment_comment.ms-4 .mod_comment_comment.ms-4 {
border-color: #adb5bd; /* Чуть темнее линия для следующего уровня */
background-color: #fff; /* Возвращаем белый фон для контраста */
}

BIN
img/no_avatar.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -1,90 +1,114 @@
{foreach from=$subcomments item=c}
{* Контейнер комментария: Используем .card для блока, и ms-4 для вложенности *}
<div class="card mb-3 mod_comment_comment{if $c.parent_id} ms-4{/if}">
<div class="card mb-3 mod_comment_comment{if $c.parent_id} ms-4{/if}">
{* Подсветка (Highlight) *}
{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">
{/if}
{* Подсветка (Highlight) *}
{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">
{/if}
<div id="{$c.Id}" class="mod_comment_box">
{* Заголовок комментария: Используем card-header и d-flex для выравнивания метаданных и иконок *}
<div class="card-header mod_comment_header d-flex justify-content-between align-items-center bg-light clearfix">
{* Информация об авторе и дате *}
<div class="mod_comment_author text-muted small me-2">
{* Автор (Иконка fa-user) *}
<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>
{* Дата публикации (Иконка fa-clock) *}
<span class="ms-2"><i class="fa fa-clock-o me-1"></i> {$c.comment_published}</span>
{* IP-адрес (для Админа) *}
{if $smarty.const.UGROUP==1}
<span class="ms-2 text-secondary">• IP:{$c.comment_author_ip}</span>
{/if}
{* Метка "Изменено" *}
<span class="mod_comment_changed">{if isset($c.comment_changed) && $c.comment_changed > 1} (<span class="text-secondary">{#COMMENT_TEXT_CHANGED#} {$c.comment_changed}</span>){/if}</span>
</div>
<div id="{$c.Id}" class="mod_comment_box">
{* Иконки действий - Используем p-2 me-3 для интервала и кликабельности *}
<div class="mod_comment_icons d-flex align-items-center flex-shrink-0">
{* Ссылка "Ответить" (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 me-3 text-primary" href="javascript:void(0);" rel="{$c.Id}" title="{#COMMENT_ANSWER_LINK#}">
<i class="fa fa-reply"></i>
</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 me-3 text-secondary" href="javascript:void(0);" title="{#COMMENT_EDIT_LINK#}">
<i class="fa fa-pencil"></i>
</a>
{/if}
{if $smarty.const.UGROUP==1}
{* Замок (Разблокировать/Заблокировать) *}
{if $c.comment_status!=1}
<a class="mod_comment_unlock p-2 me-3 text-success" href="javascript:void(0);" title="{#COMMENT_UNLOCK_LINK#}">
<i class="fa fa-unlock"></i>
</a>
{else}
<a class="mod_comment_lock p-2 me-3 text-dark" href="javascript:void(0);" title="{#COMMENT_LOCK_LINK#}">
<i class="fa fa-lock"></i>
</a>
{/if}
{* ===================================================================== *}
{* ТЕЛО КОММЕНТАРИЯ (Включает Аватар, Автор, Метаданные и Текст) *}
{* ===================================================================== *}
<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}
{/if}
<div class="mod_comment_avatar flex-shrink-0 me-3">
<img src="{$avatar_url}" alt="Аватар пользователя {$c.comment_author_name|stripslashes|escape}" class="rounded-circle" style="width: 48px; height: 48px;" loading="lazy" />
</div>
{* -------------------------- *}
<div class="flex-grow-1">
{* Информация об авторе и дате (Сохраняем полную информацию) *}
<div class="mod_comment_meta mb-2 text-muted small">
{* Корзина (Удалить) *}
<a class="mod_comment_delete p-2 text-danger" href="javascript:void(0);" title="{#COMMENT_DELETE_LINK#}">
<i class="fa fa-trash-o"></i>
{* Автор *}
<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>
{* Дата публикации *}
<span class="ms-2"><i class="fa fa-clock-o me-1"></i> {$c.comment_published}</span>
{* IP-адрес (для Админа) *}
{if $smarty.const.UGROUP==1}
<span class="ms-2 text-secondary">• IP:{$c.comment_author_ip}</span>
{/if}
{* Метка "Изменено" *}
<span class="mod_comment_changed">{if isset($c.comment_changed) && $c.comment_changed > 1} (<span class="text-secondary">{#COMMENT_TEXT_CHANGED#} {$c.comment_changed}</span>){/if}</span>
</div>
{* Текст комментария *}
<div class="mod_comment_text{if $smarty.const.UGROUP==1 || $c.comment_author_id==$smarty.session.user_id|default:'*'} editable_text{/if}">{$c.comment_text|escape}</div>
</div>
</div>
{* --------------------------------------------------------------------- *}
{* ===================================================================== *}
{* ПАНЕЛЬ ДЕЙСТВИЙ (card-footer) *}
{* ===================================================================== *}
<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#}
</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> Редактировать
</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>
</a>
{/if}
</div>
</div>
{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>
</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>
</a>
{/if}
{* Тело комментария: Используем card-body *}
<div class="card-body mod_comment_text{if $smarty.const.UGROUP==1 || $c.comment_author_id==$smarty.session.user_id|default:'*'} editable_text{/if}">{$c.comment_text|escape}</div>
</div>
</div>
{* --------------------------------------------------------------------- *}
</div>
{* Закрываем подсветку *}
{if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id}
</div>
{/if}
{* Закрываем подсветку *}
{if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id}
</div>
{/if}
{* Точка вставки формы ответа *}
<span id="end{$c.Id}"></span>
{* Точка вставки формы ответа *}
<span id="end{$c.Id}"></span>
{* Рекурсивный вызов дочерних комментариев *}
{if isset($comments) && isset($comments[$c.Id])}
<div class="mt-3">
{* Рекурсивный вызов дочерних комментариев *}
{if isset($comments) && isset($comments[$c.Id])}
<div class="mt-3">
{include file="$subtpl" subcomments=$comments[$c.Id] sub=1}
</div>
{/if}
{/if}
</div> {* Закрывает mod_comment_comment *}
</div> {* Закрывает mod_comment_comment *}
{/foreach}