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

Урок: Статистики в профила — Общо теми

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

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

МнениеПуснато на: Сря Сеп 16, 2026 11:51 pm    Заглавие: Урок: Статистики в профила — Общо теми Отговорете с цитат

Урок: Статистики в профила — Общо теми, Най-активен форум и Най-активна тема
Тема: subSilver • phpBB 2.x • профил • CLANGAMING.NET

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

Какво ще получиш в профила:
Под Общо мнения се появяват три нови реда, със същия вид проценти:

  • Общо теми — колко теми е създал потребителят, плюс [xx.xx% от всички / x.xx теми на ден]
  • Най-активен форум — форумът, в който има най-много мнения, с линк, плюс [xx.xx% от всички / x.xx мнения на ден]
  • Най-активна тема — темата, в която има най-много мнения, с линк, плюс [xx.xx% от всички / x.xx мнения на ден]


Как се броят числата:

  • Общо мнения (стандартно в phpBB2): брой мнения на потребителя • процент спрямо всички мнения във форума • мнения на ден от регистрацията
  • Общо теми: брой теми, които потребителят е започнал (преместените копия не се броят: [font=Courier]topic_moved_id = 0[/font]) • процент спрямо всички теми във форума • теми на ден
  • Най-активен форум: форумът с най-много негови мнения • процентът и „на ден“ се смятат по тези мнения, със същите етикети като при Общо мнения
  • Най-активна тема: темата с най-много негови мнения • пак същите проценти като при Общо мнения
  • Ако зрителят няма право да вижда форума/темата, името не се показва
  • Ако няма теми или мнения, редовете остават празни/нули, без SQL грешка


Файлове (само тези 4):

  • [font=Courier]language/lang_english/lang_main.php[/font]
  • [font=Courier]language/lang_bulgarian/lang_main.php[/font]
  • [font=Courier]includes/usercp_viewprofile.php[/font]
  • [font=Courier]templates/subSilver/profile_view_body.tpl[/font]


Преди да започнеш:

  • Направи копие (backup) на четирите файла
  • Работи върху phpBB 2.x със стил subSilver
  • Много важно за българския език: [font=Courier]lang_bulgarian/lang_main.php[/font] е windows-1251. Ако го запишеш като UTF-8, етикетите в целия форум стават празни. Не пипай старите редове. Само добави новите редове в края, точно както са дадени по-долу (те са с HTML entities и са безопасни)
  • Не използвай [font=Courier]{TOPICS}[/font] в шаблона на профила. В phpBB2 това име се засича с вътрешна променлива. Затова броят теми е [font=Courier]{USER_TOPIC_COUNT}[/font]



Стъпка 1 — Английски език
Отвори [font=Courier]language/lang_english/lang_main.php[/font]

Намери:
Код:

//
// That's all, Folks!
// -------------------------------------------------


Замени с:
Код:

$lang['Total_topics'] = 'Total topics';
$lang['User_topic_pct_stats'] = '%.2f%% of total';
$lang['User_topic_day_stats'] = '%.2f topics per day';
$lang['Most_active_forum'] = 'Most active forum';
$lang['Most_active_topic'] = 'Most active topic';

//
// That's all, Folks!
// -------------------------------------------------


Проверка: Ако някой от тези ключове вече го имаш (например [font=Courier]Total_topics[/font] от друг урок), не го дублирай. Добави само липсващите. Всеки ключ трябва да се среща веднъж.


Стъпка 2 — Български език
Отвори [font=Courier]language/lang_bulgarian/lang_main.php[/font]

Правила:

  • Не променяй нито един съществуващ превод
  • Не ползвай „Save as UTF-8“
  • Добавяй само в края, преди [font=Courier]?>[/font]
  • Редовете по-долу са нарочно с [font=Courier]&#...;[/font], за да не се счупи windows-1251


Намери точно това в края на файла:
Код:

//
// That's all Folks!
// -------------------------------------------------

?>


Замени с:
Код:

//
// That's all Folks!
// -------------------------------------------------

$lang['Total_topics'] = "Общо теми";
$lang['User_topic_pct_stats'] = "%.2f%% от всички";
$lang['User_topic_day_stats'] = "%.2f теми на ден";
$lang['Most_active_forum'] = "Най-активен форум";
$lang['Most_active_topic'] = "Най-активна тема";
?>


Това се чете в браузъра като:

  • Общо теми
  • %.2f% от всички
  • %.2f теми на ден
  • Най-активен форум
  • Най-активна тема


Процентите при Най-активен форум и Най-активна тема използват вече съществуващите низове за мнения:
[font=Courier]$lang['User_post_pct_stats'][/font] и [font=Courier]$lang['User_post_day_stats'][/font]
(„xx.xx% от всички“ / „x.xx мнения на ден“). Тях не ги пипай.


Стъпка 3 — PHP на профила
Отвори [font=Courier]includes/usercp_viewprofile.php[/font]

Тук има две отделни редакции. Прави ги по ред.

3.1. Изчисленията

Намери:
Код:

else
{
   $percentage = 0;
}

$avatar_img = '';


Замени с:
Код:

else
{
   $percentage = 0;
}

$total_topics = 0;
$sql = "SELECT COUNT(topic_id) AS user_topics
   FROM " . TOPICS_TABLE . "
   WHERE topic_poster = " . intval($profiledata['user_id']) . "
      AND topic_moved_id = 0";
if ( !($result = $db->sql_query($sql)) )
{
   message_die(GENERAL_ERROR, 'Could not obtain user topic count', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
   $total_topics = intval($row['user_topics']);
}
$db->sql_freeresult($result);

$topics_per_day = $total_topics / $memberdays;
$topic_percentage = 0;
if ( $total_topics != 0 )
{
   $total_board_topics = get_db_stat('topiccount');
   $topic_percentage = ( $total_board_topics ) ? min(100, ($total_topics / $total_board_topics) * 100) : 0;
}

$most_active_forum = ' ';
$most_active_topic = ' ';
$active_forum_percentage = 0;
$active_forum_per_day = 0;
$active_topic_percentage = 0;
$active_topic_per_day = 0;

if ( empty($total_posts) )
{
   $total_posts = get_db_stat('postcount');
}

$sql = "SELECT f.forum_id, f.forum_name, COUNT(p.post_id) AS forum_posts
   FROM " . POSTS_TABLE . " p, " . FORUMS_TABLE . " f
   WHERE p.poster_id = " . intval($profiledata['user_id']) . "
      AND f.forum_id = p.forum_id
   GROUP BY f.forum_id, f.forum_name
   ORDER BY forum_posts DESC
   LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
{
   message_die(GENERAL_ERROR, 'Could not obtain most active forum', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
   $active_forum_id = intval($row['forum_id']);
   $active_forum_posts = intval($row['forum_posts']);
   $active_forum_per_day = $active_forum_posts / $memberdays;
   $active_forum_percentage = ( $total_posts ) ? min(100, ($active_forum_posts / $total_posts) * 100) : 0;
   $is_auth = auth(AUTH_VIEW, $active_forum_id, $userdata);
   if ( !empty($is_auth['auth_view']) )
   {
      $most_active_forum = '<a href="' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . '=' . $active_forum_id) . '">' . $row['forum_name'] . '</a>';
   }
}
$db->sql_freeresult($result);

$sql = "SELECT t.topic_id, t.forum_id, t.topic_title, COUNT(p.post_id) AS topic_posts
   FROM " . POSTS_TABLE . " p, " . TOPICS_TABLE . " t
   WHERE p.poster_id = " . intval($profiledata['user_id']) . "
      AND t.topic_id = p.topic_id
      AND t.topic_moved_id = 0
   GROUP BY t.topic_id, t.forum_id, t.topic_title
   ORDER BY topic_posts DESC
   LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
{
   message_die(GENERAL_ERROR, 'Could not obtain most active topic', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
   $active_topic_forum_id = intval($row['forum_id']);
   $active_topic_posts = intval($row['topic_posts']);
   $active_topic_per_day = $active_topic_posts / $memberdays;
   $active_topic_percentage = ( $total_posts ) ? min(100, ($active_topic_posts / $total_posts) * 100) : 0;
   $is_auth = auth(AUTH_READ, $active_topic_forum_id, $userdata);
   if ( !empty($is_auth['auth_read']) )
   {
      $active_topic_title = $row['topic_title'];
      $orig_word = array();
      $replacement_word = array();
      obtain_word_list($orig_word, $replacement_word);
      if ( count($orig_word) )
      {
         $active_topic_title = preg_replace($orig_word, $replacement_word, $active_topic_title);
      }
      $most_active_topic = '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . '=' . intval($row['topic_id'])) . '">' . $active_topic_title . '</a>';
   }
}
$db->sql_freeresult($result);

$avatar_img = '';


3.2. Променливите към шаблона

Намери:
Код:

   'POSTS' => $profiledata['user_posts'],
   'PERCENTAGE' => $percentage . '%',
   'POST_DAY_STATS' => sprintf($lang['User_post_day_stats'], $posts_per_day),
   'POST_PERCENT_STATS' => sprintf($lang['User_post_pct_stats'], $percentage),


Замени с:
Код:

   'POSTS' => $profiledata['user_posts'],
   'USER_TOPIC_COUNT' => $total_topics,
   'MOST_ACTIVE_FORUM' => $most_active_forum,
   'MOST_ACTIVE_TOPIC' => $most_active_topic,
   'PERCENTAGE' => $percentage . '%',
   'POST_DAY_STATS' => sprintf($lang['User_post_day_stats'], $posts_per_day),
   'POST_PERCENT_STATS' => sprintf($lang['User_post_pct_stats'], $percentage),
   'TOPIC_DAY_STATS' => sprintf(( !empty($lang['User_topic_day_stats']) ) ? $lang['User_topic_day_stats'] : $lang['User_post_day_stats'], $topics_per_day),
   'TOPIC_PERCENT_STATS' => sprintf(( !empty($lang['User_topic_pct_stats']) ) ? $lang['User_topic_pct_stats'] : $lang['User_post_pct_stats'], $topic_percentage),
   'ACTIVE_FORUM_DAY_STATS' => sprintf($lang['User_post_day_stats'], $active_forum_per_day),
   'ACTIVE_FORUM_PERCENT_STATS' => sprintf($lang['User_post_pct_stats'], $active_forum_percentage),
   'ACTIVE_TOPIC_DAY_STATS' => sprintf($lang['User_post_day_stats'], $active_topic_per_day),
   'ACTIVE_TOPIC_PERCENT_STATS' => sprintf($lang['User_post_pct_stats'], $active_topic_percentage),


Веднага след това намери:
Код:

   'L_TOTAL_POSTS' => $lang['Total_posts'],
   'L_SEARCH_USER_POSTS' => sprintf($lang['Search_user_posts'], $profiledata['username']),


Замени с:
Код:

   'L_TOTAL_POSTS' => $lang['Total_posts'],
   'L_TOTAL_TOPICS' => ( !empty($lang['Total_topics']) ) ? $lang['Total_topics'] : 'Total topics',
   'L_MOST_ACTIVE_FORUM' => ( !empty($lang['Most_active_forum']) ) ? $lang['Most_active_forum'] : 'Most active forum',
   'L_MOST_ACTIVE_TOPIC' => ( !empty($lang['Most_active_topic']) ) ? $lang['Most_active_topic'] : 'Most active topic',
   'L_SEARCH_USER_POSTS' => sprintf($lang['Search_user_posts'], $profiledata['username']),



Стъпка 4 — Шаблон на профила
Отвори [font=Courier]templates/subSilver/profile_view_body.tpl[/font]

Намери реда за Общо мнения и реда за Местожителство (между тях няма други статистически редове в оригиналния subSilver):

Код:

      <tr>
        <td valign="top" align="right" nowrap="nowrap"><span class="gen">{L_TOTAL_POSTS}:&nbsp;</span></td>
        <td valign="top"><b><span class="gen">{POSTS}</span></b><br /><span class="genmed">[{POST_PERCENT_STATS} / {POST_DAY_STATS}]</span> <br /><span class="genmed"><a href="{U_SEARCH_USER}" class="genmed">{L_SEARCH_USER_POSTS}</a></span></td>
      </tr>
      <tr>
        <td valign="middle" align="right" nowrap="nowrap"><span class="gen">{L_LOCATION}:&nbsp;</span></td>


Замени с:
Код:

      <tr>
        <td valign="top" align="right" nowrap="nowrap"><span class="gen">{L_TOTAL_POSTS}:&nbsp;</span></td>
        <td valign="top"><b><span class="gen">{POSTS}</span></b><br /><span class="genmed">[{POST_PERCENT_STATS} / {POST_DAY_STATS}]</span> <br /><span class="genmed"><a href="{U_SEARCH_USER}" class="genmed">{L_SEARCH_USER_POSTS}</a></span></td>
      </tr>
      <tr>
        <td valign="top" align="right" nowrap="nowrap"><span class="gen">{L_TOTAL_TOPICS}:&nbsp;</span></td>
        <td valign="top"><b><span class="gen">{USER_TOPIC_COUNT}</span></b><br /><span class="genmed">[{TOPIC_PERCENT_STATS} / {TOPIC_DAY_STATS}]</span></td>
      </tr>
      <tr>
        <td valign="top" align="right" nowrap="nowrap"><span class="gen">{L_MOST_ACTIVE_FORUM}:&nbsp;</span></td>
        <td valign="top"><b><span class="gen">{MOST_ACTIVE_FORUM}</span></b><br /><span class="genmed">[{ACTIVE_FORUM_PERCENT_STATS} / {ACTIVE_FORUM_DAY_STATS}]</span></td>
      </tr>
      <tr>
        <td valign="top" align="right" nowrap="nowrap"><span class="gen">{L_MOST_ACTIVE_TOPIC}:&nbsp;</span></td>
        <td valign="top"><b><span class="gen">{MOST_ACTIVE_TOPIC}</span></b><br /><span class="genmed">[{ACTIVE_TOPIC_PERCENT_STATS} / {ACTIVE_TOPIC_DAY_STATS}]</span></td>
      </tr>
      <tr>
        <td valign="middle" align="right" nowrap="nowrap"><span class="gen">{L_LOCATION}:&nbsp;</span></td>


Задължително: броят теми е [font=Courier]{USER_TOPIC_COUNT}[/font], не [font=Courier]{TOPICS}[/font].


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

  • Качи четирите файла на сървъра със същите пътища
  • Отвори профил на потребител с теми и мнения
  • Натисни Ctrl+F5


Трябва да видиш точно този ред след Общо мнения:

  • Общо теми: число, под него [xx.xx% от всички / x.xx теми на ден]
  • Най-активен форум: име с линк към форума, под него [xx.xx% от всички / x.xx мнения на ден]
  • Най-активна тема: заглавие с линк към темата, под него [xx.xx% от всички / x.xx мнения на ден]
  • Етикетите Регистриран на, Общо мнения, Местожителство и останалите български текстове не са празни
  • Клик върху форума отваря [font=Courier]viewforum.php?f=ID[/font]
  • Клик върху темата отваря [font=Courier]viewtopic.php?t=ID[/font]



Ако нещо не е наред

  • Празни български етикети в целия форум — [font=Courier]lang_bulgarian/lang_main.php[/font] е записан като UTF-8. Върни backup-а и добави само новите редове с HTML entities
  • Общо теми се вижда, а другите етикети са празни — същият проблем с кодирането
  • Броят теми е празен или грешен — в шаблона е сложено [font=Courier]{TOPICS}[/font] вместо [font=Courier]{USER_TOPIC_COUNT}[/font]
  • Parse error / unexpected T_STRING в езиковия файл — счупени кавички. Новите редове трябва да са точно с двойни кавички, както са в урока
  • Could not obtain user topic count / most active forum / most active topic — SQL грешка; провери дали блокът в [font=Courier]usercp_viewprofile.php[/font] е копиран цял, без отрязан ред
  • Етикетите са на английски — българските ключове липсват или са след [font=Courier]?&gt;[/font]. Те трябва да са преди затварящия [font=Courier]?&gt;[/font]
  • Няма линк към форум/тема — или потребителят няма мнения, или ти нямаш право да виждаш този форум
  • Виждаш стария профил — Ctrl+F5, или браузърът държи кеш на [font=Courier]profile_view_body.tpl[/font]


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

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


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