Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

functions_display.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 56.27 KiB


0001  <?php
0002  /**
0003  *
0004  * This file is part of the phpBB Forum Software package.
0005  *
0006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007  * @license GNU General Public License, version 2 (GPL-2.0)
0008  *
0009  * For full copyright and license information, please see
0010  * the docs/CREDITS.txt file.
0011  *
0012  */
0013   
0014  /**
0015  * @ignore
0016  */
0017  if (!defined('IN_PHPBB'))
0018  {
0019      exit;
0020  }
0021   
0022  /**
0023  * Display Forums
0024  */
0025  function display_forums($root_data = '', $display_moderators = true, $return_moderators = false)
0026  {
0027      global $db, $auth, $user, $template;
0028      global $phpbb_root_path, $phpEx, $config;
0029      global $request, $phpbb_dispatcher, $phpbb_container;
0030   
0031      $forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
0032      $parent_id = $visible_forums = 0;
0033      $sql_from = '';
0034   
0035      // Mark forums read?
0036      $mark_read = request_var('mark', '');
0037   
0038      if ($mark_read == 'all')
0039      {
0040          $mark_read = '';
0041      }
0042   
0043      if (!$root_data)
0044      {
0045          if ($mark_read == 'forums')
0046          {
0047              $mark_read = 'all';
0048          }
0049   
0050          $root_data = array('forum_id' => 0);
0051          $sql_where = '';
0052      }
0053      else
0054      {
0055          $sql_where = 'left_id > ' . $root_data['left_id'] . ' AND left_id < ' . $root_data['right_id'];
0056      }
0057   
0058      // Handle marking everything read
0059      if ($mark_read == 'all')
0060      {
0061          $redirect = build_url(array('mark', 'hash', 'mark_time'));
0062          meta_refresh(3, $redirect);
0063   
0064          if (check_link_hash(request_var('hash', ''), 'global'))
0065          {
0066              markread('all', false, false, request_var('mark_time', 0));
0067   
0068              if ($request->is_ajax())
0069              {
0070                  // Tell the ajax script what language vars and URL need to be replaced
0071                  $data = array(
0072                      'NO_UNREAD_POSTS'    => $user->lang['NO_UNREAD_POSTS'],
0073                      'UNREAD_POSTS'        => $user->lang['UNREAD_POSTS'],
0074                      'U_MARK_FORUMS'        => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&mark=forums&mark_time=' . time()) : '',
0075                      'MESSAGE_TITLE'        => $user->lang['INFORMATION'],
0076                      'MESSAGE_TEXT'        => $user->lang['FORUMS_MARKED']
0077                  );
0078                  $json_response = new \phpbb\json_response();
0079                  $json_response->send($data);
0080              }
0081   
0082              trigger_error(
0083                  $user->lang['FORUMS_MARKED'] . '<br /><br />' .
0084                  sprintf($user->lang['RETURN_INDEX'], '<a href="' . $redirect . '">', '</a>')
0085              );
0086          }
0087          else
0088          {
0089              trigger_error(sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>'));
0090          }
0091      }
0092   
0093      // Display list of active topics for this category?
0094      $show_active = (isset($root_data['forum_flags']) && ($root_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false;
0095   
0096      $sql_array = array(
0097          'SELECT'    => 'f.*',
0098          'FROM'        => array(
0099              FORUMS_TABLE        => 'f'
0100          ),
0101          'LEFT_JOIN'    => array(),
0102      );
0103   
0104      if ($config['load_db_lastread'] && $user->data['is_registered'])
0105      {
0106          $sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id');
0107          $sql_array['SELECT'] .= ', ft.mark_time';
0108      }
0109      else if ($config['load_anon_lastread'] || $user->data['is_registered'])
0110      {
0111          $tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
0112          $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
0113   
0114          if (!$user->data['is_registered'])
0115          {
0116              $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
0117          }
0118      }
0119   
0120      if ($show_active)
0121      {
0122          $sql_array['LEFT_JOIN'][] = array(
0123              'FROM'    => array(FORUMS_ACCESS_TABLE => 'fa'),
0124              'ON'    => "fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "'"
0125          );
0126   
0127          $sql_array['SELECT'] .= ', fa.user_id';
0128      }
0129   
0130      $sql_ary = array(
0131          'SELECT'    => $sql_array['SELECT'],
0132          'FROM'        => $sql_array['FROM'],
0133          'LEFT_JOIN'    => $sql_array['LEFT_JOIN'],
0134   
0135          'WHERE'        => $sql_where,
0136   
0137          'ORDER_BY'    => 'f.left_id',
0138      );
0139   
0140      /**
0141      * Event to modify the SQL query before the forum data is queried
0142      *
0143      * @event core.display_forums_modify_sql
0144      * @var    array    sql_ary        The SQL array to get the data of the forums
0145      * @since 3.1.0-a1
0146      */
0147      $vars = array('sql_ary');
0148      extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_sql', compact($vars)));
0149   
0150      $sql = $db->sql_build_query('SELECT', $sql_ary);
0151      $result = $db->sql_query($sql);
0152   
0153      $forum_tracking_info = array();
0154      $branch_root_id = $root_data['forum_id'];
0155   
0156      $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0157   
0158      while ($row = $db->sql_fetchrow($result))
0159      {
0160          /**
0161          * Event to modify the data set of a forum
0162          *
0163          * This event is triggered once per forum
0164          *
0165          * @event core.display_forums_modify_row
0166          * @var    int        branch_root_id    Last top-level forum
0167          * @var    array    row                The data of the forum
0168          * @since 3.1.0-a1
0169          */
0170          $vars = array('branch_root_id', 'row');
0171          extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_row', compact($vars)));
0172   
0173          $forum_id = $row['forum_id'];
0174   
0175          // Mark forums read?
0176          if ($mark_read == 'forums')
0177          {
0178              if ($auth->acl_get('f_list', $forum_id))
0179              {
0180                  $forum_ids[] = $forum_id;
0181              }
0182   
0183              continue;
0184          }
0185   
0186          // Category with no members
0187          if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
0188          {
0189              continue;
0190          }
0191   
0192          // Skip branch
0193          if (isset($right_id))
0194          {
0195              if ($row['left_id'] < $right_id)
0196              {
0197                  continue;
0198              }
0199              unset($right_id);
0200          }
0201   
0202          if (!$auth->acl_get('f_list', $forum_id))
0203          {
0204              // if the user does not have permissions to list this forum, skip everything until next branch
0205              $right_id = $row['right_id'];
0206              continue;
0207          }
0208   
0209          if ($config['load_db_lastread'] && $user->data['is_registered'])
0210          {
0211              $forum_tracking_info[$forum_id] = (!empty($row['mark_time'])) ? $row['mark_time'] : $user->data['user_lastmark'];
0212          }
0213          else if ($config['load_anon_lastread'] || $user->data['is_registered'])
0214          {
0215              if (!$user->data['is_registered'])
0216              {
0217                  $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
0218              }
0219              $forum_tracking_info[$forum_id] = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark'];
0220          }
0221   
0222          // Lets check whether there are unapproved topics/posts, so we can display an information to moderators
0223          $row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && $row['forum_topics_unapproved']) ? $forum_id : 0;
0224          $row['forum_id_unapproved_posts'] = ($auth->acl_get('m_approve', $forum_id) && $row['forum_posts_unapproved']) ? $forum_id : 0;
0225          $row['forum_posts'] = $phpbb_content_visibility->get_count('forum_posts', $row, $forum_id);
0226          $row['forum_topics'] = $phpbb_content_visibility->get_count('forum_topics', $row, $forum_id);
0227   
0228          // Display active topics from this forum?
0229          if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS))
0230          {
0231              if (!isset($active_forum_ary['forum_topics']))
0232              {
0233                  $active_forum_ary['forum_topics'] = 0;
0234              }
0235   
0236              if (!isset($active_forum_ary['forum_posts']))
0237              {
0238                  $active_forum_ary['forum_posts'] = 0;
0239              }
0240   
0241              $active_forum_ary['forum_id'][]        = $forum_id;
0242              $active_forum_ary['enable_icons'][]    = $row['enable_icons'];
0243              $active_forum_ary['forum_topics']    += $row['forum_topics'];
0244              $active_forum_ary['forum_posts']    += $row['forum_posts'];
0245   
0246              // If this is a passworded forum we do not show active topics from it if the user is not authorised to view it...
0247              if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
0248              {
0249                  $active_forum_ary['exclude_forum_id'][] = $forum_id;
0250              }
0251          }
0252   
0253          //
0254          if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id)
0255          {
0256              if ($row['forum_type'] != FORUM_CAT)
0257              {
0258                  $forum_ids_moderator[] = (int) $forum_id;
0259              }
0260   
0261              // Direct child of current branch
0262              $parent_id = $forum_id;
0263              $forum_rows[$forum_id] = $row;
0264   
0265              if ($row['forum_type'] == FORUM_CAT && $row['parent_id'] == $root_data['forum_id'])
0266              {
0267                  $branch_root_id = $forum_id;
0268              }
0269              $forum_rows[$parent_id]['forum_id_last_post'] = $row['forum_id'];
0270              $forum_rows[$parent_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
0271          }
0272          else if ($row['forum_type'] != FORUM_CAT)
0273          {
0274              $subforums[$parent_id][$forum_id]['display'] = ($row['display_on_index']) ? true : false;
0275              $subforums[$parent_id][$forum_id]['name'] = $row['forum_name'];
0276              $subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
0277              $subforums[$parent_id][$forum_id]['children'] = array();
0278   
0279              if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index'])
0280              {
0281                  $subforums[$parent_id][$row['parent_id']]['children'][] = $forum_id;
0282              }
0283   
0284              if (!$forum_rows[$parent_id]['forum_id_unapproved_topics'] && $row['forum_id_unapproved_topics'])
0285              {
0286                  $forum_rows[$parent_id]['forum_id_unapproved_topics'] = $forum_id;
0287              }
0288   
0289              if (!$forum_rows[$parent_id]['forum_id_unapproved_posts'] && $row['forum_id_unapproved_posts'])
0290              {
0291                  $forum_rows[$parent_id]['forum_id_unapproved_posts'] = $forum_id;
0292              }
0293   
0294              $forum_rows[$parent_id]['forum_topics'] += $row['forum_topics'];
0295   
0296              // Do not list redirects in LINK Forums as Posts.
0297              if ($row['forum_type'] != FORUM_LINK)
0298              {
0299                  $forum_rows[$parent_id]['forum_posts'] += $row['forum_posts'];
0300              }
0301   
0302              if ($row['forum_last_post_time'] > $forum_rows[$parent_id]['forum_last_post_time'])
0303              {
0304                  $forum_rows[$parent_id]['forum_last_post_id'] = $row['forum_last_post_id'];
0305                  $forum_rows[$parent_id]['forum_last_post_subject'] = $row['forum_last_post_subject'];
0306                  $forum_rows[$parent_id]['forum_last_post_time'] = $row['forum_last_post_time'];
0307                  $forum_rows[$parent_id]['forum_last_poster_id'] = $row['forum_last_poster_id'];
0308                  $forum_rows[$parent_id]['forum_last_poster_name'] = $row['forum_last_poster_name'];
0309                  $forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour'];
0310                  $forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
0311              }
0312          }
0313   
0314          /**
0315          * Event to modify the forum rows data set
0316          *
0317          * This event is triggered once per forum
0318          *
0319          * @event core.display_forums_modify_forum_rows
0320          * @var    array    forum_rows        Data array of all forums we display
0321          * @var    array    subforums        Data array of all subforums we display
0322          * @var    int        branch_root_id    Current top-level forum
0323          * @var    int        parent_id        Current parent forum
0324          * @var    array    row                The data of the forum
0325          * @since 3.1.0-a1
0326          */
0327          $vars = array('forum_rows', 'subforums', 'branch_root_id', 'parent_id', 'row');
0328          extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_forum_rows', compact($vars)));
0329      }
0330      $db->sql_freeresult($result);
0331   
0332      // Handle marking posts
0333      if ($mark_read == 'forums')
0334      {
0335          $redirect = build_url(array('mark', 'hash', 'mark_time'));
0336          $token = request_var('hash', '');
0337          if (check_link_hash($token, 'global'))
0338          {
0339              markread('topics', $forum_ids, false, request_var('mark_time', 0));
0340              $message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
0341              meta_refresh(3, $redirect);
0342   
0343              if ($request->is_ajax())
0344              {
0345                  // Tell the ajax script what language vars and URL need to be replaced
0346                  $data = array(
0347                      'NO_UNREAD_POSTS'    => $user->lang['NO_UNREAD_POSTS'],
0348                      'UNREAD_POSTS'        => $user->lang['UNREAD_POSTS'],
0349                      'U_MARK_FORUMS'        => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&f=' . $root_data['forum_id'] . '&mark=forums&mark_time=' . time()) : '',
0350                      'MESSAGE_TITLE'        => $user->lang['INFORMATION'],
0351                      'MESSAGE_TEXT'        => $user->lang['FORUMS_MARKED']
0352                  );
0353                  $json_response = new \phpbb\json_response();
0354                  $json_response->send($data);
0355              }
0356   
0357              trigger_error($user->lang['FORUMS_MARKED'] . '<br /><br />' . $message);
0358          }
0359          else
0360          {
0361              $message = sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
0362              meta_refresh(3, $redirect);
0363              trigger_error($message);
0364          }
0365   
0366      }
0367   
0368      // Grab moderators ... if necessary
0369      if ($display_moderators)
0370      {
0371          if ($return_moderators)
0372          {
0373              $forum_ids_moderator[] = $root_data['forum_id'];
0374          }
0375          get_moderators($forum_moderators, $forum_ids_moderator);
0376      }
0377   
0378      // Used to tell whatever we have to create a dummy category or not.
0379      $last_catless = true;
0380      foreach ($forum_rows as $row)
0381      {
0382          // Category
0383          if ($row['parent_id'] == $root_data['forum_id'] && $row['forum_type'] == FORUM_CAT)
0384          {
0385              $cat_row = array(
0386                  'S_IS_CAT'                => true,
0387                  'FORUM_ID'                => $row['forum_id'],
0388                  'FORUM_NAME'            => $row['forum_name'],
0389                  'FORUM_DESC'            => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
0390                  'FORUM_FOLDER_IMG'        => '',
0391                  'FORUM_FOLDER_IMG_SRC'    => '',
0392                  'FORUM_IMAGE'            => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" />' : '',
0393                  'FORUM_IMAGE_SRC'        => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
0394                  'U_VIEWFORUM'            => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
0395              );
0396   
0397              /**
0398              * Modify the template data block of the 'category'
0399              *
0400              * This event is triggered once per 'category'
0401              *
0402              * @event core.display_forums_modify_category_template_vars
0403              * @var    array    cat_row            Template data of the 'category'
0404              * @var    bool    catless            The flag indicating whether the 'category' has a parent category
0405              * @var    bool    last_catless    The flag indicating whether the last forum had a parent category
0406              * @var    array    root_data        Array with the root forum data
0407              * @var    array    row                The data of the 'category'
0408              * @since 3.1.0-RC4
0409              */
0410              $vars = array(
0411                  'cat_row',
0412                  'catless',
0413                  'last_catless',
0414                  'root_data',
0415                  'row',
0416              );
0417              extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_category_template_vars', compact($vars)));
0418   
0419              $template->assign_block_vars('forumrow', $cat_row);
0420   
0421              continue;
0422          }
0423   
0424          $visible_forums++;
0425          $forum_id = $row['forum_id'];
0426   
0427          $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;
0428   
0429          $folder_image = $folder_alt = $l_subforums = '';
0430          $subforums_list = array();
0431   
0432          // Generate list of subforums if we need to
0433          if (isset($subforums[$forum_id]))
0434          {
0435              foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
0436              {
0437                  $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;
0438   
0439                  if (!$subforum_unread && !empty($subforum_row['children']))
0440                  {
0441                      foreach ($subforum_row['children'] as $child_id)
0442                      {
0443                          if (isset($forum_tracking_info[$child_id]) && $subforums[$forum_id][$child_id]['orig_forum_last_post_time'] > $forum_tracking_info[$child_id])
0444                          {
0445                              // Once we found an unread child forum, we can drop out of this loop
0446                              $subforum_unread = true;
0447                              break;
0448                          }
0449                      }
0450                  }
0451   
0452                  if ($subforum_row['display'] && $subforum_row['name'])
0453                  {
0454                      $subforums_list[] = array(
0455                          'link'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
0456                          'name'        => $subforum_row['name'],
0457                          'unread'    => $subforum_unread,
0458                      );
0459                  }
0460                  else
0461                  {
0462                      unset($subforums[$forum_id][$subforum_id]);
0463                  }
0464   
0465                  // If one subforum is unread the forum gets unread too...
0466                  if ($subforum_unread)
0467                  {
0468                      $forum_unread = true;
0469                  }
0470              }
0471   
0472              $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'];
0473              $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
0474          }
0475          else
0476          {
0477              switch ($row['forum_type'])
0478              {
0479                  case FORUM_POST:
0480                      $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
0481                  break;
0482   
0483                  case FORUM_LINK:
0484                      $folder_image = 'forum_link';
0485                  break;
0486              }
0487          }
0488   
0489          // Which folder should we display?
0490          if ($row['forum_status'] == ITEM_LOCKED)
0491          {
0492              $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
0493              $folder_alt = 'FORUM_LOCKED';
0494          }
0495          else
0496          {
0497              $folder_alt = ($forum_unread) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
0498          }
0499   
0500          // Create last post link information, if appropriate
0501          if ($row['forum_last_post_id'])
0502          {
0503              $last_post_subject = $row['forum_last_post_subject'];
0504              $last_post_subject_truncated = truncate_string(censor_text($last_post_subject), 30, 255, false, $user->lang['ELLIPSIS']);
0505              $last_post_time = $user->format_date($row['forum_last_post_time']);
0506              $last_post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id_last_post'] . '&amp;p=' . $row['forum_last_post_id']) . '#p' . $row['forum_last_post_id'];
0507          }
0508          else
0509          {
0510              $last_post_subject = $last_post_time = $last_post_url = $last_post_subject_truncated = '';
0511          }
0512   
0513          // Output moderator listing ... if applicable
0514          $l_moderator = $moderators_list = '';
0515          if ($display_moderators && !empty($forum_moderators[$forum_id]))
0516          {
0517              $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
0518              $moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]);
0519          }
0520   
0521          $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
0522          $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';
0523   
0524          $s_subforums_list = $subforums_row = array();
0525          foreach ($subforums_list as $subforum)
0526          {
0527              $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['UNREAD_POSTS'] : $user->lang['NO_UNREAD_POSTS']) . '">' . $subforum['name'] . '</a>';
0528              $subforums_row[] = array(
0529                  'U_SUBFORUM'    => $subforum['link'],
0530                  'SUBFORUM_NAME'    => $subforum['name'],
0531                  'S_UNREAD'        => $subforum['unread'],
0532              );
0533          }
0534          $s_subforums_list = (string) implode($user->lang['COMMA_SEPARATOR'], $s_subforums_list);
0535          $catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
0536   
0537          if ($row['forum_type'] != FORUM_LINK)
0538          {
0539              $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
0540          }
0541          else
0542          {
0543              // If the forum is a link and we count redirects we need to visit it
0544              // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
0545              if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
0546              {
0547                  $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
0548              }
0549              else
0550              {
0551                  $u_viewforum = $row['forum_link'];
0552              }
0553          }
0554   
0555          $forum_row = array(
0556              'S_IS_CAT'            => false,
0557              'S_NO_CAT'            => $catless && !$last_catless,
0558              'S_IS_LINK'            => ($row['forum_type'] == FORUM_LINK) ? true : false,
0559              'S_UNREAD_FORUM'    => $forum_unread,
0560              'S_AUTH_READ'        => $auth->acl_get('f_read', $row['forum_id']),
0561              'S_LOCKED_FORUM'    => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
0562              'S_LIST_SUBFORUMS'    => ($row['display_subforum_list']) ? true : false,
0563              'S_SUBFORUMS'        => (sizeof($subforums_list)) ? true : false,
0564              'S_DISPLAY_SUBJECT'    =>    ($last_post_subject && $config['display_last_subject'] && !$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? true : false,
0565              'S_FEED_ENABLED'    => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
0566   
0567              'FORUM_ID'                => $row['forum_id'],
0568              'FORUM_NAME'            => $row['forum_name'],
0569              'FORUM_DESC'            => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
0570              'TOPICS'                => $row['forum_topics'],
0571              $l_post_click_count        => $post_click_count,
0572              'FORUM_IMG_STYLE'        => $folder_image,
0573              'FORUM_FOLDER_IMG'        => $user->img($folder_image, $folder_alt),
0574              'FORUM_FOLDER_IMG_ALT'    => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
0575              'FORUM_IMAGE'            => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
0576              'FORUM_IMAGE_SRC'        => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
0577              'LAST_POST_SUBJECT'        => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? censor_text($last_post_subject) : "",
0578              'LAST_POST_SUBJECT_TRUNCATED'    => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? $last_post_subject_truncated : "",
0579              'LAST_POST_TIME'        => $last_post_time,
0580              'LAST_POSTER'            => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
0581              'LAST_POSTER_COLOUR'    => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
0582              'LAST_POSTER_FULL'        => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
0583              'MODERATORS'            => $moderators_list,
0584              'SUBFORUMS'                => $s_subforums_list,
0585   
0586              'L_SUBFORUM_STR'        => $l_subforums,
0587              'L_MODERATOR_STR'        => $l_moderator,
0588   
0589              'U_UNAPPROVED_TOPICS'    => ($row['forum_id_unapproved_topics']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=unapproved_topics&amp;f=' . $row['forum_id_unapproved_topics']) : '',
0590              'U_UNAPPROVED_POSTS'    => ($row['forum_id_unapproved_posts']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=unapproved_posts&amp;f=' . $row['forum_id_unapproved_posts']) : '',
0591              'U_VIEWFORUM'        => $u_viewforum,
0592              'U_LAST_POSTER'        => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
0593              'U_LAST_POST'        => $last_post_url,
0594          );
0595   
0596          /**
0597          * Modify the template data block of the forum
0598          *
0599          * This event is triggered once per forum
0600          *
0601          * @event core.display_forums_modify_template_vars
0602          * @var    array    forum_row        Template data of the forum
0603          * @var    array    row                The data of the forum
0604          * @var    array    subforums_row    Template data of subforums
0605          * @since 3.1.0-a1
0606          * @change 3.1.0-b5 Added var subforums_row
0607          */
0608          $vars = array('forum_row', 'row', 'subforums_row');
0609          extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_template_vars', compact($vars)));
0610   
0611          $template->assign_block_vars('forumrow', $forum_row);
0612   
0613          // Assign subforums loop for style authors
0614          $template->assign_block_vars_array('forumrow.subforum', $subforums_row);
0615   
0616          /**
0617          * Modify and/or assign additional template data for the forum
0618          * after forumrow loop has been assigned. This can be used
0619          * to create additional forumrow subloops in extensions.
0620          *
0621          * This event is triggered once per forum
0622          *
0623          * @event core.display_forums_add_template_data
0624          * @var    array    forum_row        Template data of the forum
0625          * @var    array    row                The data of the forum
0626          * @var    array    subforums_list    The data of subforums
0627          * @var    array    subforums_row    Template data of subforums
0628          * @var    bool    catless            The flag indicating whether a forum has a parent category
0629          * @since 3.1.0-b5
0630          */
0631          $vars = array(
0632              'forum_row',
0633              'row',
0634              'subforums_list',
0635              'subforums_row',
0636              'catless',
0637          );
0638          extract($phpbb_dispatcher->trigger_event('core.display_forums_add_template_data', compact($vars)));
0639   
0640          $last_catless = $catless;
0641      }
0642   
0643      $template->assign_vars(array(
0644          'U_MARK_FORUMS'        => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums&amp;mark_time=' . time()) : '',
0645          'S_HAS_SUBFORUM'    => ($visible_forums) ? true : false,
0646          'L_SUBFORUM'        => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
0647          'LAST_POST_IMG'        => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
0648          'UNAPPROVED_IMG'    => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
0649          'UNAPPROVED_POST_IMG'    => $user->img('icon_topic_unapproved', 'POSTS_UNAPPROVED_FORUM'),
0650      ));
0651   
0652      /**
0653      * Event to perform additional actions after the forum list has been generated
0654      *
0655      * @event core.display_forums_after
0656      * @var    array    active_forum_ary    Array with forum data to display active topics
0657      * @var    bool    display_moderators    Flag indicating if we display forum moderators
0658      * @var    array    forum_moderators    Array with forum moderators list
0659      * @var    array    forum_rows            Data array of all forums we display
0660      * @var    bool    return_moderators    Flag indicating if moderators list should be returned
0661      * @var    array    root_data            Array with the root forum data
0662      * @since 3.1.0-RC5
0663      */
0664      $vars = array(
0665          'active_forum_ary',
0666          'display_moderators',
0667          'forum_moderators',
0668          'forum_rows',
0669          'return_moderators',
0670          'root_data',
0671      );
0672      extract($phpbb_dispatcher->trigger_event('core.display_forums_after', compact($vars)));
0673   
0674      if ($return_moderators)
0675      {
0676          return array($active_forum_ary, $forum_moderators);
0677      }
0678   
0679      return array($active_forum_ary, array());
0680  }
0681   
0682  /**
0683  * Create forum rules for given forum
0684  */
0685  function generate_forum_rules(&$forum_data)
0686  {
0687      if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
0688      {
0689          return;
0690      }
0691   
0692      global $template, $phpbb_root_path, $phpEx;
0693   
0694      if ($forum_data['forum_rules'])
0695      {
0696          $forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
0697      }
0698   
0699      $template->assign_vars(array(
0700          'S_FORUM_RULES'    => true,
0701          'U_FORUM_RULES'    => $forum_data['forum_rules_link'],
0702          'FORUM_RULES'    => $forum_data['forum_rules'])
0703      );
0704  }
0705   
0706  /**
0707  * Create forum navigation links for given forum, create parent
0708  * list if currently null, assign basic forum info to template
0709  */
0710  function generate_forum_nav(&$forum_data)
0711  {
0712      global $db, $user, $template, $auth, $config;
0713      global $phpEx, $phpbb_root_path;
0714   
0715      if (!$auth->acl_get('f_list', $forum_data['forum_id']))
0716      {
0717          return;
0718      }
0719   
0720      // Get forum parents
0721      $forum_parents = get_forum_parents($forum_data);
0722   
0723      $microdata_attr = 'data-forum-id';
0724   
0725      // Build navigation links
0726      if (!empty($forum_parents))
0727      {
0728          foreach ($forum_parents as $parent_forum_id => $parent_data)
0729          {
0730              list($parent_name, $parent_type) = array_values($parent_data);
0731   
0732              // Skip this parent if the user does not have the permission to view it
0733              if (!$auth->acl_get('f_list', $parent_forum_id))
0734              {
0735                  continue;
0736              }
0737   
0738              $template->assign_block_vars('navlinks', array(
0739                  'S_IS_CAT'        => ($parent_type == FORUM_CAT) ? true : false,
0740                  'S_IS_LINK'        => ($parent_type == FORUM_LINK) ? true : false,
0741                  'S_IS_POST'        => ($parent_type == FORUM_POST) ? true : false,
0742                  'FORUM_NAME'    => $parent_name,
0743                  'FORUM_ID'        => $parent_forum_id,
0744                  'MICRODATA'        => $microdata_attr . '="' . $parent_forum_id . '"',
0745                  'U_VIEW_FORUM'    => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id))
0746              );
0747          }
0748      }
0749   
0750      $template->assign_block_vars('navlinks', array(
0751          'S_IS_CAT'        => ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
0752          'S_IS_LINK'        => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
0753          'S_IS_POST'        => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
0754          'FORUM_NAME'    => $forum_data['forum_name'],
0755          'FORUM_ID'        => $forum_data['forum_id'],
0756          'MICRODATA'        => $microdata_attr . '="' . $forum_data['forum_id'] . '"',
0757          'U_VIEW_FORUM'    => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']))
0758      );
0759   
0760      $template->assign_vars(array(
0761          'FORUM_ID'         => $forum_data['forum_id'],
0762          'FORUM_NAME'    => $forum_data['forum_name'],
0763          'FORUM_DESC'    => generate_text_for_display($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options']),
0764   
0765          'S_ENABLE_FEEDS_FORUM'    => ($config['feed_forum'] && $forum_data['forum_type'] == FORUM_POST && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $forum_data['forum_options'])) ? true : false,
0766      ));
0767   
0768      return;
0769  }
0770   
0771  /**
0772  * Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise
0773  */
0774  function get_forum_parents(&$forum_data)
0775  {
0776      global $db;
0777   
0778      $forum_parents = array();
0779   
0780      if ($forum_data['parent_id'] > 0)
0781      {
0782          if ($forum_data['forum_parents'] == '')
0783          {
0784              $sql = 'SELECT forum_id, forum_name, forum_type
0785                  FROM ' . FORUMS_TABLE . '
0786                  WHERE left_id < ' . $forum_data['left_id'] . '
0787                      AND right_id > ' . $forum_data['right_id'] . '
0788                  ORDER BY left_id ASC';
0789              $result = $db->sql_query($sql);
0790   
0791              while ($row = $db->sql_fetchrow($result))
0792              {
0793                  $forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']);
0794              }
0795              $db->sql_freeresult($result);
0796   
0797              $forum_data['forum_parents'] = serialize($forum_parents);
0798   
0799              $sql = 'UPDATE ' . FORUMS_TABLE . "
0800                  SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "'
0801                  WHERE parent_id = " . $forum_data['parent_id'];
0802              $db->sql_query($sql);
0803          }
0804          else
0805          {
0806              $forum_parents = unserialize($forum_data['forum_parents']);
0807          }
0808      }
0809   
0810      return $forum_parents;
0811  }
0812   
0813  /**
0814  * Obtain list of moderators of each forum
0815  */
0816  function get_moderators(&$forum_moderators, $forum_id = false)
0817  {
0818      global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth;
0819   
0820      $forum_id_ary = array();
0821   
0822      if ($forum_id !== false)
0823      {
0824          if (!is_array($forum_id))
0825          {
0826              $forum_id = array($forum_id);
0827          }
0828   
0829          // Exchange key/value pair to be able to faster check for the forum id existence
0830          $forum_id_ary = array_flip($forum_id);
0831      }
0832   
0833      $sql_array = array(
0834          'SELECT'    => 'm.*, u.user_colour, g.group_colour, g.group_type',
0835   
0836          'FROM'        => array(
0837              MODERATOR_CACHE_TABLE    => 'm',
0838          ),
0839   
0840          'LEFT_JOIN'    => array(
0841              array(
0842                  'FROM'    => array(USERS_TABLE => 'u'),
0843                  'ON'    => 'm.user_id = u.user_id',
0844              ),
0845              array(
0846                  'FROM'    => array(GROUPS_TABLE => 'g'),
0847                  'ON'    => 'm.group_id = g.group_id',
0848              ),
0849          ),
0850   
0851          'WHERE'        => 'm.display_on_index = 1',
0852      );
0853   
0854      // We query every forum here because for caching we should not have any parameter.
0855      $sql = $db->sql_build_query('SELECT', $sql_array);
0856      $result = $db->sql_query($sql, 3600);
0857   
0858      while ($row = $db->sql_fetchrow($result))
0859      {
0860          $f_id = (int) $row['forum_id'];
0861   
0862          if (!isset($forum_id_ary[$f_id]))
0863          {
0864              continue;
0865          }
0866   
0867          if (!empty($row['user_id']))
0868          {
0869              $forum_moderators[$f_id][] = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
0870          }
0871          else
0872          {
0873              $group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
0874   
0875              if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
0876              {
0877                  $forum_moderators[$f_id][] = '<span' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . '>' . $group_name . '</span>';
0878              }
0879              else
0880              {
0881                  $forum_moderators[$f_id][] = '<a' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . ' href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . $group_name . '</a>';
0882              }
0883          }
0884      }
0885      $db->sql_freeresult($result);
0886   
0887      return;
0888  }
0889   
0890  /**
0891  * User authorisation levels output
0892  *
0893  * @param    string    $mode            Can be forum or topic. Not in use at the moment.
0894  * @param    int        $forum_id        The current forum the user is in.
0895  * @param    int        $forum_status    The forums status bit.
0896  */
0897  function gen_forum_auth_level($mode, $forum_id, $forum_status)
0898  {
0899      global $template, $auth, $user, $config;
0900   
0901      $locked = ($forum_status == ITEM_LOCKED && !$auth->acl_get('m_edit', $forum_id)) ? true : false;
0902   
0903      $rules = array(
0904          ($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'],
0905          ($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'],
0906          ($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'],
0907          ($user->data['is_registered'] && ($auth->acl_gets('f_delete', 'm_delete', $forum_id) || $auth->acl_gets('f_softdelete', 'm_softdelete', $forum_id)) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
0908      );
0909   
0910      if ($config['allow_attachments'])
0911      {
0912          $rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'];
0913      }
0914   
0915      foreach ($rules as $rule)
0916      {
0917          $template->assign_block_vars('rules', array('RULE' => $rule));
0918      }
0919   
0920      return;
0921  }
0922   
0923  /**
0924  * Generate topic status
0925  */
0926  function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$folder_alt, &$topic_type)
0927  {
0928      global $user, $config;
0929   
0930      $folder = $folder_new = '';
0931   
0932      if ($topic_row['topic_status'] == ITEM_MOVED)
0933      {
0934          $topic_type = $user->lang['VIEW_TOPIC_MOVED'];
0935          $folder_img = 'topic_moved';
0936          $folder_alt = 'TOPIC_MOVED';
0937      }
0938      else
0939      {
0940          switch ($topic_row['topic_type'])
0941          {
0942              case POST_GLOBAL:
0943                  $topic_type = $user->lang['VIEW_TOPIC_GLOBAL'];
0944                  $folder = 'global_read';
0945                  $folder_new = 'global_unread';
0946              break;
0947   
0948              case POST_ANNOUNCE:
0949                  $topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
0950                  $folder = 'announce_read';
0951                  $folder_new = 'announce_unread';
0952              break;
0953   
0954              case POST_STICKY:
0955                  $topic_type = $user->lang['VIEW_TOPIC_STICKY'];
0956                  $folder = 'sticky_read';
0957                  $folder_new = 'sticky_unread';
0958              break;
0959   
0960              default:
0961                  $topic_type = '';
0962                  $folder = 'topic_read';
0963                  $folder_new = 'topic_unread';
0964   
0965                  // Hot topic threshold is for posts in a topic, which is replies + the first post. ;)
0966                  if ($config['hot_threshold'] && ($replies + 1) >= $config['hot_threshold'] && $topic_row['topic_status'] != ITEM_LOCKED)
0967                  {
0968                      $folder .= '_hot';
0969                      $folder_new .= '_hot';
0970                  }
0971              break;
0972          }
0973   
0974          if ($topic_row['topic_status'] == ITEM_LOCKED)
0975          {
0976              $topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
0977              $folder .= '_locked';
0978              $folder_new .= '_locked';
0979          }
0980   
0981          $folder_img = ($unread_topic) ? $folder_new : $folder;
0982          $folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
0983   
0984          // Posted image?
0985          if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted'])
0986          {
0987              $folder_img .= '_mine';
0988          }
0989      }
0990   
0991      if ($topic_row['poll_start'] && $topic_row['topic_status'] != ITEM_MOVED)
0992      {
0993          $topic_type = $user->lang['VIEW_TOPIC_POLL'];
0994      }
0995  }
0996   
0997  /**
0998  * Assign/Build custom bbcodes for display in screens supporting using of bbcodes
0999  * The custom bbcodes buttons will be placed within the template block 'custom_tags'
1000  */
1001  function display_custom_bbcodes()
1002  {
1003      global $db, $template, $user, $phpbb_dispatcher;
1004   
1005      // Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
1006      $num_predefined_bbcodes = 22;
1007   
1008      $sql_ary = array(
1009          'SELECT'    => 'b.bbcode_id, b.bbcode_tag, b.bbcode_helpline',
1010          'FROM'        => array(BBCODES_TABLE => 'b'),
1011          'WHERE'        => 'b.display_on_posting = 1',
1012          'ORDER_BY'    => 'b.bbcode_tag',
1013      );
1014   
1015      /**
1016      * Event to modify the SQL query before custom bbcode data is queried
1017      *
1018      * @event core.display_custom_bbcodes_modify_sql
1019      * @var    array    sql_ary                    The SQL array to get the bbcode data
1020      * @var    int        num_predefined_bbcodes    The number of predefined core bbcodes
1021      *                                        (multiplied by factor of 2)
1022      * @since 3.1.0-a3
1023      */
1024      $vars = array('sql_ary', 'num_predefined_bbcodes');
1025      extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_sql', compact($vars)));
1026   
1027      $result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));
1028   
1029      $i = 0;
1030      while ($row = $db->sql_fetchrow($result))
1031      {
1032          // If the helpline is defined within the language file, we will use the localised version, else just use the database entry...
1033          if (isset($user->lang[strtoupper($row['bbcode_helpline'])]))
1034          {
1035              $row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])];
1036          }
1037   
1038          $custom_tags = array(
1039              'BBCODE_NAME'        => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
1040              'BBCODE_ID'            => $num_predefined_bbcodes + ($i * 2),
1041              'BBCODE_TAG'        => $row['bbcode_tag'],
1042              'BBCODE_TAG_CLEAN'    => str_replace('=', '-', $row['bbcode_tag']),
1043              'BBCODE_HELPLINE'    => $row['bbcode_helpline'],
1044              'A_BBCODE_HELPLINE'    => str_replace(array('&amp;', '&quot;', "'", '&lt;', '&gt;'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
1045          );
1046   
1047          /**
1048          * Event to modify the template data block of a custom bbcode
1049          *
1050          * This event is triggered once per bbcode
1051          *
1052          * @event core.display_custom_bbcodes_modify_row
1053          * @var    array    custom_tags        Template data of the bbcode
1054          * @var    array    row                The data of the bbcode
1055          * @since 3.1.0-a1
1056          */
1057          $vars = array('custom_tags', 'row');
1058          extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_row', compact($vars)));
1059   
1060          $template->assign_block_vars('custom_tags', $custom_tags);
1061   
1062          $i++;
1063      }
1064      $db->sql_freeresult($result);
1065   
1066      /**
1067      * Display custom bbcodes
1068      *
1069      * @event core.display_custom_bbcodes
1070      * @since 3.1.0-a1
1071      */
1072      $phpbb_dispatcher->dispatch('core.display_custom_bbcodes');
1073  }
1074   
1075  /**
1076  * Display reasons
1077  */
1078  function display_reasons($reason_id = 0)
1079  {
1080      global $db, $user, $template;
1081   
1082      $sql = 'SELECT *
1083          FROM ' . REPORTS_REASONS_TABLE . '
1084          ORDER BY reason_order ASC';
1085      $result = $db->sql_query($sql);
1086   
1087      while ($row = $db->sql_fetchrow($result))
1088      {
1089          // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
1090          if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
1091          {
1092              $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
1093              $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
1094          }
1095   
1096          $template->assign_block_vars('reason', array(
1097              'ID'            => $row['reason_id'],
1098              'TITLE'            => $row['reason_title'],
1099              'DESCRIPTION'    => $row['reason_description'],
1100              'S_SELECTED'    => ($row['reason_id'] == $reason_id) ? true : false)
1101          );
1102      }
1103      $db->sql_freeresult($result);
1104  }
1105   
1106  /**
1107  * Display user activity (action forum/topic)
1108  */
1109  function display_user_activity(&$userdata)
1110  {
1111      global $auth, $template, $db, $user;
1112      global $phpbb_root_path, $phpEx;
1113      global $phpbb_container, $phpbb_dispatcher;
1114   
1115      // Do not display user activity for users having more than 5000 posts...
1116      if ($userdata['user_posts'] > 5000)
1117      {
1118          return;
1119      }
1120   
1121      $forum_ary = array();
1122   
1123      $forum_read_ary = $auth->acl_getf('f_read');
1124      foreach ($forum_read_ary as $forum_id => $allowed)
1125      {
1126          if ($allowed['f_read'])
1127          {
1128              $forum_ary[] = (int) $forum_id;
1129          }
1130      }
1131   
1132      $forum_ary = array_diff($forum_ary, $user->get_passworded_forums());
1133   
1134      $active_f_row = $active_t_row = array();
1135      if (!empty($forum_ary))
1136      {
1137          $phpbb_content_visibility = $phpbb_container->get('content.visibility');
1138   
1139          // Obtain active forum
1140          $sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
1141              FROM ' . POSTS_TABLE . '
1142              WHERE poster_id = ' . $userdata['user_id'] . '
1143                  AND post_postcount = 1
1144                  AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
1145              GROUP BY forum_id
1146              ORDER BY num_posts DESC';
1147          $result = $db->sql_query_limit($sql, 1);
1148          $active_f_row = $db->sql_fetchrow($result);
1149          $db->sql_freeresult($result);
1150   
1151          if (!empty($active_f_row))
1152          {
1153              $sql = 'SELECT forum_name
1154                  FROM ' . FORUMS_TABLE . '
1155                  WHERE forum_id = ' . $active_f_row['forum_id'];
1156              $result = $db->sql_query($sql, 3600);
1157              $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
1158              $db->sql_freeresult($result);
1159          }
1160   
1161          // Obtain active topic
1162          $sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
1163              FROM ' . POSTS_TABLE . '
1164              WHERE poster_id = ' . $userdata['user_id'] . '
1165                  AND post_postcount = 1
1166                  AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
1167              GROUP BY topic_id
1168              ORDER BY num_posts DESC';
1169          $result = $db->sql_query_limit($sql, 1);
1170          $active_t_row = $db->sql_fetchrow($result);
1171          $db->sql_freeresult($result);
1172   
1173          if (!empty($active_t_row))
1174          {
1175              $sql = 'SELECT topic_title
1176                  FROM ' . TOPICS_TABLE . '
1177                  WHERE topic_id = ' . $active_t_row['topic_id'];
1178              $result = $db->sql_query($sql);
1179              $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
1180              $db->sql_freeresult($result);
1181          }
1182      }
1183   
1184      /**
1185      * Alter list of forums and topics to display as active
1186      *
1187      * @event core.display_user_activity_modify_actives
1188      * @var    array    userdata                        User's data
1189      * @var    array    active_f_row                    List of active forums
1190      * @var    array    active_t_row                    List of active posts
1191      * @since 3.1.0-RC3
1192      */
1193      $vars = array('userdata', 'active_f_row', 'active_t_row');
1194      extract($phpbb_dispatcher->trigger_event('core.display_user_activity_modify_actives', compact($vars)));
1195   
1196      $userdata['active_t_row'] = $active_t_row;
1197      $userdata['active_f_row'] = $active_f_row;
1198   
1199      $active_f_name = $active_f_id = $active_f_count = $active_f_pct = '';
1200      if (!empty($active_f_row['num_posts']))
1201      {
1202          $active_f_name = $active_f_row['forum_name'];
1203          $active_f_id = $active_f_row['forum_id'];
1204          $active_f_count = $active_f_row['num_posts'];
1205          $active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0;
1206      }
1207   
1208      $active_t_name = $active_t_id = $active_t_count = $active_t_pct = '';
1209      if (!empty($active_t_row['num_posts']))
1210      {
1211          $active_t_name = $active_t_row['topic_title'];
1212          $active_t_id = $active_t_row['topic_id'];
1213          $active_t_count = $active_t_row['num_posts'];
1214          $active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0;
1215      }
1216   
1217      $l_active_pct = ($userdata['user_id'] != ANONYMOUS && $userdata['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE'];
1218   
1219      $template->assign_vars(array(
1220          'ACTIVE_FORUM'            => $active_f_name,
1221          'ACTIVE_FORUM_POSTS'    => $user->lang('USER_POSTS', (int) $active_f_count),
1222          'ACTIVE_FORUM_PCT'        => sprintf($l_active_pct, $active_f_pct),
1223          'ACTIVE_TOPIC'            => censor_text($active_t_name),
1224          'ACTIVE_TOPIC_POSTS'    => $user->lang('USER_POSTS', (int) $active_t_count),
1225          'ACTIVE_TOPIC_PCT'        => sprintf($l_active_pct, $active_t_pct),
1226          'U_ACTIVE_FORUM'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
1227          'U_ACTIVE_TOPIC'        => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
1228          'S_SHOW_ACTIVITY'        => true)
1229      );
1230  }
1231   
1232  /**
1233  * Topic and forum watching common code
1234  */
1235  function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0, $item_title = '')
1236  {
1237      global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
1238      global $request;
1239   
1240      $table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
1241      $where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
1242      $match_id = ($mode == 'forum') ? $forum_id : $topic_id;
1243      $u_url = "uid={$user->data['user_id']}";
1244      $u_url .= ($mode == 'forum') ? '&amp;f' : '&amp;f=' . $forum_id . '&amp;t';
1245      $is_watching = 0;
1246   
1247      // Is user watching this topic?
1248      if ($user_id != ANONYMOUS)
1249      {
1250          $can_watch = true;
1251   
1252          if ($notify_status == 'unset')
1253          {
1254              $sql = "SELECT notify_status
1255                  FROM $table_sql
1256                  WHERE $where_sql = $match_id
1257                      AND user_id = $user_id";
1258              $result = $db->sql_query($sql);
1259   
1260              $notify_status = ($row = $db->sql_fetchrow($result)) ? $row['notify_status'] : NULL;
1261              $db->sql_freeresult($result);
1262          }
1263   
1264          if (!is_null($notify_status) && $notify_status !== '')
1265          {
1266              if (isset($_GET['unwatch']))
1267              {
1268                  $uid = request_var('uid', 0);
1269                  $token = request_var('hash', '');
1270   
1271                  if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
1272                  {
1273                      if ($uid != $user_id || $request->variable('unwatch', '', false, \phpbb\request\request_interface::GET) != $mode)
1274                      {
1275                          $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
1276                          $message = $user->lang['ERR_UNWATCHING'];
1277   
1278                          if (!$request->is_ajax())
1279                          {
1280                              $message .= '<br /><br />' . $user->lang('RETURN_' . strtoupper($mode), '<a href="' . $redirect_url . '">', '</a>');
1281                          }
1282                          trigger_error($message);
1283                      }
1284   
1285                      $sql = 'DELETE FROM ' . $table_sql . "
1286                          WHERE $where_sql = $match_id
1287                              AND user_id = $user_id";
1288                      $db->sql_query($sql);
1289   
1290                      $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
1291                      $message = $user->lang['NOT_WATCHING_' . strtoupper($mode)];
1292   
1293                      if (!$request->is_ajax())
1294                      {
1295                          $message .= '<br /><br />' . $user->lang('RETURN_' . strtoupper($mode), '<a href="' . $redirect_url . '">', '</a>');
1296                      }
1297                      meta_refresh(3, $redirect_url);
1298                      trigger_error($message);
1299                  }
1300                  else
1301                  {
1302                      $s_hidden_fields = array(
1303                          'uid'        => $user->data['user_id'],
1304                          'unwatch'    => $mode,
1305                          'start'        => $start,
1306                          'f'            => $forum_id,
1307                      );
1308                      if ($mode != 'forum')
1309                      {
1310                          $s_hidden_fields['t'] = $topic_id;
1311                      }
1312   
1313                      if ($item_title == '')
1314                      {
1315                          $confirm_box_message = 'UNWATCH_' . strtoupper($mode);
1316                      }
1317                      else
1318                      {
1319                          $confirm_box_message = $user->lang('UNWATCH_' . strtoupper($mode) . '_DETAILED', $item_title);
1320                      }
1321                      confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
1322                  }
1323              }
1324              else
1325              {
1326                  $is_watching = true;
1327   
1328                  if ($notify_status != NOTIFY_YES)
1329                  {
1330                      $sql = 'UPDATE ' . $table_sql . "
1331                          SET notify_status = " . NOTIFY_YES . "
1332                          WHERE $where_sql = $match_id
1333                              AND user_id = $user_id";
1334                      $db->sql_query($sql);
1335                  }
1336              }
1337          }
1338          else
1339          {
1340              if (isset($_GET['watch']))
1341              {
1342                  $uid = request_var('uid', 0);
1343                  $token = request_var('hash', '');
1344   
1345                  if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
1346                  {
1347                      if ($uid != $user_id || $request->variable('watch', '', false, \phpbb\request\request_interface::GET) != $mode)
1348                      {
1349                          $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
1350                          $message = $user->lang['ERR_WATCHING'];
1351   
1352                          if (!$request->is_ajax())
1353                          {
1354                              $message .= '<br /><br />' . $user->lang('RETURN_' . strtoupper($mode), '<a href="' . $redirect_url . '">', '</a>');
1355                          }
1356                          trigger_error($message);
1357                      }
1358   
1359                      $is_watching = true;
1360   
1361                      $sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status)
1362                          VALUES ($user_id$match_id" . NOTIFY_YES . ')';
1363                      $db->sql_query($sql);
1364   
1365                      $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
1366                      $message = $user->lang['ARE_WATCHING_' . strtoupper($mode)];
1367   
1368                      if (!$request->is_ajax())
1369                      {
1370                          $message .= '<br /><br />' . $user->lang('RETURN_' . strtoupper($mode), '<a href="' . $redirect_url . '">', '</a>');
1371                      }
1372                      meta_refresh(3, $redirect_url);
1373                      trigger_error($message);
1374                  }
1375                  else
1376                  {
1377                      $s_hidden_fields = array(
1378                          'uid'        => $user->data['user_id'],
1379                          'watch'        => $mode,
1380                          'start'        => $start,
1381                          'f'            => $forum_id,
1382                      );
1383                      if ($mode != 'forum')
1384                      {
1385                          $s_hidden_fields['t'] = $topic_id;
1386                      }
1387   
1388                      $confirm_box_message = (($item_title == '') ? 'WATCH_' . strtoupper($mode) : $user->lang('WATCH_' . strtoupper($mode) . '_DETAILED', $item_title));
1389                      confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
1390                  }
1391              }
1392              else
1393              {
1394                  $is_watching = 0;
1395              }
1396          }
1397      }
1398      else
1399      {
1400          if ((isset($_GET['unwatch']) && $request->variable('unwatch', '', false, \phpbb\request\request_interface::GET) == $mode) ||
1401              (isset($_GET['watch']) && $request->variable('watch', '', false, \phpbb\request\request_interface::GET) == $mode))
1402          {
1403              login_box();
1404          }
1405          else
1406          {
1407              $can_watch = 0;
1408              $is_watching = 0;
1409          }
1410      }
1411   
1412      if ($can_watch)
1413      {
1414          $s_watching['link'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;" . (($is_watching) ? 'unwatch' : 'watch') . "=$mode&amp;start=$start&amp;hash=" . generate_link_hash("{$mode}_$match_id"));
1415          $s_watching['link_toggle'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;" . ((!$is_watching) ? 'unwatch' : 'watch') . "=$mode&amp;start=$start&amp;hash=" . generate_link_hash("{$mode}_$match_id"));
1416          $s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
1417          $s_watching['title_toggle'] = $user->lang[((!$is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
1418          $s_watching['is_watching'] = $is_watching;
1419      }
1420   
1421      return;
1422  }
1423   
1424  /**
1425  * Get user rank title and image
1426  *
1427  * @param array $user_data the current stored users data
1428  * @param int $user_posts the users number of posts
1429  *
1430  * @return array An associative array containing the rank title (title), the rank image source (img) and the rank image as full img tag (img)
1431  *
1432  * Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
1433  */
1434  function phpbb_get_user_rank($user_data, $user_posts)
1435  {
1436      global $ranks, $config, $phpbb_root_path, $phpbb_path_helper, $phpbb_dispatcher;
1437   
1438      $user_rank_data = array(
1439          'title'        => null,
1440          'img'        => null,
1441          'img_src'    => null,
1442      );
1443   
1444      /**
1445      * Preparing a user's rank before displaying
1446      *
1447      * @event core.modify_user_rank
1448      * @var    array    user_data        Array with user's data
1449      * @var    int        user_posts        User_posts to change
1450      * @since 3.1.0-RC4
1451      */
1452   
1453      $vars = array('user_data', 'user_posts');
1454      extract($phpbb_dispatcher->trigger_event('core.modify_user_rank', compact($vars)));
1455   
1456      if (empty($ranks))
1457      {
1458          global $cache;
1459          $ranks = $cache->obtain_ranks();
1460      }
1461   
1462      if (!empty($user_data['user_rank']))
1463      {
1464   
1465          $user_rank_data['title'] = (isset($ranks['special'][$user_data['user_rank']]['rank_title'])) ? $ranks['special'][$user_data['user_rank']]['rank_title'] : '';
1466   
1467          $user_rank_data['img_src'] = (!empty($ranks['special'][$user_data['user_rank']]['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_data['user_rank']]['rank_image']) : '';
1468   
1469          $user_rank_data['img'] = (!empty($ranks['special'][$user_data['user_rank']]['rank_image'])) ? '<img src="' . $user_rank_data['img_src'] . '" alt="' . $ranks['special'][$user_data['user_rank']]['rank_title'] . '" title="' . $ranks['special'][$user_data['user_rank']]['rank_title'] . '" />' : '';
1470      }
1471      else if ($user_posts !== false)
1472      {
1473          if (!empty($ranks['normal']))
1474          {
1475              foreach ($ranks['normal'] as $rank)
1476              {
1477                  if ($user_posts >= $rank['rank_min'])
1478                  {
1479                      $user_rank_data['title'] = $rank['rank_title'];
1480                      $user_rank_data['img_src'] = (!empty($rank['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image']) : '';
1481                      $user_rank_data['img'] = (!empty($rank['rank_image'])) ? '<img src="' . $user_rank_data['img_src'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
1482                      break;
1483                  }
1484              }
1485          }
1486      }
1487   
1488      return $user_rank_data;
1489  }
1490   
1491  /**
1492  * Prepare profile data
1493  */
1494  function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabled = false, $check_can_receive_pm = true)
1495  {
1496      global $config, $auth, $user, $phpEx, $phpbb_root_path, $phpbb_dispatcher;
1497   
1498      $username = $data['username'];
1499      $user_id = $data['user_id'];
1500   
1501      $user_rank_data = phpbb_get_user_rank($data, (($user_id == ANONYMOUS) ? false : $data['user_posts']));
1502   
1503      if ((!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_user'))
1504      {
1505          $email = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&amp;u=' . $user_id) : (($config['board_hide_emails'] && !$auth->acl_get('a_user')) ? '' : 'mailto:' . $data['user_email']);
1506      }
1507      else
1508      {
1509          $email = '';
1510      }
1511   
1512      if ($config['load_onlinetrack'])
1513      {
1514          $update_time = $config['load_online_time'] * 60;
1515          $online = (time() - $update_time < $data['session_time'] && ((isset($data['session_viewonline']) && $data['session_viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
1516      }
1517      else
1518      {
1519          $online = false;
1520      }
1521   
1522      if ($data['user_allow_viewonline'] || $auth->acl_get('u_viewonline'))
1523      {
1524          $last_active = (!empty($data['session_time'])) ? $data['session_time'] : $data['user_lastvisit'];
1525      }
1526      else
1527      {
1528          $last_active = '';
1529      }
1530   
1531      $age = '';
1532   
1533      if ($config['allow_birthdays'] && $data['user_birthday'])
1534      {
1535          list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday']));
1536   
1537          if ($bday_year)
1538          {
1539              $now = $user->create_datetime();
1540              $now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset());
1541   
1542              $diff = $now['mon'] - $bday_month;
1543              if ($diff == 0)
1544              {
1545                  $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
1546              }
1547              else
1548              {
1549                  $diff = ($diff < 0) ? 1 : 0;
1550              }
1551   
1552              $age = max(0, (int) ($now['year'] - $bday_year - $diff));
1553          }
1554      }
1555   
1556      if (!function_exists('phpbb_get_banned_user_ids'))
1557      {
1558          include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
1559      }
1560   
1561      // Can this user receive a Private Message?
1562      $can_receive_pm = $check_can_receive_pm && (
1563          // They must be a "normal" user
1564          $data['user_type'] != USER_IGNORE &&
1565   
1566          // They must not be deactivated by the administrator
1567          ($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) &&
1568   
1569          // They must be able to read PMs
1570          sizeof($auth->acl_get_list($user_id, 'u_readpm')) &&
1571   
1572          // They must not be permanently banned
1573          !sizeof(phpbb_get_banned_user_ids($user_id, false)) &&
1574   
1575          // They must allow users to contact via PM
1576          (($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm'])
1577      );
1578   
1579      // Dump it out to the template
1580      $template_data = array(
1581          'AGE'            => $age,
1582          'RANK_TITLE'    => $user_rank_data['title'],
1583          'JOINED'        => $user->format_date($data['user_regdate']),
1584          'LAST_ACTIVE'    => (empty($last_active)) ? ' - ' : $user->format_date($last_active),
1585          'POSTS'            => ($data['user_posts']) ? $data['user_posts'] : 0,
1586          'WARNINGS'        => isset($data['user_warnings']) ? $data['user_warnings'] : 0,
1587   
1588          'USERNAME_FULL'        => get_username_string('full', $user_id, $username, $data['user_colour']),
1589          'USERNAME'            => get_username_string('username', $user_id, $username, $data['user_colour']),
1590          'USER_COLOR'        => get_username_string('colour', $user_id, $username, $data['user_colour']),
1591          'U_VIEW_PROFILE'    => get_username_string('profile', $user_id, $username, $data['user_colour']),
1592   
1593          'A_USERNAME'        => addslashes(get_username_string('username', $user_id, $username, $data['user_colour'])),
1594   
1595          'AVATAR_IMG'        => phpbb_get_user_avatar($data),
1596          'ONLINE_IMG'        => (!$config['load_onlinetrack']) ? '' : (($online) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
1597          'S_ONLINE'            => ($config['load_onlinetrack'] && $online) ? true : false,
1598          'RANK_IMG'            => $user_rank_data['img'],
1599          'RANK_IMG_SRC'        => $user_rank_data['img_src'],
1600          'S_JABBER_ENABLED'    => ($config['jab_enable']) ? true : false,
1601   
1602          'S_WARNINGS'    => ($auth->acl_getf_global('m_') || $auth->acl_get('m_warn')) ? true : false,
1603   
1604          'U_SEARCH_USER' => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$user_id&amp;sr=posts") : '',
1605          'U_NOTES'        => ($user_notes_enabled && $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $user_id, true, $user->session_id) : '',
1606          'U_WARN'        => ($warn_user_enabled && $auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $user_id, true, $user->session_id) : '',
1607          'U_PM'            => ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && $can_receive_pm) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $user_id) : '',
1608          'U_EMAIL'        => $email,
1609          'U_JABBER'        => ($data['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contact&amp;action=jabber&amp;u=' . $user_id) : '',
1610   
1611          'USER_JABBER'        => $data['user_jabber'],
1612          'USER_JABBER_IMG'    => ($data['user_jabber']) ? $user->img('icon_contact_jabber', $data['user_jabber']) : '',
1613   
1614          'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $username),
1615          'L_CONTACT_USER'    => $user->lang('CONTACT_USER', $username),
1616          'L_VIEWING_PROFILE' => $user->lang('VIEWING_PROFILE', $username),
1617      );
1618   
1619      /**
1620      * Preparing a user's data before displaying it in profile and memberlist
1621      *
1622      * @event core.memberlist_prepare_profile_data
1623      * @var    array    data                Array with user's data
1624      * @var    array    template_data        Template array with user's data
1625      * @since 3.1.0-a1
1626      */
1627      $vars = array('data', 'template_data');
1628      extract($phpbb_dispatcher->trigger_event('core.memberlist_prepare_profile_data', compact($vars)));
1629   
1630      return $template_data;
1631  }
1632   
1633  function phpbb_sort_last_active($first, $second)
1634  {
1635      global $id_cache, $sort_dir;
1636   
1637      $lesser_than = ($sort_dir === 'd') ? -1 : 1;
1638   
1639      if (isset($id_cache[$first]['group_leader']) && $id_cache[$first]['group_leader'] && (!isset($id_cache[$second]['group_leader']) || !$id_cache[$second]['group_leader']))
1640      {
1641          return -1;
1642      }
1643      else if (isset($id_cache[$second]['group_leader']) && (!isset($id_cache[$first]['group_leader']) || !$id_cache[$first]['group_leader']) && $id_cache[$second]['group_leader'])
1644      {
1645          return 1;
1646      }
1647      else
1648      {
1649          return $lesser_than * (int) ($id_cache[$first]['last_visit'] - $id_cache[$second]['last_visit']);
1650      }
1651  }
1652