обновляем , добавляем ...
This commit is contained in:
@@ -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;
|
||||
|
||||
88
css/mod_comment_styles.css
Normal file
88
css/mod_comment_styles.css
Normal 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
BIN
img/no_avatar.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
@@ -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}
|
||||
Reference in New Issue
Block a user