diff --git a/class/comment.php b/class/comment.php index ec1ddd4..a42cb6f 100644 --- a/class/comment.php +++ b/class/comment.php @@ -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; diff --git a/css/mod_comment_styles.css b/css/mod_comment_styles.css new file mode 100644 index 0000000..840e7ed --- /dev/null +++ b/css/mod_comment_styles.css @@ -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; /* Возвращаем белый фон для контраста */ +} \ No newline at end of file diff --git a/img/no_avatar.webp b/img/no_avatar.webp new file mode 100644 index 0000000..7e2684b Binary files /dev/null and b/img/no_avatar.webp differ diff --git a/templates/comments_tree_sub.tpl b/templates/comments_tree_sub.tpl index 7154828..708f6de 100644 --- a/templates/comments_tree_sub.tpl +++ b/templates/comments_tree_sub.tpl @@ -1,90 +1,114 @@ {foreach from=$subcomments item=c} - + {* Контейнер комментария: Используем .card для блока, и ms-4 для вложенности *} -
+
- {* Подсветка (Highlight) *} - {if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id} -
- {/if} + {* Подсветка (Highlight) *} + {if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id} +
+ {/if} -
- - {* Заголовок комментария: Используем card-header и d-flex для выравнивания метаданных и иконок *} -
- - {* Информация об авторе и дате *} -
- {* Автор (Иконка fa-user) *} - {#COMMENT_USER_ADD#} {$c.comment_author_name|stripslashes|escape} - - {* Дата публикации (Иконка fa-clock) *} - {$c.comment_published} - - {* IP-адрес (для Админа) *} - {if $smarty.const.UGROUP==1} - • IP:{$c.comment_author_ip} - {/if} - - {* Метка "Изменено" *} - {if isset($c.comment_changed) && $c.comment_changed > 1} ({#COMMENT_TEXT_CHANGED#} {$c.comment_changed}){/if} -
+
- {* Иконки действий - Используем p-2 me-3 для интервала и кликабельности *} -
- - {* Ссылка "Ответить" (fa-reply) *} - {if $c.comment_author_id!=$smarty.session.user_id|default:'*' && (($cancomment==1 && $closed!=1) || $smarty.const.UGROUP==1)} - - - - {/if} - - {* ИКОНКА РЕДАКТИРОВАНИЯ (fa-pencil) *} - {if $smarty.const.UGROUP==1 || $c.comment_author_id==$smarty.session.user_id|default:'*'} - - - - {/if} - - {if $smarty.const.UGROUP==1} - {* Замок (Разблокировать/Заблокировать) *} - {if $c.comment_status!=1} - - - - {else} - - - - {/if} + {* ===================================================================== *} + {* ТЕЛО КОММЕНТАРИЯ (Включает Аватар, Автор, Метаданные и Текст) *} + {* ===================================================================== *} +
+ + {* ----- БЛОК АВАТАРА (ИСПРАВЛЕНО) ----- *} + {$avatar_url = "{$ABS_PATH}modules/comment/img/no_avatar.webp"} + {if isset($c.avatar) && $c.avatar != ''} + {$avatar_url = $c.avatar} + {/if} + +
+ Аватар пользователя {$c.comment_author_name|stripslashes|escape} +
+ {* -------------------------- *} + +
+ {* Информация об авторе и дате (Сохраняем полную информацию) *} +
- {* Корзина (Удалить) *} - - + + {* Автор *} + {#COMMENT_USER_ADD#} {$c.comment_author_name|stripslashes|escape} + + {* Дата публикации *} + {$c.comment_published} + + {* IP-адрес (для Админа) *} + {if $smarty.const.UGROUP==1} + • IP:{$c.comment_author_ip} + {/if} + + {* Метка "Изменено" *} + {if isset($c.comment_changed) && $c.comment_changed > 1} ({#COMMENT_TEXT_CHANGED#} {$c.comment_changed}){/if} +
+ + {* Текст комментария *} +
{$c.comment_text|escape}
+ +
+ +
+ {* --------------------------------------------------------------------- *} + + {* ===================================================================== *} + {* ПАНЕЛЬ ДЕЙСТВИЙ (card-footer) *} + {* ===================================================================== *} + -
+ {else} + + + + {/if} + + {* Корзина (Удалить) *} + + + + {/if} - {* Тело комментария: Используем card-body *} -
{$c.comment_text|escape}
-
+
+ {* --------------------------------------------------------------------- *} +
- {* Закрываем подсветку *} - {if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id} -
- {/if} + {* Закрываем подсветку *} + {if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id} +
+ {/if} - {* Точка вставки формы ответа *} - + {* Точка вставки формы ответа *} + - {* Рекурсивный вызов дочерних комментариев *} - {if isset($comments) && isset($comments[$c.Id])} -
+ {* Рекурсивный вызов дочерних комментариев *} + {if isset($comments) && isset($comments[$c.Id])} +
{include file="$subtpl" subcomments=$comments[$c.Id] sub=1}
- {/if} + {/if} -
{* Закрывает mod_comment_comment *} +
{* Закрывает mod_comment_comment *} {/foreach} \ No newline at end of file