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  ?>