From 845481dc69271ce797f38d3ce43851364bea3497 Mon Sep 17 00:00:00 2001 From: Repellent Date: Mon, 15 Dec 2025 15:44:36 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/comment.php | 35 +++++++ css/mod_comment_styles.css | 88 ++++++++++++++++ img/no_avatar.webp | Bin 0 -> 4576 bytes templates/comments_tree_sub.tpl | 174 ++++++++++++++++++-------------- 4 files changed, 222 insertions(+), 75 deletions(-) create mode 100644 css/mod_comment_styles.css create mode 100644 img/no_avatar.webp 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 0000000000000000000000000000000000000000..7e2684b6bbda18f78e52fc32d9c54c179acac37f GIT binary patch literal 4576 zcmV<65g+bSNk&H45dZ*JMM6+kP&il$00000000180RUYA09H^qAY>5$0B}Hh5hJ>PEff8_twe<8nazvFwT?Gm(Jf!^Q!Tl??j|M;KRpJXG@lZ(+Py{!Px^kWCwaNu;{*PUYUXH&UfahvPo~Vop8=V0*9c4M;dby zNEr6PhpewOq`GA?BQ@OzJ^GdncaA^P_ZYV#fu;LB6F{|JaoUUKwdu;H>zbhwR0J%J zaqxWZqd9aaFN-fY`Hd`bVX9>lS!oAPiOVz-sBIt-Ao6opgH*aU`zK{?f;CMIB`$|;AQ2$) zbAKZOH-+JpdXB=}G7c)y@iFr*F!dnGV`N+Z9KJkkRXL1-NxL&TFSfEo`pUWa!7+co zRbc-CX)cF(#(tg)0^{zUC9{9$AywZfrBJ$~6p!NP9rjCWLg~1ptN61l`@xyro?``G z9Oz8A!_M;vyLIN@r`|~dNZT{m&0@GywTAV+*I4NPMU(oY}XYw?HfJSeRr6M0092~|L==@ zUKT`%e!kj|f4hFKLwsq4Q=&t=?BdY^%djtwb}(fENk|w>okjjdA&l$bjD+3$qz?b{ zQ()VC5yAmIm>xdDuFyUrRMhp1hQ>bZTjp7n4jX$xh+v0Z*YmiWS$kCjl_nMK(==3c z@L@KrvLFvgRWDyTH4;=D)yrX&whVHbWg!}Nu49itfc3J>aPYbG{9VAxT`D1oFNemV zE}C%uw>SjwB3ZEpJpn1SH*J4#9eNKfBK(Yl!1z3@~h(=nGeH21`gi}VW zfRSB4$nt8@AG`Yskc}~b&&s2~NsYcNzlv=Pz9ZCY+{cn`nG+T7savWx|*WuR{Iy_|< zao9QLv`!b@HF(^3z7b4LI1{JpXqGFs^FLKeWhz&{7#!1(Kng@mQ3z$V9H_d(gc4Vu z#;GwxlmfMaPK%m!q0P)bkLV=u_C3aQPw4ai6aySF>b?dV7_Ac545CK7sS!aE$n-ug z;eHdVR2!r>H5-d0a2loWxitSru87(N*O_7sa2}0& zL@{6W=#qji;lVl{X^#sXl1!Z-BZc|dCD4}XbT}fxweF=7xSN-(N=nogOp~fuZy4lf zBUsUKd?c34g4Z5Fs~p#BJhQCwR2V&Wv2OXI_1oxMAVjlG6N>Tx?6RNoCrmu%QMG-D za##N3^UPAh2%fbhoJLcRr~>>t^HWN9bnX4SD8_#WqZ!f7LEStWHs$_`_@i4g4=isl z&Rye@=*fE(5W~}?PzYAv`5?+Hul9y|tm^l1cJ(ITVMFkNGC z3Dd;PW{LS!i8zX*{^l$mvYBcU^qJpKo%7BpbwdQwb4+0bU{JZfjfD%0pNF!x0()(2?)B}pv`#fVNW2d#VJ z?Z9CxomFb96|Aw1WkFuh$ZvgiaGRJR{^RB&C2H!HQ}FXe3~ocrM0?mTfI!s78vn`X zAS0F31%mpvMF;AN3>sdh?MsDn$2t7i-$fr@y-4KZc)ox96|5JJ0ZCLjK(0;R?VaP? zQ`8VSW031t80rbycY_H#%xvb0x$_lIjFV>#uj9KIetsIx_L z!A7zB8M8i_iAr~ee&E8Z*+L_SW)@?rNWy9T4I4!HOfRLj;#&^yuU|oIi5o8be-#~I ztn>?n(9;yLz?{#m3}?y+&+uv6UX7t`7r#hS2tx?o&OyYvnNe5%p`~dQ!y;o#$cszj zAwFbe+@Gdw3iO-3<}b)&aDR!bz17v}$7X)uws5w0Hu7; zJ8#eN#UcM%fjhIj%QeA7=#lxcvKr)O=ML9Ie6XvTwm!yHD1h6c95WT0y z|Kx+FzZ8&oba+j}AdwkZumkO++OwejOAo8ctk#KdA7fStl8oO-esKP1qXGo87eM>E zIPEe#A5J5jW!H%wA(>a=lO~3BmW)PjuRvENa^z9FH_oR1ZBHr8ek=W+Y5rHL<4?X9 z3L5HWh_h~E{_Dk&dZ?vO&o&bUde(U%LI&2?Q}k3qC0bT`g|vQHtnJB+uW5|~#NCC0 z6)u7bvAd&}4E2|EWVI#=XzMhFsw#9N+pwD_y9F8}H0TpHal#-pcFQctP-l;oiD|SL zrsiBLpq|t}v2hDt1(Gs4E+edn-?KJ8;va~cQZrh(E@Uw)SD+zo+3$_0TF>V${naHv zIQVqRL77DFt~Oc%OTNXT6iYrbLWM5|-vbg11)c>coSRAz{UPR&Z}_)97&QP5k~GU} z-#6#_8D~;DDJdGI@2bdf^^i8glaoCDFFNqVSe$fTPRj-TnTg;MjAIUD1SW)?{={NS z)dA&!f#2I2A8U>-Oy$12;cI&3v&?_687bUe!(K&Y!)Pkx^1=uSA_#S!Q3sjKoVwf2 z7bIIyN3GwT-XU?a){nsKhA8-L833If0skz_x_Y*F?C z2==0!+3KqW!!yWznLdVax4rd!kn*KqC`kq5lfp@5D>U(wj}w@YQrY6TfVfUaC06j8 z=xOsA@q3S8IM!+2`-iY0cI9x&fQzlVVs_9tNF|(e+?2W%G%-*%3r+Ty5TSurw|?r! zr7O`}W8vZF*ZgNlYZG_@E0!ml$PL~Ld7bW^KAnYWi|1H3la;ns2WXdHk?B$Lb%SsP z01*t>DCik-WxuwNp!a{xFe&G*Vv+(4;JQAF1bw2=XG54t{(#D35I&x`aR^VN4wFRG zO+;+opWu&aHp?KfZ?6hx*joc`7}igeR>Qs+{|L@9ff!M;9D>^KkCS#^*k2Jlw`Gw~ zGRrPa9Nb<-@g*n$X|{+_I&LS)G-G;BlxNx}x-=?lea?LP)mAYbyBt+57D#MJU-ea< z2p2(UOTP6^r@PJULbRVde_Zh{ratZMFp5eFTqVP1)^qqHn=ER58wF#UdcPzz+Mg^7 z{VRs2!U$wirvu|E4JBOxe$Q;54hV&SfBk??%5uxT?jXMbE{O4Z z<&OXe!*w;z{#Z`6&YA%3C}Pau2G8zesPg{?7RZ#{yJQ-2p@U=IyW-2Bm`DiaD?$!_ zHy$g@tOkSbGhM=h$#AYM+Cdb=9Qxe)Svz(uk>Q7RD6fR}YV_d{p35jfJIMab6#}kJ z8YPY(j7@}Wp=O0NE_eYNRwJ^;-rQm4&ln|$ZhK~bE#5B3it#mP#)oMH9iFC z8J?8?<*MBSyuimXXQL#LtG^%b5lh>77>6IsMOo!4TUpWEo2x_w!vaw@kb>f5g#*R4 z4p!MUT+Q0cEV8xJ%}3<<7~dj9n(@^VJ*8)yZ|>6-^lt*geGe#3y|ww%=M4KH6g?ZK zy|LYHF(Y1J{-!Y8>KrJX;@#h)8JBkAuVfRQNL;LT^ToPz+Md|aK%aMSfRh}on^3(9 zo#Q`!QG-T_FrcP}m#f5>-nu@=8DKbi ztFpSAk(Qk?#>CZwYCdWRLK;AW%Hlf|5lfP(qvJxCs9Gtmv`k}OS_j^mxocpYpzw3h zpTBc9TfT-k57*#E8G4kt)C6+_X#)QICV5e>p@)ehhIwzjb$gwTg{CaF9nN5jmJpIX z&vy)?9M@32{+&ohtAJRFJ%ZuCq=t^9WH>6A^@;-di5}c2rt~S&fuEYI$)vpF-qNfG z7Ks`|bPRT|of_gkwjRUU?kHNwDA3$5Vsgvhd+KKZ1%qj1`l{kgjzW;4{Ffj1#@$C! zxK+c(RcB2y=TPM32NjQd>8G=G9tf?&w}A@h-Pn+}QuyMn+XuxaT=ETD+Y zzA45vf~XIM<>|bR$oSJ&wWO$y3mhD!Y)@v#w4ut>R}r%vcb0FZHXi#1V&F)HH6eS-3&+bT2 z%vsSrf?={jnZ;~|$%CY;66L}5-JK%lp3O2+B%8W$_d89+a0H`GpTrfcnSu!atz;U4 zDA??CgasDcD@@zL7C_*^CJERO6WK32Z2o8SkEV)wdo-6Os`a zp{3l-``88%*Mg${79Z(FT<h{KT@lktP+s}(W9f- zX+jGB-rowrh~+qk&aUXL$UH`+e~zOr_770=4&He?V?hmB92QFsAf^=r@b&9&SCyyk&?g))YZiX2(Qpq+QHI;Q1yy5%+%z;-pNaqt4pd$ilqgM&b za@hT~N_Y54qDpcqC?OYjj-h`K92Bn6VQUMMFP_OD+G;8EK+}>Ce-Rug0Dgvo+C0Mk zmsF%TGMMhZD>4B)giFluC2U$n-7Qj7Zcg6dUp*H3+U3C1)=EkS4A5GHF_nLV5K)bc zN=_%-J#3!k)cdUnd8^{fr?}EP>>*mMHMI6oyUtv({%M3Yfys~1_RwV`;N&quVJH}r zvYa6GQjMhhQaiT;Rt_1N$3sn!Ce!z63XB;ur2vn;%Aj`5nCo8eIy!%r%P>!z->uyI z${ZdqQ&2)N`@yVi3$&$jZsnY|hL#rU?x0`?3Z~9V?^Pfglzxw@oiN=YFfO%wqXb@~ zU^T#S{Hv468(;O^1Bigw4$-@B+Q0w+08mpwNlpL&060QPO#|%!000005CBL300031 z0su$=000310ysiRO#~ +
- {* Подсветка (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