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
Без тях този урок няма да работи. Ако вече ги имаш, не ги слагай втори път.
Файлове за този урок:
- index.php
- templates/subSilver/index_body.tpl
Направи копие на двата файла преди да пипаш.
Стъпка 1 — Провери, че функцията вече я има
Отвори:
| Код: | | includes/functions.php |
Потърси:
| Код: | | function phpbb_user_avatar( |
Ако я намериш — продължавай към Стъпка 2.
Ако я няма — спри и първо направи урока за Последни теми. Без тази функция index.php ще гръмне.
Стъпка 2 — Зареди аватара от базата
Отвори:
Намери заявката към форумите. Търси реда:
| Код: | | 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&" . 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&" . 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 — Проверка
- Качи файловете, ако редактираш локално
- Отвори началната страница
- Натисни Ctrl + F5
- Вдясно до всяко последно мнение трябва да има аватар
- Кликни аватара на регистриран потребител — трябва да отвори профила
- Стрелката до името си остава линк към последното мнение, не към профила
Често срещани грешки
- Няма 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 |
|