CLANGAMING.Net Форуми CLANGAMING.Net
Българският портал за CS 1.6
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ПотребителиПотребители   Потребителски групиПотребителски групи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Урок: Аватари в списъка с форуми (с линк към профила)

 
Създайте нова тема   Напишете отговор    CLANGAMING.Net Форуми -> Уеб програмиране
Предишната тема :: Следващата тема  
Автор Съобщение
AetheldredaBG
Главен Администратор
Главен Администратор
AetheldredaBG

Регистриран на: 14 Сеп 2026
Мнения: 15
Местожителство: София, България

МнениеПуснато на: Сря Сеп 16, 2026 11:13 pm    Заглавие: Урок: Аватари в списъка с форуми (с линк към профила) Отговорете с цитат

Урок: Аватари в списъка с форуми (с линк към профила)
Тема: subSilver • phpBB 2.x • начална страница • CLANGAMING.NET

Внимание: Този урок е писан специално за CLANGAMING.NET. Копирането, препубликуването или разпространението му без знание и съгласие на администрацията на CLANGAMING.NET не е позволено.

Какво ще получиш:
В списъка с форуми, в колоната Последно мнение, се показва аватарът на последния писал. Клик върху аватара отваря профила му. Гостите нямат линк.

Задължително преди този урок:
Трябва вече да е направен урокът „Последни теми“, защото оттам идват:

  • функцията phpbb_user_avatar() в includes/functions.php
  • CSS класовете recent-avatar и recent-avatar-link в templates/subSilver/overall_header.tpl

Без тях този урок няма да работи. Ако вече ги имаш, не ги слагай втори път.

Файлове за този урок:

  1. index.php
  2. templates/subSilver/index_body.tpl


Направи копие на двата файла преди да пипаш.


Стъпка 1 — Провери, че функцията вече я има

Отвори:
Код:
includes/functions.php


Потърси:
Код:
function phpbb_user_avatar(


Ако я намериш — продължавай към Стъпка 2.
Ако я няма — спри и първо направи урока за Последни теми. Без тази функция index.php ще гръмне.


Стъпка 2 — Зареди аватара от базата

Отвори:
Код:
index.php


Намери заявката към форумите. Търси реда:

Код:
SELECT f.*, p.post_time, p.post_username, u.username, u.user_id


Той се среща на 3 места (postgresql, oracle и mysql). Трябва да се допълни и на трите, за да се вземе аватарът.

Оригинално (mysql, това е реалната заявка при CLANGAMING.NET):
Код:
         $sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
            FROM (( " . FORUMS_TABLE . " f
            LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id )
            LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id )
            ORDER BY f.cat_id, f.forum_order";


Става:
Код:
         $sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id, u.user_avatar, u.user_avatar_type, u.user_allowavatar
            FROM (( " . FORUMS_TABLE . " f
            LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id )
            LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id )
            ORDER BY f.cat_id, f.forum_order";


Добавят се само 3 полета:
Код:
u.user_avatar, u.user_avatar_type, u.user_allowavatar



Същото за postgresql — първият SELECT става:
Код:
SELECT f.*, p.post_time, p.post_username, u.username, u.user_id, u.user_avatar, u.user_avatar_type, u.user_allowavatar


а във UNION частта NULL стойностите стават 7, не 4:
Код:
SELECT f.*, NULL, NULL, NULL, NULL, NULL, NULL, NULL



Същото за oracle — SELECT става:
Код:
SELECT f.*, p.post_time, p.post_username, u.username, u.user_id, u.user_avatar, u.user_avatar_type, u.user_allowavatar


За CLANGAMING.NET се ползва MySQL, така че най-важният е default блокът. Другите два се пипат, за да няма пропуск, ако някога се смени базата.

Запази мястото в файла и продължи към Стъпка 3 в същия index.php.


Стъпка 3 — Построй аватара с линк към профила

В същия index.php намери блока, който прави последното мнение. Оригинално изглежда така:

Код:
                     if ( $forum_data[$j]['forum_last_post_id'] )
                     {
                        $last_post_time = create_date($board_config['default_dateformat'], $forum_data[$j]['post_time'], $board_config['board_timezone']);

                        $last_post = $last_post_time . '<br />';

                        $last_post .= ( $forum_data[$j]['user_id'] == ANONYMOUS ) ? ( ($forum_data[$j]['post_username'] != '' ) ? $forum_data[$j]['post_username'] . ' ' : $lang['Guest'] . ' ' ) : '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . '='  . $forum_data[$j]['user_id']) . '">' . $forum_data[$j]['username'] . '</a> ';
                        
                        $last_post .= '<a href="' . append_sid("viewtopic.$phpEx?"  . POST_POST_URL . '=' . $forum_data[$j]['forum_last_post_id']) . '#' . $forum_data[$j]['forum_last_post_id'] . '"><img src="' . $images['icon_latest_reply'] . '" border="0" alt="' . $lang['View_latest_post'] . '" title="' . $lang['View_latest_post'] . '" /></a>';
                     }
                     else
                     {
                        $last_post = $lang['No_Posts'];
                     }


Замени го изцяло с:

Код:
                     if ( $forum_data[$j]['forum_last_post_id'] )
                     {
                        $last_post_time = create_date($board_config['default_dateformat'], $forum_data[$j]['post_time'], $board_config['board_timezone']);
                        $last_profile_url = ( $forum_data[$j]['user_id'] != ANONYMOUS ) ? append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . '=' . $forum_data[$j]['user_id']) : '';
                        $last_avatar_alt = ( $forum_data[$j]['user_id'] != ANONYMOUS ) ? $forum_data[$j]['username'] : $lang['Guest'];

                        $last_post = $last_post_time . '<br />';

                        $last_post .= ( $forum_data[$j]['user_id'] == ANONYMOUS ) ? ( ($forum_data[$j]['post_username'] != '' ) ? $forum_data[$j]['post_username'] . ' ' : $lang['Guest'] . ' ' ) : '<a href="' . $last_profile_url . '">' . $forum_data[$j]['username'] . '</a> ';
                        
                        $last_post .= '<a href="' . append_sid("viewtopic.$phpEx?"  . POST_POST_URL . '=' . $forum_data[$j]['forum_last_post_id']) . '#' . $forum_data[$j]['forum_last_post_id'] . '"><img src="' . $images['icon_latest_reply'] . '" border="0" alt="' . $lang['View_latest_post'] . '" title="' . $lang['View_latest_post'] . '" /></a>';

                        $last_post_avatar = phpbb_user_avatar($forum_data[$j]['user_avatar'], $forum_data[$j]['user_avatar_type'], $forum_data[$j]['user_allowavatar'], $last_avatar_alt, 'recent-avatar', $last_profile_url);
                     }
                     else
                     {
                        $last_post = $lang['No_Posts'];
                        $last_post_avatar = '';
                     }


Тук е линкът към профила:

  • $last_profile_url се прави само ако потребителят не е гост
  • подава се на phpbb_user_avatar(..., $last_profile_url)
  • функцията обвива аватара в <a href="профила">
  • ако е гост, $last_profile_url е празен и линк няма



Стъпка 4 — Предай аватара към шаблона

Все още в index.php намери:

Код:
                        'TOPICS' => $forum_data[$j]['forum_topics'],
                        'LAST_POST' => $last_post,
                        'MODERATORS' => $moderator_list,


Става:

Код:
                        'TOPICS' => $forum_data[$j]['forum_topics'],
                        'LAST_POST' => $last_post,
                        'LAST_POST_AVATAR' => $last_post_avatar,
                        'MODERATORS' => $moderator_list,


Без този ред шаблонът няма какво да покаже.

Запази index.php.


Стъпка 5 — Покажи аватара в HTML

Отвори:
Код:
templates/subSilver/index_body.tpl


Намери колоната за последно мнение в списъка с форуми. Оригинално е един ред:

Код:
   <td class="row2" align="center" valign="middle" height="50" nowrap="nowrap"> <span class="gensmall">{catrow.forumrow.LAST_POST}</span></td>


Замени го с:

Код:
   <td class="row2" align="center" valign="middle" height="50" nowrap="nowrap">
     <table cellspacing="0" cellpadding="2" border="0" align="center">
      <tr>
        <td valign="middle">{catrow.forumrow.LAST_POST_AVATAR}</td>
        <td valign="middle" nowrap="nowrap"><span class="gensmall">{catrow.forumrow.LAST_POST}</span></td>
      </tr>
     </table>
   </td>


Важно: това е колоната в таблицата на форумите, не в блока „Последни теми“. Не бъркай двете таблици.

Запази файла.


Стъпка 6 — Проверка


  1. Качи файловете, ако редактираш локално
  2. Отвори началната страница
  3. Натисни Ctrl + F5
  4. Вдясно до всяко последно мнение трябва да има аватар
  5. Кликни аватара на регистриран потребител — трябва да отвори профила
  6. Стрелката до името си остава линк към последното мнение, не към профила



Често срещани грешки


  • Няма phpbb_user_avatar() — грешка Call to undefined function. Първо урокът за Последни теми
  • SQL е пипнат, но не е добавен LAST_POST_AVATAR в assign_block_vars — аватар няма
  • HTML е пипнат, но SQL не взима user_avatar — празни квадратчета
  • Пипнат е блокът „Последни теми“, а не таблицата с форумите
  • Пропуснат е $last_post_avatar = ''; когато няма мнения — може да излезе Notice и стар аватар от предишния форум


Авторски права
Този урок е писан за CLANGAMING.NET.
Копирането му без знание и съгласие не е позволено.
_________________
CLANGAMING.Net Administrator
Гейминг общност & Уеб разработки
Гледайте ни в Twitch: AetheldredaBG
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Покажи мнения от преди:   
Създайте нова тема   Напишете отговор    CLANGAMING.Net Форуми -> Уеб програмиране Часовете са според зоната GMT
Страница 1 от 1

 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети


Powered by phpBB © 2001, 2005 phpBB Group
Translation by: Boby Dimitrov