Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

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

viewforum.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 26.58 KiB


 001  <?php
 002  /**
 003  *
 004  * @package phpBB3
 005  * @version $Id$
 006  * @copyright (c) 2005 phpBB Group
 007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 008  *
 009  */
 010   
 011  /**
 012  * @ignore
 013  */
 014  define('IN_PHPBB', true);
 015  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
 016  $phpEx = substr(strrchr(__FILE__, '.'), 1);
 017  include($phpbb_root_path . 'common.' . $phpEx);
 018  include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 019   
 020  // Start session
 021  $user->session_begin();
 022  $auth->acl($user->data);
 023   
 024  // Start initial var setup
 025  $forum_id    = request_var('f', 0);
 026  $mark_read    = request_var('mark', '');
 027  $start        = request_var('start', 0);
 028   
 029  $sort_days    = request_var('st', ((!empty($user->data['user_topic_show_days'])) ? $user->data['user_topic_show_days'] : 0));
 030  $sort_key    = request_var('sk', ((!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'));
 031  $sort_dir    = request_var('sd', ((!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'));
 032   
 033  // Check if the user has actually sent a forum ID with his/her request
 034  // If not give them a nice error page.
 035  if (!$forum_id)
 036  {
 037      trigger_error('NO_FORUM');
 038  }
 039   
 040  $sql_from = FORUMS_TABLE . ' f';
 041  $lastread_select = '';
 042   
 043  // Grab appropriate forum data
 044  if ($config['load_db_lastread'] && $user->data['is_registered'])
 045  {
 046      $sql_from .= ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
 047          AND ft.forum_id = f.forum_id)';
 048      $lastread_select .= ', ft.mark_time';
 049  }
 050   
 051  if ($user->data['is_registered'])
 052  {
 053      $sql_from .= ' LEFT JOIN ' . FORUMS_WATCH_TABLE . ' fw ON (fw.forum_id = f.forum_id AND fw.user_id = ' . $user->data['user_id'] . ')';
 054      $lastread_select .= ', fw.notify_status';
 055  }
 056   
 057  $sql = "SELECT f.* $lastread_select
 058      FROM $sql_from
 059      WHERE f.forum_id = $forum_id";
 060  $result = $db->sql_query($sql);
 061  $forum_data = $db->sql_fetchrow($result);
 062  $db->sql_freeresult($result);
 063   
 064  if (!$forum_data)
 065  {
 066      trigger_error('NO_FORUM');
 067  }
 068   
 069   
 070  // Configure style, language, etc.
 071  $user->setup('viewforum', $forum_data['forum_style']);
 072   
 073  // Redirect to login upon emailed notification links
 074  if (isset($_GET['e']) && !$user->data['is_registered'])
 075  {
 076      login_box('', $user->lang['LOGIN_NOTIFY_FORUM']);
 077  }
 078   
 079  // Permissions check
 080  if (!$auth->acl_gets('f_list', 'f_read', $forum_id) || ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'] && !$auth->acl_get('f_read', $forum_id)))
 081  {
 082      if ($user->data['user_id'] != ANONYMOUS)
 083      {
 084          trigger_error('SORRY_AUTH_READ');
 085      }
 086   
 087      login_box('', $user->lang['LOGIN_VIEWFORUM']);
 088  }
 089   
 090  // Forum is passworded ... check whether access has been granted to this
 091  // user this session, if not show login box
 092  if ($forum_data['forum_password'])
 093  {
 094      login_forum_box($forum_data);
 095  }
 096   
 097  // Is this forum a link? ... User got here either because the
 098  // number of clicks is being tracked or they guessed the id
 099  if ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'])
 100  {
 101      // Does it have click tracking enabled?
 102      if ($forum_data['forum_flags'] & FORUM_FLAG_LINK_TRACK)
 103      {
 104          $sql = 'UPDATE ' . FORUMS_TABLE . '
 105              SET forum_posts = forum_posts + 1
 106              WHERE forum_id = ' . $forum_id;
 107          $db->sql_query($sql);
 108      }
 109   
 110      redirect($forum_data['forum_link']);
 111  }
 112   
 113  // Build navigation links
 114  generate_forum_nav($forum_data);
 115   
 116  // Forum Rules
 117  if ($auth->acl_get('f_read', $forum_id))
 118  {
 119      generate_forum_rules($forum_data);
 120  }
 121   
 122  // Do we have subforums?
 123  $active_forum_ary = $moderators = array();
 124   
 125  if ($forum_data['left_id'] != $forum_data['right_id'] - 1)
 126  {
 127      list($active_forum_ary, $moderators) = display_forums($forum_data, $config['load_moderators'], $config['load_moderators']);
 128  }
 129  else
 130  {
 131      $template->assign_var('S_HAS_SUBFORUM', false);
 132      get_moderators($moderators, $forum_id);
 133  }
 134   
 135  // Dump out the page header and load viewforum template
 136  page_header($user->lang['VIEW_FORUM'] . ' - ' . $forum_data['forum_name']);
 137   
 138  $template->set_filenames(array(
 139      'body' => 'viewforum_body.html')
 140  );
 141   
 142  make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);
 143   
 144  $template->assign_vars(array(
 145      'U_VIEW_FORUM'            => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;start=$start"),
 146  ));
 147   
 148  // Not postable forum or showing active topics?
 149  if (!($forum_data['forum_type'] == FORUM_POST || (($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) && $forum_data['forum_type'] == FORUM_CAT)))
 150  {
 151      page_footer();
 152  }
 153   
 154  // Ok, if someone has only list-access, we only display the forum list.
 155  // We also make this circumstance available to the template in case we want to display a notice. ;)
 156  if (!$auth->acl_get('f_read', $forum_id))
 157  {
 158      $template->assign_vars(array(
 159          'S_NO_READ_ACCESS'        => true,
 160          'S_AUTOLOGIN_ENABLED'    => ($config['allow_autologin']) ? true : false,
 161          'S_LOGIN_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') . '&amp;redirect=' . urlencode(str_replace('&amp;', '&', build_url(array('_f_')))),
 162      ));
 163   
 164      page_footer();
 165  }
 166   
 167  // Handle marking posts
 168  if ($mark_read == 'topics')
 169  {
 170      markread('topics', $forum_id);
 171   
 172      $redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
 173      meta_refresh(3, $redirect_url);
 174   
 175      trigger_error($user->lang['TOPICS_MARKED'] . '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect_url . '">', '</a>'));
 176  }
 177   
 178  // Is a forum specific topic count required?
 179  if ($forum_data['forum_topics_per_page'])
 180  {
 181      $config['topics_per_page'] = $forum_data['forum_topics_per_page'];
 182  }
 183   
 184  // Do the forum Prune thang - cron type job ...
 185  if ($forum_data['prune_next'] < time() && $forum_data['enable_prune'])
 186  {
 187      $template->assign_var('RUN_CRON_TASK', '<img src="' . append_sid($phpbb_root_path . 'cron.' . $phpEx, 'cron_type=prune_forum&amp;f=' . $forum_id) . '" alt="cron" width="1" height="1" />');
 188  }
 189   
 190  // Forum rules and subscription info
 191  $s_watching_forum = $s_watching_forum_img = array();
 192  $s_watching_forum['link'] = $s_watching_forum['title'] = '';
 193  $s_watching_forum['is_watching'] = false;
 194   
 195  if (($config['email_enable'] || $config['jab_enable']) && $config['allow_forum_notify'] && $auth->acl_get('f_subscribe', $forum_id))
 196  {
 197      $notify_status = (isset($forum_data['notify_status'])) ? $forum_data['notify_status'] : NULL;
 198      watch_topic_forum('forum', $s_watching_forum, $s_watching_forum_img, $user->data['user_id'], $forum_id, 0, $notify_status);
 199  }
 200   
 201  $s_forum_rules = '';
 202  gen_forum_auth_level('forum', $forum_id, $forum_data['forum_status']);
 203   
 204  // Topic ordering options
 205  $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 206   
 207  $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
 208  $sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => 't.topic_replies', 's' => 't.topic_title', 'v' => 't.topic_views');
 209   
 210  $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
 211  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 212   
 213  // Limit topics to certain time frame, obtain correct topic count
 214  // global announcements must not be counted, normal announcements have to
 215  // be counted, as forum_topics(_real) includes them
 216  if ($sort_days)
 217  {
 218      $min_post_time = time() - ($sort_days * 86400);
 219   
 220      $sql = 'SELECT COUNT(topic_id) AS num_topics
 221          FROM ' . TOPICS_TABLE . "
 222          WHERE forum_id = $forum_id
 223              AND ((topic_type <> " . POST_GLOBAL . " AND topic_last_post_time >= $min_post_time)
 224                  OR topic_type = " . POST_ANNOUNCE . ")
 225          " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND topic_approved = 1');
 226      $result = $db->sql_query($sql);
 227      $topics_count = (int) $db->sql_fetchfield('num_topics');
 228      $db->sql_freeresult($result);
 229   
 230      if (isset($_POST['sort']))
 231      {
 232          $start = 0;
 233      }
 234      $sql_limit_time = "AND t.topic_last_post_time >= $min_post_time";
 235   
 236      // Make sure we have information about day selection ready
 237      $template->assign_var('S_SORT_DAYS', true);
 238  }
 239  else
 240  {
 241      $topics_count = ($auth->acl_get('m_approve', $forum_id)) ? $forum_data['forum_topics_real'] : $forum_data['forum_topics'];
 242      $sql_limit_time = '';
 243  }
 244   
 245  // Make sure $start is set to the last page if it exceeds the amount
 246  if ($start < 0 || $start > $topics_count)
 247  {
 248      $start = ($start < 0) ? 0 : floor(($topics_count - 1) / $config['topics_per_page']) * $config['topics_per_page'];
 249  }
 250   
 251  // Basic pagewide vars
 252  $post_alt = ($forum_data['forum_status'] == ITEM_LOCKED) ? $user->lang['FORUM_LOCKED'] : $user->lang['POST_NEW_TOPIC'];
 253   
 254  // Display active topics?
 255  $s_display_active = ($forum_data['forum_type'] == FORUM_CAT && ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false;
 256   
 257  $template->assign_vars(array(
 258      'MODERATORS'    => (!empty($moderators[$forum_id])) ? implode(', ', $moderators[$forum_id]) : '',
 259   
 260      'POST_IMG'                    => ($forum_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', $post_alt) : $user->img('button_topic_new', $post_alt),
 261      'NEWEST_POST_IMG'            => $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
 262      'LAST_POST_IMG'                => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
 263      'FOLDER_IMG'                => $user->img('topic_read', 'NO_NEW_POSTS'),
 264      'FOLDER_NEW_IMG'            => $user->img('topic_unread', 'NEW_POSTS'),
 265      'FOLDER_HOT_IMG'            => $user->img('topic_read_hot', 'NO_NEW_POSTS_HOT'),
 266      'FOLDER_HOT_NEW_IMG'        => $user->img('topic_unread_hot', 'NEW_POSTS_HOT'),
 267      'FOLDER_LOCKED_IMG'            => $user->img('topic_read_locked', 'NO_NEW_POSTS_LOCKED'),
 268      'FOLDER_LOCKED_NEW_IMG'        => $user->img('topic_unread_locked', 'NEW_POSTS_LOCKED'),
 269      'FOLDER_STICKY_IMG'            => $user->img('sticky_read', 'POST_STICKY'),
 270      'FOLDER_STICKY_NEW_IMG'        => $user->img('sticky_unread', 'POST_STICKY'),
 271      'FOLDER_ANNOUNCE_IMG'        => $user->img('announce_read', 'POST_ANNOUNCEMENT'),
 272      'FOLDER_ANNOUNCE_NEW_IMG'    => $user->img('announce_unread', 'POST_ANNOUNCEMENT'),
 273      'FOLDER_MOVED_IMG'            => $user->img('topic_moved', 'TOPIC_MOVED'),
 274      'REPORTED_IMG'                => $user->img('icon_topic_reported', 'TOPIC_REPORTED'),
 275      'UNAPPROVED_IMG'            => $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'),
 276      'GOTO_PAGE_IMG'                => $user->img('icon_post_target', 'GOTO_PAGE'),
 277   
 278      'L_NO_TOPICS'             => ($forum_data['forum_status'] == ITEM_LOCKED) ? $user->lang['POST_FORUM_LOCKED'] : $user->lang['NO_TOPICS'],
 279   
 280      'S_DISPLAY_POST_INFO'    => ($forum_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
 281   
 282      'S_IS_POSTABLE'            => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
 283      'S_USER_CAN_POST'        => ($auth->acl_get('f_post', $forum_id)) ? true : false,
 284      'S_DISPLAY_ACTIVE'        => $s_display_active,
 285      'S_SELECT_SORT_DIR'        => $s_sort_dir,
 286      'S_SELECT_SORT_KEY'        => $s_sort_key,
 287      'S_SELECT_SORT_DAYS'    => $s_limit_days,
 288      'S_TOPIC_ICONS'            => ($s_display_active && sizeof($active_forum_ary)) ? max($active_forum_ary['enable_icons']) : (($forum_data['enable_icons']) ? true : false),
 289      'S_WATCH_FORUM_LINK'    => $s_watching_forum['link'],
 290      'S_WATCH_FORUM_TITLE'    => $s_watching_forum['title'],
 291      'S_WATCHING_FORUM'        => $s_watching_forum['is_watching'],
 292      'S_FORUM_ACTION'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;start=$start"),
 293      'S_DISPLAY_SEARCHBOX'    => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
 294      'S_SEARCHBOX_ACTION'    => append_sid("{$phpbb_root_path}search.$phpEx", 'fid[]=' . $forum_id),
 295      'S_SINGLE_MODERATOR'    => (!empty($moderators[$forum_id]) && sizeof($moderators[$forum_id]) > 1) ? false : true,
 296      'S_IS_LOCKED'            => ($forum_data['forum_status'] == ITEM_LOCKED) ? true : false,
 297      'S_VIEWFORUM'            => true,
 298   
 299      'U_MCP'                => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;i=main&amp;mode=forum_view", true, $user->session_id) : '',
 300      'U_POST_NEW_TOPIC'    => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id) : '',
 301      'U_VIEW_FORUM'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;$u_sort_param&amp;start=$start"),
 302      'U_MARK_TOPICS'        => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;mark=topics") : '',
 303  ));
 304   
 305  // Grab icons
 306  $icons = $cache->obtain_icons();
 307   
 308  // Grab all topic data
 309  $rowset = $announcement_list = $topic_list = $global_announce_list = array();
 310   
 311  $sql_array = array(
 312      'SELECT'    => 't.*',
 313      'FROM'        => array(
 314          TOPICS_TABLE        => 't'
 315      ),
 316      'LEFT_JOIN'    => array(),
 317  );
 318   
 319  $sql_approved = ($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1';
 320   
 321  if ($user->data['is_registered'])
 322  {
 323      if ($config['load_db_track'])
 324      {
 325          $sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_POSTED_TABLE => 'tp'), 'ON' => 'tp.topic_id = t.topic_id AND tp.user_id = ' . $user->data['user_id']);
 326          $sql_array['SELECT'] .= ', tp.topic_posted';
 327      }
 328   
 329      if ($config['load_db_lastread'])
 330      {
 331          $sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id']);
 332          $sql_array['SELECT'] .= ', tt.mark_time';
 333   
 334          if ($s_display_active && sizeof($active_forum_ary))
 335          {
 336              $sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.forum_id = t.forum_id AND ft.user_id = ' . $user->data['user_id']);
 337              $sql_array['SELECT'] .= ', ft.mark_time AS forum_mark_time';
 338          }
 339      }
 340  }
 341   
 342  if ($forum_data['forum_type'] == FORUM_POST)
 343  {
 344      // Obtain announcements ... removed sort ordering, sort by time in all cases
 345      $sql = $db->sql_build_query('SELECT', array(
 346          'SELECT'    => $sql_array['SELECT'],
 347          'FROM'        => $sql_array['FROM'],
 348          'LEFT_JOIN'    => $sql_array['LEFT_JOIN'],
 349      
 350          'WHERE'        => 't.forum_id IN (' . $forum_id . ', 0)
 351              AND t.topic_type IN (' . POST_ANNOUNCE . ', ' . POST_GLOBAL . ')',
 352   
 353          'ORDER_BY'    => 't.topic_time DESC',
 354      ));
 355      $result = $db->sql_query($sql);
 356   
 357      while ($row = $db->sql_fetchrow($result))
 358      {
 359          $rowset[$row['topic_id']] = $row;
 360          $announcement_list[] = $row['topic_id'];
 361   
 362          if ($row['topic_type'] == POST_GLOBAL)
 363          {
 364              $global_announce_list[$row['topic_id']] = true;
 365          }
 366          else
 367          {
 368              $topics_count--;
 369          }
 370      }
 371      $db->sql_freeresult($result);
 372  }
 373   
 374  // If the user is trying to reach late pages, start searching from the end
 375  $store_reverse = false;
 376  $sql_limit = $config['topics_per_page'];
 377  if ($start > $topics_count / 2)
 378  {
 379      $store_reverse = true;
 380   
 381      if ($start + $config['topics_per_page'] > $topics_count)
 382      {
 383          $sql_limit = min($config['topics_per_page'], max(1, $topics_count - $start));
 384      }
 385   
 386      // Select the sort order
 387      $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'ASC' : 'DESC');
 388      $sql_start = max(0, $topics_count - $sql_limit - $start);
 389  }
 390  else
 391  {
 392      // Select the sort order
 393      $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 394      $sql_start = $start;
 395  }
 396   
 397  if ($forum_data['forum_type'] == FORUM_POST || !sizeof($active_forum_ary))
 398  {
 399      $sql_where = 't.forum_id = ' . $forum_id;
 400  }
 401  else if (empty($active_forum_ary['exclude_forum_id']))
 402  {
 403      $sql_where = $db->sql_in_set('t.forum_id', $active_forum_ary['forum_id']);
 404  }
 405  else
 406  {
 407      $get_forum_ids = array_diff($active_forum_ary['forum_id'], $active_forum_ary['exclude_forum_id']);
 408      $sql_where = (sizeof($get_forum_ids)) ? $db->sql_in_set('t.forum_id', $get_forum_ids) : 't.forum_id = ' . $forum_id;
 409  }
 410   
 411  // SQL array for obtaining topics/stickies
 412  $sql_array = array(
 413      'SELECT'        => $sql_array['SELECT'],
 414      'FROM'            => $sql_array['FROM'],
 415      'LEFT_JOIN'        => $sql_array['LEFT_JOIN'],
 416   
 417      'WHERE'            => $sql_where . '
 418          AND t.topic_type IN (' . POST_NORMAL . ', ' . POST_STICKY . ")
 419          $sql_approved
 420          $sql_limit_time",
 421   
 422      'ORDER_BY'        => 't.topic_type ' . ((!$store_reverse) ? 'DESC' : 'ASC') . ', ' . $sql_sort_order,
 423  );
 424   
 425  // If store_reverse, then first obtain topics, then stickies, else the other way around...
 426  // Funnily enough you typically save one query if going from the last page to the middle (store_reverse) because
 427  // the number of stickies are not known
 428  $sql = $db->sql_build_query('SELECT', $sql_array);
 429  $result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
 430   
 431  $shadow_topic_list = array();
 432  while ($row = $db->sql_fetchrow($result))
 433  {
 434      if ($row['topic_status'] == ITEM_MOVED)
 435      {
 436          $shadow_topic_list[$row['topic_moved_id']] = $row['topic_id'];
 437      }
 438   
 439      $rowset[$row['topic_id']] = $row;
 440      $topic_list[] = $row['topic_id'];
 441  }
 442  $db->sql_freeresult($result);
 443   
 444  // If we have some shadow topics, update the rowset to reflect their topic information
 445  if (sizeof($shadow_topic_list))
 446  {
 447      $sql = 'SELECT *
 448          FROM ' . TOPICS_TABLE . '
 449          WHERE ' . $db->sql_in_set('topic_id', array_keys($shadow_topic_list));
 450      $result = $db->sql_query($sql);
 451   
 452      while ($row = $db->sql_fetchrow($result))
 453      {
 454          $orig_topic_id = $shadow_topic_list[$row['topic_id']];
 455   
 456          // If the shadow topic is already listed within the rowset (happens for active topics for example), then do not include it...
 457          if (isset($rowset[$row['topic_id']]))
 458          {
 459              // We need to remove any trace regarding this topic. :)
 460              unset($rowset[$orig_topic_id]);
 461              unset($topic_list[array_search($orig_topic_id, $topic_list)]);
 462              $topics_count--;
 463   
 464              continue;
 465          }
 466   
 467          // Do not include those topics the user has no permission to access
 468          if (!$auth->acl_get('f_read', $row['forum_id']))
 469          {
 470              // We need to remove any trace regarding this topic. :)
 471              unset($rowset[$orig_topic_id]);
 472              unset($topic_list[array_search($orig_topic_id, $topic_list)]);
 473              $topics_count--;
 474   
 475              continue;
 476          }
 477   
 478          // We want to retain some values
 479          $row = array_merge($row, array(
 480              'topic_moved_id'    => $rowset[$orig_topic_id]['topic_moved_id'],
 481              'topic_status'        => $rowset[$orig_topic_id]['topic_status'])
 482          );
 483   
 484          $rowset[$orig_topic_id] = $row;
 485      }
 486      $db->sql_freeresult($result);
 487  }
 488  unset($shadow_topic_list);
 489   
 490  // Ok, adjust topics count for active topics list
 491  if ($s_display_active)
 492  {
 493      $topics_count = 1;
 494  }
 495   
 496  $template->assign_vars(array(
 497      'PAGINATION'    => generate_pagination(append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;$u_sort_param"), $topics_count, $config['topics_per_page'], $start),
 498      'PAGE_NUMBER'    => on_page($topics_count, $config['topics_per_page'], $start),
 499      'TOTAL_TOPICS'    => ($s_display_active) ? false : (($topics_count == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $topics_count)))
 500  );
 501   
 502  $topic_list = ($store_reverse) ? array_merge($announcement_list, array_reverse($topic_list)) : array_merge($announcement_list, $topic_list);
 503  $topic_tracking_info = $tracking_topics = array();
 504   
 505  // Okay, lets dump out the page ...
 506  if (sizeof($topic_list))
 507  {
 508      $mark_forum_read = true;
 509      $mark_time_forum = 0;
 510   
 511      // Active topics?
 512      if ($s_display_active && sizeof($active_forum_ary))
 513      {
 514          // Generate topic forum list...
 515          $topic_forum_list = array();
 516          foreach ($rowset as $t_id => $row)
 517          {
 518              $topic_forum_list[$row['forum_id']]['forum_mark_time'] = ($config['load_db_lastread'] && $user->data['is_registered'] && isset($row['forum_mark_time'])) ? $row['forum_mark_time'] : 0;
 519              $topic_forum_list[$row['forum_id']]['topics'][] = $t_id;
 520          }
 521   
 522          if ($config['load_db_lastread'] && $user->data['is_registered'])
 523          {
 524              foreach ($topic_forum_list as $f_id => $topic_row)
 525              {
 526                  $topic_tracking_info += get_topic_tracking($f_id, $topic_row['topics'], $rowset, array($f_id => $topic_row['forum_mark_time']), false);
 527              }
 528          }
 529          else if ($config['load_anon_lastread'] || $user->data['is_registered'])
 530          {
 531              foreach ($topic_forum_list as $f_id => $topic_row)
 532              {
 533                  $topic_tracking_info += get_complete_topic_tracking($f_id, $topic_row['topics'], false);
 534              }
 535          }
 536   
 537          unset($topic_forum_list);
 538      }
 539      else
 540      {
 541          if ($config['load_db_lastread'] && $user->data['is_registered'])
 542          {
 543              $topic_tracking_info = get_topic_tracking($forum_id, $topic_list, $rowset, array($forum_id => $forum_data['mark_time']), $global_announce_list);
 544              $mark_time_forum = (!empty($forum_data['mark_time'])) ? $forum_data['mark_time'] : $user->data['user_lastmark'];
 545          }
 546          else if ($config['load_anon_lastread'] || $user->data['is_registered'])
 547          {
 548              $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_list, $global_announce_list);
 549   
 550              if (!$user->data['is_registered'])
 551              {
 552                  $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
 553              }
 554              $mark_time_forum = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark'];
 555          }
 556      }
 557   
 558      $s_type_switch = 0;
 559      foreach ($topic_list as $topic_id)
 560      {
 561          $row = &$rowset[$topic_id];
 562   
 563          // This will allow the style designer to output a different header
 564          // or even separate the list of announcements from sticky and normal topics
 565          $s_type_switch_test = ($row['topic_type'] == POST_ANNOUNCE || $row['topic_type'] == POST_GLOBAL) ? 1 : 0;
 566   
 567          // Replies
 568          $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
 569   
 570          if ($row['topic_status'] == ITEM_MOVED)
 571          {
 572              $topic_id = $row['topic_moved_id'];
 573              $unread_topic = false;
 574          }
 575          else
 576          {
 577              $unread_topic = (isset($topic_tracking_info[$topic_id]) && $row['topic_last_post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
 578          }
 579   
 580          // Get folder img, topic status/type related information
 581          $folder_img = $folder_alt = $topic_type = '';
 582          topic_status($row, $replies, $unread_topic, $folder_img, $folder_alt, $topic_type);
 583   
 584          // Generate all the URIs ...
 585          $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . (($row['forum_id']) ? $row['forum_id'] : $forum_id) . '&amp;t=' . $topic_id);
 586   
 587          $topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
 588          $posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
 589          $u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&amp;t=$topic_id", true, $user->session_id) : '';
 590   
 591          // Send vars to template
 592          $template->assign_block_vars('topicrow', array(
 593              'FORUM_ID'                    => $forum_id,
 594              'TOPIC_ID'                    => $topic_id,
 595              'TOPIC_AUTHOR'                => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 596              'TOPIC_AUTHOR_COLOUR'        => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 597              'TOPIC_AUTHOR_FULL'            => get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 598              'FIRST_POST_TIME'            => $user->format_date($row['topic_time']),
 599              'LAST_POST_SUBJECT'            => censor_text($row['topic_last_post_subject']),
 600              'LAST_POST_TIME'            => $user->format_date($row['topic_last_post_time']),
 601              'LAST_VIEW_TIME'            => $user->format_date($row['topic_last_view_time']),
 602              'LAST_POST_AUTHOR'            => get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 603              'LAST_POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 604              'LAST_POST_AUTHOR_FULL'        => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 605   
 606              'PAGINATION'        => topic_generate_pagination($replies, $view_topic_url),
 607              'REPLIES'            => $replies,
 608              'VIEWS'                => $row['topic_views'],
 609              'TOPIC_TITLE'        => censor_text($row['topic_title']),
 610              'TOPIC_TYPE'        => $topic_type,
 611   
 612              'TOPIC_FOLDER_IMG'        => $user->img($folder_img, $folder_alt),
 613              'TOPIC_FOLDER_IMG_SRC'    => $user->img($folder_img, $folder_alt, false, '', 'src'),
 614              'TOPIC_FOLDER_IMG_ALT'    => $user->lang[$folder_alt],
 615              'TOPIC_ICON_IMG'        => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
 616              'TOPIC_ICON_IMG_WIDTH'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
 617              'TOPIC_ICON_IMG_HEIGHT'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
 618              'ATTACH_ICON_IMG'        => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
 619              'UNAPPROVED_IMG'        => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
 620   
 621              'S_TOPIC_TYPE'            => $row['topic_type'],
 622              'S_USER_POSTED'            => (isset($row['topic_posted']) && $row['topic_posted']) ? true : false,
 623              'S_UNREAD_TOPIC'        => $unread_topic,
 624              'S_TOPIC_REPORTED'        => (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
 625              'S_TOPIC_UNAPPROVED'    => $topic_unapproved,
 626              'S_POSTS_UNAPPROVED'    => $posts_unapproved,
 627              'S_HAS_POLL'            => ($row['poll_start']) ? true : false,
 628              'S_POST_ANNOUNCE'        => ($row['topic_type'] == POST_ANNOUNCE) ? true : false,
 629              'S_POST_GLOBAL'            => ($row['topic_type'] == POST_GLOBAL) ? true : false,
 630              'S_POST_STICKY'            => ($row['topic_type'] == POST_STICKY) ? true : false,
 631              'S_TOPIC_LOCKED'        => ($row['topic_status'] == ITEM_LOCKED) ? true : false,
 632              'S_TOPIC_MOVED'            => ($row['topic_status'] == ITEM_MOVED) ? true : false,
 633   
 634              'U_NEWEST_POST'            => $view_topic_url . '&amp;view=unread#unread',
 635              'U_LAST_POST'            => $view_topic_url . '&amp;p=' . $row['topic_last_post_id'] . '#p' . $row['topic_last_post_id'],
 636              'U_LAST_POST_AUTHOR'    => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 637              'U_TOPIC_AUTHOR'        => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 638              'U_VIEW_TOPIC'            => $view_topic_url,
 639              'U_MCP_REPORT'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;f=' . $forum_id . '&amp;t=' . $topic_id, true, $user->session_id),
 640              'U_MCP_QUEUE'            => $u_mcp_queue,
 641   
 642              'S_TOPIC_TYPE_SWITCH'    => ($s_type_switch == $s_type_switch_test) ? -1 : $s_type_switch_test)
 643          );
 644   
 645          $s_type_switch = ($row['topic_type'] == POST_ANNOUNCE || $row['topic_type'] == POST_GLOBAL) ? 1 : 0;
 646   
 647          if ($unread_topic)
 648          {
 649              $mark_forum_read = false;
 650          }
 651   
 652          unset($rowset[$topic_id]);
 653      }
 654  }
 655   
 656  // This is rather a fudge but it's the best I can think of without requiring information
 657  // on all topics (as we do in 2.0.x). It looks for unread or new topics, if it doesn't find
 658  // any it updates the forum last read cookie. This requires that the user visit the forum
 659  // after reading a topic
 660  if ($forum_data['forum_type'] == FORUM_POST && sizeof($topic_list) && $mark_forum_read)
 661  {
 662      update_forum_tracking_info($forum_id, $forum_data['forum_last_post_time'], false, $mark_time_forum);
 663  }
 664   
 665  page_footer();
 666   
 667  ?>