2 Column Forum Layout

A perfect place for code snippets to small to be a MOD or a library.
Or for examples on how to use our libraries.
Post Reply
User avatar
bonelifer
Administrator
Administrator
Posts: 477
Joined: 24 Jun 2006, 17:48
Real name: William
Location: htpc.MythBuntu

2 Column Forum Layout

Post by bonelifer »

This post was originally posted by Kenny at 6 String MODs.

A few people have asked for the code that was used(no longer) on Six String Romance to get the 2 column forum layout. It's quite simple. The simple version required 1 file edit to add 1 block of code and 1 html file replacement.

Please note that we didn't write this code. It was written by other members of the phpBB Team (who will be credited below). We are merely documenting how to do it. As will all the other snippets, this will not come in MODx format.



OPEN: includes/functions_display.php
FIND:

Code: Select all

        $last_catless = $catless;
    }    

AFTER ADD:

Code: Select all

// 
// Start category based loops
// Credits to Noxwizard of phpBB.com for this code
//

//Sort forums by category

$cat_array = array();

foreach($forum_rows as $forum)
{
   if ($forum['forum_type'] == FORUM_CAT)
   {
      $cat_array[$forum['forum_id']] = $forum;
   }
   else
   {
      $id = $forum['parent_id'];
      @$cat_array[$id]['children'][@count(@$cat_array[$id]['children'])] = $forum;
   }
}

//Loop through the categories
foreach($cat_array as $cat)
{

//Category
$template->assign_block_vars('catrow', array(
   'FORUM_ID'         => $cat['forum_id'],
   'FORUM_NAME'         => $cat['forum_name'],
   'FORUM_DESC'         => generate_text_for_display($cat['forum_desc'], $cat['forum_desc_uid'], $cat['forum_desc_bitfield'], $cat['forum_desc_options']),
   'FORUM_FOLDER_IMG'            => '',
   'FORUM_FOLDER_IMG_SRC'   => '',
   'FORUM_IMAGE'         => ($cat['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']) . '"><img src="' . $phpbb_root_path . $cat['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" /></a>' : '',
   'FORUM_IMAGE_SRC'      => ($cat['forum_image']) ? $phpbb_root_path . $cat['forum_image'] : '',
   'CHILDREN_COUNT'      => count($cat['children']),
   'U_VIEWFORUM'         => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']))
);

   //Forums under category
   foreach($cat['children'] as $row)
   {
      $visible_forums++;
      $forum_id = $row['forum_id'];
      
      $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;

      $folder_image = $folder_alt = $l_subforums = '';
      $subforums_list = array();

      // Generate list of subforums if we need to
      if (isset($subforums[$forum_id]))
      {
         foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
         {
            $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;

            if ($subforum_row['display'] && $subforum_row['name'])
            {
               $subforums_list[] = array(
                  'link'      => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
                  'name'      => $subforum_row['name'],
                  'unread'      => $subforum_unread,
               );
            }
            else
            {
               unset($subforums[$forum_id][$subforum_id]);
            }

            // If one subforum is unread the forum gets unread too...
            if ($subforum_unread)
            {
               $forum_unread = true;
            }
         }

         $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
         $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
      }
      else
      {
         switch ($row['forum_type'])
         {
             case FORUM_POST:
               $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
            break;

            case FORUM_LINK:
               $folder_image = 'forum_link';
            break;
         }
      }

      // Which folder should we display?
      if ($row['forum_status'] == ITEM_LOCKED)
      {
         $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
         $folder_alt = 'FORUM_LOCKED';
      }
      else
      {
         $folder_alt = ($forum_unread) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
      }
      
      // Create last post link information, if appropriate
      if ($row['forum_last_post_id'])
      {
         $last_post_subject = $row['forum_last_post_subject'];
         $last_post_time = $user->format_date($row['forum_last_post_time']);
         $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'];
      }
      else
      {
         $last_post_subject = $last_post_time = $last_post_url = '';
      }

      // Output moderator listing ... if applicable

      $l_moderator = $moderators_list = '';
      if ($display_moderators && !empty($forum_moderators[$forum_id]))
      {
         $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
         $moderators_list = implode(', ', $forum_moderators[$forum_id]);
      }

      $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
      $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] && FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';

      $s_subforums_list = array();

      foreach ($subforums_list as $subforum)
      {
         $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '">' . $subforum['name'] . '</a>';
      }
      $s_subforums_list = (string) implode(', ', $s_subforums_list);

      if ($row['forum_type'] != FORUM_LINK)
      {
         $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
      }
      else
      {
         // If the forum is a link and we count redirects we need to visit it
         // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
         if (($row['forum_flags'] && FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
         {
            $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
         }
         else
         {
            $u_viewforum = $row['forum_link'];
         }
               }

      $template->assign_block_vars('catrow.forumrow', array(
         'S_IS_LINK'         => ($row['forum_type'] == FORUM_LINK) ? true : false,
         'S_UNREAD_FORUM'      => $forum_unread,
         'S_LOCKED_FORUM'      => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
         'S_SUBFORUMS'         => (sizeof($subforums_list)) ? true : false,

         'FORUM_ID'         => $row['forum_id'],
         'FORUM_NAME'         => $row['forum_name'],
         'FORUM_DESC'         => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),

         'TOPICS'            => $row['forum_topics'],
         $l_post_click_count         => $post_click_count,
         
         'FORUM_FOLDER_IMG'      => $user->img($folder_image, $folder_alt),
         
         'FORUM_FOLDER_IMG_SRC'   => $user->img($folder_image, $folder_alt, false, '', 'src'),

         'FORUM_IMAGE'         => ($row['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) . '"><img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" /></a>' : '',
         'FORUM_IMAGE_SRC'      => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',

         'LAST_POST_SUBJECT'      => censor_text($last_post_subject),
         'LAST_POST_TIME'      => $last_post_time,
         'LAST_POSTER'         => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_COLOUR'      => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_FULL'      => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),

         'MODERATORS'         => $moderators_list,
         'SUBFORUMS'         => $s_subforums_list,

         'L_SUBFORUM_STR'      => $l_subforums,
         'L_FORUM_FOLDER_ALT'      => $folder_alt,
         'L_MODERATOR_STR'      => $l_moderator,

         'U_VIEWFORUM'         => $u_viewforum,
         'U_LAST_POSTER'         => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'U_LAST_POST'         => $last_post_url)
      );

      // Assign subforums loop for style authors
      foreach ($subforums_list as $subforum)
      {
         $template->assign_block_vars('forumrow.subforum', array(
            'U_SUBFORUM'      => $subforum['link'],
            'SUBFORUM_NAME'   => $subforum['name'],
            'S_UNREAD'      => $subforum['unread'])
         );
      }
   }
}
//
// End category based loops
//

For the next part, you need to replace your entire forumlist_body.html file. We recommend backing up this file in case you ever want to revert back.

Change the DEFINE $FORUMS to 1 in this part to specify the max number of forums before it starts putting them into a second column.

style: prosilver
Below is what you should replace your forumlist_body.html file with :)

Code: Select all

<!-- DEFINE $FORUMS = 1 -->
<!-- BEGIN catrow -->

   <div class="forabg">
      <div class="inner"><span class="corners-top"><span></span></span>
         <ul class="topiclist">
            <li class="header">
               <dl class="icon">
                  <dt><!-- IF catrow.FORUM_NAME --><a href="{catrow.U_VIEWFORUM}">{catrow.FORUM_NAME}</a><!-- ELSE -->{L_FORUM}<!-- ENDIF --></dt>
               </dl>
            </li>
         </ul>
         <!-- IF catrow.CHILDREN_COUNT > $FORUMS --><div style="float: left; width: 49.95%;"><!-- ELSE --><div style="width: 100%"><!-- ENDIF -->
            <ul class="topiclist forums">
               <!-- BEGIN forumrow -->
                  <!-- IF forumrow.S_ROW_COUNT is even or catrow.CHILDREN_COUNT <= $FORUMS -->
                     <li class="row">
                        <dl class="icon" style="background-image: url({forumrow.FORUM_FOLDER_IMG_SRC}); background-repeat: no-repeat;">
                           <dt title="{forumrow.FORUM_FOLDER_IMG_ALT}">
                              <!-- IF forumrow.FORUM_IMAGE --><span class="forum-image">{forumrow.FORUM_IMAGE}</span><!-- ENDIF -->
                              <a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />
                              {forumrow.FORUM_DESC}
               <!-- IF forumrow.CLICKS -->
                  <span>{L_REDIRECTS}: {forumrow.CLICKS}</span>
               <!-- ELSEIF not forumrow.S_IS_LINK -->
                  <br /><br />{forumrow.TOPICS} {L_TOPICS} / {forumrow.POSTS} {L_POSTS} &nbsp;
                  <!-- IF forumrow.LAST_POST_TIME --> <a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_TIME}">{LAST_POST_IMG} {L_LAST_POST}</a> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}<br />
                   <!-- ELSE -->{L_NO_POSTS}<!-- ENDIF -->
               <!-- ENDIF -->   
                              <!-- IF forumrow.MODERATORS -->
                                 <br /><strong>{forumrow.L_MODERATOR_STR}:</strong> {forumrow.MODERATORS}
                              <!-- ENDIF -->
                              <!-- IF forumrow.SUBFORUMS and forumrow.S_LIST_SUBFORUMS --><br /><strong>{forumrow.L_SUBFORUM_STR}</strong> {forumrow.SUBFORUMS}<!-- ENDIF -->
                           </dt>
                        </dl>
                     </li>
                  <!-- ENDIF -->
               <!-- END forumrow -->
            </ul>
         </div>
      </div>
      <!-- IF catrow.CHILDREN_COUNT > $FORUMS -->
      <div style="float: right; width: 49.95%;">
         <ul class="topiclist forums">
            <!-- BEGIN forumrow -->           
               <!-- IF forumrow.S_ROW_COUNT is odd -->
                  <li class="row">
                     <dl class="icon" style="background-image: url({forumrow.FORUM_FOLDER_IMG_SRC}); background-repeat: no-repeat;">
                        <dt title="{forumrow.FORUM_FOLDER_IMG_ALT}">
                           <!-- IF forumrow.FORUM_IMAGE --><span class="forum-image">{forumrow.FORUM_IMAGE}</span><!-- ENDIF -->
                           <a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />
                           {forumrow.FORUM_DESC}
               <!-- IF forumrow.CLICKS -->
                  <span>{L_REDIRECTS}: {forumrow.CLICKS}</span>
               <!-- ELSEIF not forumrow.S_IS_LINK -->
                  <br /><br />{forumrow.TOPICS} {L_TOPICS} / {forumrow.POSTS} {L_POSTS} &nbsp;
                  <!-- IF forumrow.LAST_POST_TIME --> <a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_TIME}">{LAST_POST_IMG} {L_LAST_POST}</a> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}<br />
                   <!-- ELSE -->{L_NO_POSTS}<!-- ENDIF -->
               <!-- ENDIF -->   
                           <!-- IF forumrow.MODERATORS -->
                              <br /><strong>{forumrow.L_MODERATOR_STR}:</strong> {forumrow.MODERATORS}
                           <!-- ENDIF -->
                           <!-- IF forumrow.SUBFORUMS and forumrow.S_LIST_SUBFORUMS --><br /><strong>{forumrow.L_SUBFORUM_STR}</strong> {forumrow.SUBFORUMS}<!-- ENDIF -->
                        </dt>
                     </dl>
                  </li>
               <!-- ENDIF -->
            <!-- END forumrow -->
         </ul>
      </div>
      <!-- ENDIF -->

      <span class="corners-bottom"><span></span></span>
   </div>

<!-- BEGINELSE -->
   <div class="panel">
      <div class="inner"><span class="corners-top"><span></span></span>
      <strong>{L_NO_FORUMS}</strong>
      <span class="corners-bottom"><span></span></span></div>
   </div>
<!-- END forumrow -->


style: SubSilver2
Below is what you should replace your forumlist_body.html file with :)

Code: Select all

        <table class="tablebg" cellspacing="1" width="100%">
        <!-- BEGIN catrow -->
           <tr>
                 <td class="cat" colspan="2"><h4><a href="{catrow.U_VIEWFORUM}">{catrow.FORUM_NAME}</a></h4></td>
           </tr>
           <tr>
              <td width="50%" valign="top">
                 <table width="100%">
                    <!-- BEGIN forumrow -->
                       <!-- IF forumrow.S_ROW_COUNT is even -->
                          <tr>
                             <td class="row1" width="80" align="center">{forumrow.FORUM_FOLDER_IMG}</td>
                             <td width="100%" class="row1">
                <div style="float: {S_CONTENT_FLOW_BEGIN}; margin-{S_CONTENT_FLOW_END}: 5px;">{forumrow.FORUM_IMAGE}</div><div style="float: {S_CONTENT_FLOW_BEGIN};">
                                   <a class="forumlink" href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a>
                                   <p class="forumdesc">{forumrow.FORUM_DESC}</p>
                <!-- IF forumrow.CLICKS -->
                          <span>{L_REDIRECTS}: {forumrow.CLICKS}</span>
                       <!-- ELSEIF not forumrow.S_IS_LINK -->
                          <br /><br />{forumrow.TOPICS} {L_TOPICS} / {forumrow.POSTS} {L_POSTS} &nbsp;
                          <!-- IF forumrow.LAST_POST_TIME --> <a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_TIME}">{LAST_POST_IMG} {L_LAST_POST}</a> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}<br />
                           <!-- ELSE -->{L_NO_POSTS}<!-- ENDIF -->
                       <!-- ENDIF -->
                                   <!-- IF forumrow.SUBFORUMS -->
                                         <p class="forumdesc"><strong>{forumrow.L_SUBFORUM_STR}</strong> {forumrow.SUBFORUMS}</p>
                                   <!-- ENDIF -->
                             </td>
                          </tr>
                       <!-- ENDIF -->
                    <!-- END forumrow -->
                 </table>
              </td>
              <td width="50%" valign="top">
                 <table width="100%">
                    <!-- BEGIN forumrow -->
                       <!-- IF forumrow.S_ROW_COUNT is odd -->
                          <tr>
                             <td class="row1" width="50" align="center">{forumrow.FORUM_FOLDER_IMG}</td>
                             <td width="100%" class="row1">
                <div style="float: {S_CONTENT_FLOW_BEGIN}; margin-{S_CONTENT_FLOW_END}: 5px;">{forumrow.FORUM_IMAGE}</div><div style="float: {S_CONTENT_FLOW_BEGIN};">
                                   <a class="forumlink" href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a>
                                   <p class="forumdesc">{forumrow.FORUM_DESC}</p>
                <!-- IF forumrow.CLICKS -->
                          <span>{L_REDIRECTS}: {forumrow.CLICKS}</span>
                       <!-- ELSEIF not forumrow.S_IS_LINK -->
                          <br /><br />{forumrow.TOPICS} {L_TOPICS} / {forumrow.POSTS} {L_POSTS} &nbsp;
                          <!-- IF forumrow.LAST_POST_TIME --> <a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_TIME}">{LAST_POST_IMG} {L_LAST_POST}</a> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}<br />
                           <!-- ELSE -->{L_NO_POSTS}<!-- ENDIF -->
                       <!-- ENDIF -->
                                   <!-- IF forumrow.SUBFORUMS -->
                                         <p class="forumdesc"><strong>{forumrow.L_SUBFORUM_STR}</strong> {forumrow.SUBFORUMS}</p>
                                   <!-- ENDIF -->
                             </td>
                          <!-- ENDIF -->
                       </tr>
                    <!-- END forumrow -->
                 </table>
              </td>
           </tr>
        <!-- END catrow -->
        </table>

Depending on how many subforums you have and what you set the DEFINE at, will change how this displays.

If we've missed anything, if anything template-wise doesn't work, please let us know. We would appreciate anyone trying this, to try it on their prosilver/SubSilver2 template 1st before another style to make sure it works. That way we can work out other style quirks later.



Credits:

Noxwizard for the php code and template code
will_hough for template code
Lurtinnen for template & CSS code
halabit - for updating the subSilver2 code
ferdri3
New member
New member
Posts: 2
Joined: 22 Jan 2011, 10:19

Re: 2 Column Forum Layout

Post by ferdri3 »

Hey there,

I just tested it on my forum and it works on prosilver (also prosilver_se)

For me

Code: Select all

$last_catless = $catless;

was on line 552

and

Code: Select all

<!-- DEFINE $FORUMS = 1 -->

doesnt really work.. leave it at 1 if you want the forums to evenly split between the 2 columns

If you have 5 (or any other uneven number) forums under a category, the forums dont stretch.
To make it nicer for the eye you could add another forum or just edit:

example:
FIND:

Code: Select all

<div class="forabg">
      <div class="inner"><span class="corners-top"><span></span></span>


REPLACE WITH:

Code: Select all

<div class="panel bg3">
      <div class="inner"><span class="corners-top"><span></span></span>



Request:
I would like a guide on how to add a 3th column and even a 4th (aka more then 2 lol)
Neo
New member
New member
Posts: 3
Joined: 26 Feb 2011, 18:45

Re: 2 Column Forum Layout

Post by Neo »

Do you have a site where I can see this or a screenshot! :o

Thx
cheollyeon
New member
New member
Posts: 3
Joined: 05 Dec 2011, 11:26

Re: 2 Column Forum Layout

Post by cheollyeon »

I have tried to subsilver2
but an error occurred, and resolve not can.
Can you help me ? :roll:


Error;

Code: Select all

[phpBB Debug] PHP Warning: in file /includes/functions_display.php on line 580: Invalid argument supplied for foreach()
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4586: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3765)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4588: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3765)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4589: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3765)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4590: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3765)





Login Before
Login Before


Login After
Login After


Please help :roll:
User avatar
tumba25
Supporter
Supporter
Posts: 1052
Joined: 24 Oct 2007, 13:10
Real name: Jari Kanerva
Location: Kokkola, Finland.
Contact:

Re: 2 Column Forum Layout

Post by tumba25 »

Double check that you placed the code in includes/functions_display.php at the right place. After the }.
cheollyeon
New member
New member
Posts: 3
Joined: 05 Dec 2011, 11:26

Re: 2 Column Forum Layout

Post by cheollyeon »

I checked
but I could not find error :roll:

I changed from the beginning
but incorrect :roll:

the modified file; functions_display

Code: Select all

<?php
/**
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
   exit;
}

/**
* Display Forums
*/
function display_forums($root_data = '', $display_moderators = true, $return_moderators = false)
{
   global $db, $auth, $user, $template;
   global $phpbb_root_path, $phpEx, $config;

   $forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
   $parent_id = $visible_forums = 0;
   $sql_from = '';

   // Mark forums read?
   $mark_read = request_var('mark', '');

   if ($mark_read == 'all')
   {
      $mark_read = '';
   }

   if (!$root_data)
   {
      if ($mark_read == 'forums')
      {
         $mark_read = 'all';
      }

      $root_data = array('forum_id' => 0);
      $sql_where = '';
   }
   else
   {
      $sql_where = 'left_id > ' . $root_data['left_id'] . ' AND left_id < ' . $root_data['right_id'];
   }

   // Display list of active topics for this category?
   $show_active = (isset($root_data['forum_flags']) && ($root_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false;

   $sql_array = array(
      'SELECT'   => 'f.*',
      'FROM'      => array(
         FORUMS_TABLE      => 'f'
      ),
      'LEFT_JOIN'   => array(),
   );

   if ($config['load_db_lastread'] && $user->data['is_registered'])
   {
      $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');
      $sql_array['SELECT'] .= ', ft.mark_time';
   }
   else if ($config['load_anon_lastread'] || $user->data['is_registered'])
   {
      $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
      $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();

      if (!$user->data['is_registered'])
      {
         $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
      }
   }

   if ($show_active)
   {
      $sql_array['LEFT_JOIN'][] = array(
         'FROM'   => array(FORUMS_ACCESS_TABLE => 'fa'),
         'ON'   => "fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "'"
      );

      $sql_array['SELECT'] .= ', fa.user_id';
   }

   $sql = $db->sql_build_query('SELECT', array(
      'SELECT'   => $sql_array['SELECT'],
      'FROM'      => $sql_array['FROM'],
      'LEFT_JOIN'   => $sql_array['LEFT_JOIN'],

      'WHERE'      => $sql_where,

      'ORDER_BY'   => 'f.left_id',
   ));

   $result = $db->sql_query($sql);

   $forum_tracking_info = array();
   $branch_root_id = $root_data['forum_id'];

   // Check for unread global announcements (index page only)
   $ga_unread = false;
   if ($root_data['forum_id'] == 0)
   {
      $unread_ga_list = get_unread_topics($user->data['user_id'], 'AND t.forum_id = 0', '', 1);

      if (!empty($unread_ga_list))
      {
         $ga_unread = true;
      }
   }

   while ($row = $db->sql_fetchrow($result))
   {
      $forum_id = $row['forum_id'];

      // Mark forums read?
      if ($mark_read == 'forums' || $mark_read == 'all')
      {
         if ($auth->acl_get('f_list', $forum_id))
         {
            $forum_ids[] = $forum_id;
            continue;
         }
      }

      // Category with no members
      if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
      {
         continue;
      }

      // Skip branch
      if (isset($right_id))
      {
         if ($row['left_id'] < $right_id)
         {
            continue;
         }
         unset($right_id);
      }

      if (!$auth->acl_get('f_list', $forum_id))
      {
         // if the user does not have permissions to list this forum, skip everything until next branch
         $right_id = $row['right_id'];
         continue;
      }

      $forum_ids[] = $forum_id;

      if ($config['load_db_lastread'] && $user->data['is_registered'])
      {
         $forum_tracking_info[$forum_id] = (!empty($row['mark_time'])) ? $row['mark_time'] : $user->data['user_lastmark'];
      }
      else if ($config['load_anon_lastread'] || $user->data['is_registered'])
      {
         if (!$user->data['is_registered'])
         {
            $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
         }
         $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'];
      }

      // Count the difference of real to public topics, so we can display an information to moderators
      $row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && ($row['forum_topics_real'] != $row['forum_topics'])) ? $forum_id : 0;
      $row['forum_topics'] = ($auth->acl_get('m_approve', $forum_id)) ? $row['forum_topics_real'] : $row['forum_topics'];

      // Display active topics from this forum?
      if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS))
      {
         if (!isset($active_forum_ary['forum_topics']))
         {
            $active_forum_ary['forum_topics'] = 0;
         }

         if (!isset($active_forum_ary['forum_posts']))
         {
            $active_forum_ary['forum_posts'] = 0;
         }

         $active_forum_ary['forum_id'][]      = $forum_id;
         $active_forum_ary['enable_icons'][]   = $row['enable_icons'];
         $active_forum_ary['forum_topics']   += $row['forum_topics'];
         $active_forum_ary['forum_posts']   += $row['forum_posts'];

         // If this is a passworded forum we do not show active topics from it if the user is not authorised to view it...
         if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
         {
            $active_forum_ary['exclude_forum_id'][] = $forum_id;
         }
      }

      //
      if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id)
      {
         if ($row['forum_type'] != FORUM_CAT)
         {
            $forum_ids_moderator[] = (int) $forum_id;
         }

         // Direct child of current branch
         $parent_id = $forum_id;
         $forum_rows[$forum_id] = $row;

         if ($row['forum_type'] == FORUM_CAT && $row['parent_id'] == $root_data['forum_id'])
         {
            $branch_root_id = $forum_id;
         }
         $forum_rows[$parent_id]['forum_id_last_post'] = $row['forum_id'];
         $forum_rows[$parent_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
      }
      else if ($row['forum_type'] != FORUM_CAT)
      {
         $subforums[$parent_id][$forum_id]['display'] = ($row['display_on_index']) ? true : false;
         $subforums[$parent_id][$forum_id]['name'] = $row['forum_name'];
         $subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
         $subforums[$parent_id][$forum_id]['children'] = array();

         if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index'])
         {
            $subforums[$parent_id][$row['parent_id']]['children'][] = $forum_id;
         }

         if (!$forum_rows[$parent_id]['forum_id_unapproved_topics'] && $row['forum_id_unapproved_topics'])
         {
            $forum_rows[$parent_id]['forum_id_unapproved_topics'] = $forum_id;
         }

         $forum_rows[$parent_id]['forum_topics'] += $row['forum_topics'];

         // Do not list redirects in LINK Forums as Posts.
         if ($row['forum_type'] != FORUM_LINK)
         {
            $forum_rows[$parent_id]['forum_posts'] += $row['forum_posts'];
         }

         if ($row['forum_last_post_time'] > $forum_rows[$parent_id]['forum_last_post_time'])
         {
            $forum_rows[$parent_id]['forum_last_post_id'] = $row['forum_last_post_id'];
            $forum_rows[$parent_id]['forum_last_post_subject'] = $row['forum_last_post_subject'];
            $forum_rows[$parent_id]['forum_last_post_time'] = $row['forum_last_post_time'];
            $forum_rows[$parent_id]['forum_last_poster_id'] = $row['forum_last_poster_id'];
            $forum_rows[$parent_id]['forum_last_poster_name'] = $row['forum_last_poster_name'];
            $forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour'];
            $forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
         }
      }
   }
   $db->sql_freeresult($result);

   // Handle marking posts
   if ($mark_read == 'forums' || $mark_read == 'all')
   {
      $redirect = build_url(array('mark', 'hash'));
      $token = request_var('hash', '');
      if (check_link_hash($token, 'global'))
      {
         if ($mark_read == 'all')
         {
            markread('all');
            $message = sprintf($user->lang['RETURN_INDEX'], '<a href="' . $redirect . '">', '</a>');
         }
         else
         {
            // Add 0 to forums array to mark global announcements correctly
            $forum_ids[] = 0;
            markread('topics', $forum_ids);
            $message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
         }
         meta_refresh(3, $redirect);
         trigger_error($user->lang['FORUMS_MARKED'] . '<br /><br />' . $message);
      }
      else
      {
         $message = sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
         meta_refresh(3, $redirect);
         trigger_error($message);
      }

   }

   // Grab moderators ... if necessary
   if ($display_moderators)
   {
      if ($return_moderators)
      {
         $forum_ids_moderator[] = $root_data['forum_id'];
      }
      get_moderators($forum_moderators, $forum_ids_moderator);
   }

   // Used to tell whatever we have to create a dummy category or not.
   $last_catless = true;
   foreach ($forum_rows as $row)
   {
      // Empty category
      if ($row['parent_id'] == $root_data['forum_id'] && $row['forum_type'] == FORUM_CAT)
      {
         $template->assign_block_vars('forumrow', array(
            'S_IS_CAT'            => true,
            'FORUM_ID'            => $row['forum_id'],
            'FORUM_NAME'         => $row['forum_name'],
            'FORUM_DESC'         => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
            'FORUM_FOLDER_IMG'      => '',
            'FORUM_FOLDER_IMG_SRC'   => '',
            'FORUM_IMAGE'         => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" />' : '',
            'FORUM_IMAGE_SRC'      => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
            'U_VIEWFORUM'         => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']))
         );

         continue;
      }

      $visible_forums++;
      $forum_id = $row['forum_id'];

      $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;

      // Mark the first visible forum on index as unread if there's any unread global announcement
      if ($ga_unread && !empty($forum_ids_moderator) && $forum_id == $forum_ids_moderator[0])
      {
         $forum_unread = true;
      }

      $folder_image = $folder_alt = $l_subforums = '';
      $subforums_list = array();

      // Generate list of subforums if we need to
      if (isset($subforums[$forum_id]))
      {
         foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
         {
            $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;

            if (!$subforum_unread && !empty($subforum_row['children']))
            {
               foreach ($subforum_row['children'] as $child_id)
               {
                  if (isset($forum_tracking_info[$child_id]) && $subforums[$forum_id][$child_id]['orig_forum_last_post_time'] > $forum_tracking_info[$child_id])
                  {
                     // Once we found an unread child forum, we can drop out of this loop
                     $subforum_unread = true;
                     break;
                  }
               }
            }

            if ($subforum_row['display'] && $subforum_row['name'])
            {
               $subforums_list[] = array(
                  'link'      => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
                  'name'      => $subforum_row['name'],
                  'unread'   => $subforum_unread,
               );
            }
            else
            {
               unset($subforums[$forum_id][$subforum_id]);
            }

            // If one subforum is unread the forum gets unread too...
            if ($subforum_unread)
            {
               $forum_unread = true;
            }
         }

         $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
         $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
      }
      else
      {
         switch ($row['forum_type'])
         {
            case FORUM_POST:
               $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
            break;

            case FORUM_LINK:
               $folder_image = 'forum_link';
            break;
         }
      }

      // Which folder should we display?
      if ($row['forum_status'] == ITEM_LOCKED)
      {
         $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
         $folder_alt = 'FORUM_LOCKED';
      }
      else
      {
         $folder_alt = ($forum_unread) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
      }

      // Create last post link information, if appropriate
      if ($row['forum_last_post_id'])
      {
         $last_post_subject = $row['forum_last_post_subject'];
         $last_post_time = $user->format_date($row['forum_last_post_time']);
         $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'];
      }
      else
      {
         $last_post_subject = $last_post_time = $last_post_url = '';
      }

      // Output moderator listing ... if applicable
      $l_moderator = $moderators_list = '';
      if ($display_moderators && !empty($forum_moderators[$forum_id]))
      {
         $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
         $moderators_list = implode(', ', $forum_moderators[$forum_id]);
      }

      $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
      $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';

      $s_subforums_list = array();
      foreach ($subforums_list as $subforum)
      {
         $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>';
      }
      $s_subforums_list = (string) implode(', ', $s_subforums_list);
      $catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;

      if ($row['forum_type'] != FORUM_LINK)
      {
         $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
      }
      else
      {
         // If the forum is a link and we count redirects we need to visit it
         // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
         if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
         {
            $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
         }
         else
         {
            $u_viewforum = $row['forum_link'];
         }
      }

      $template->assign_block_vars('forumrow', array(
         'S_IS_CAT'         => false,
         'S_NO_CAT'         => $catless && !$last_catless,
         'S_IS_LINK'         => ($row['forum_type'] == FORUM_LINK) ? true : false,
         'S_UNREAD_FORUM'   => $forum_unread,
         'S_LOCKED_FORUM'   => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
         'S_LIST_SUBFORUMS'   => ($row['display_subforum_list']) ? true : false,
         'S_SUBFORUMS'      => (sizeof($subforums_list)) ? true : false,
         'S_FEED_ENABLED'   => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,

         'FORUM_ID'            => $row['forum_id'],
         'FORUM_NAME'         => $row['forum_name'],
         'FORUM_DESC'         => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
         'TOPICS'            => $row['forum_topics'],
         $l_post_click_count      => $post_click_count,
         'FORUM_FOLDER_IMG'      => $user->img($folder_image, $folder_alt),
         'FORUM_FOLDER_IMG_SRC'   => $user->img($folder_image, $folder_alt, false, '', 'src'),
         'FORUM_FOLDER_IMG_ALT'   => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
         'FORUM_IMAGE'         => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
         'FORUM_IMAGE_SRC'      => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
         'LAST_POST_SUBJECT'      => censor_text($last_post_subject),
         'LAST_POST_TIME'      => $last_post_time,
         'LAST_POSTER'         => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_COLOUR'   => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_FULL'      => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'MODERATORS'         => $moderators_list,
         'SUBFORUMS'            => $s_subforums_list,

         'L_SUBFORUM_STR'      => $l_subforums,
         'L_MODERATOR_STR'      => $l_moderator,

         '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']) : '',
         'U_VIEWFORUM'      => $u_viewforum,
         'U_LAST_POSTER'      => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'U_LAST_POST'      => $last_post_url)
      );

      // Assign subforums loop for style authors
      foreach ($subforums_list as $subforum)
      {
         $template->assign_block_vars('forumrow.subforum', array(
            'U_SUBFORUM'   => $subforum['link'],
            'SUBFORUM_NAME'   => $subforum['name'],
            'S_UNREAD'      => $subforum['unread'])
         );
      }

      $last_catless = $catless;
   }
//
// Start category based loops
// Credits to Noxwizard of phpBB.com for this code
//

//Sort forums by category

$cat_array = array();

foreach($forum_rows as $forum)
{
   if ($forum['forum_type'] == FORUM_CAT)
   {
      $cat_array[$forum['forum_id']] = $forum;
   }
   else
   {
      $id = $forum['parent_id'];
      @$cat_array[$id]['children'][@count(@$cat_array[$id]['children'])] = $forum;
   }
}

//Loop through the categories
foreach($cat_array as $cat)
{

//Category
$template->assign_block_vars('catrow', array(
   'FORUM_ID'         => $cat['forum_id'],
   'FORUM_NAME'         => $cat['forum_name'],
   'FORUM_DESC'         => generate_text_for_display($cat['forum_desc'], $cat['forum_desc_uid'], $cat['forum_desc_bitfield'], $cat['forum_desc_options']),
   'FORUM_FOLDER_IMG'            => '',
   'FORUM_FOLDER_IMG_SRC'   => '',
   'FORUM_IMAGE'         => ($cat['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']) . '"><img src="' . $phpbb_root_path . $cat['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" /></a>' : '',
   'FORUM_IMAGE_SRC'      => ($cat['forum_image']) ? $phpbb_root_path . $cat['forum_image'] : '',
   'CHILDREN_COUNT'      => count($cat['children']),
   'U_VIEWFORUM'         => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']))
);

   //Forums under category
   foreach($cat['children'] as $row)
   {
      $visible_forums++;
      $forum_id = $row['forum_id'];
     
      $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;

      $folder_image = $folder_alt = $l_subforums = '';
      $subforums_list = array();

      // Generate list of subforums if we need to
      if (isset($subforums[$forum_id]))
      {
         foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
         {
            $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;

            if ($subforum_row['display'] && $subforum_row['name'])
            {
               $subforums_list[] = array(
                  'link'      => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
                  'name'      => $subforum_row['name'],
                  'unread'      => $subforum_unread,
               );
            }
            else
            {
               unset($subforums[$forum_id][$subforum_id]);
            }

            // If one subforum is unread the forum gets unread too...
            if ($subforum_unread)
            {
               $forum_unread = true;
            }
         }

         $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
         $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
      }
      else
      {
         switch ($row['forum_type'])
         {
             case FORUM_POST:
               $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
            break;

            case FORUM_LINK:
               $folder_image = 'forum_link';
            break;
         }
      }

      // Which folder should we display?
      if ($row['forum_status'] == ITEM_LOCKED)
      {
         $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
         $folder_alt = 'FORUM_LOCKED';
      }
      else
      {
         $folder_alt = ($forum_unread) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
      }
     
      // Create last post link information, if appropriate
      if ($row['forum_last_post_id'])
      {
         $last_post_subject = $row['forum_last_post_subject'];
         $last_post_time = $user->format_date($row['forum_last_post_time']);
         $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'];
      }
      else
      {
         $last_post_subject = $last_post_time = $last_post_url = '';
      }

      // Output moderator listing ... if applicable

      $l_moderator = $moderators_list = '';
      if ($display_moderators && !empty($forum_moderators[$forum_id]))
      {
         $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
         $moderators_list = implode(', ', $forum_moderators[$forum_id]);
      }

      $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
      $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] && FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';

      $s_subforums_list = array();

      foreach ($subforums_list as $subforum)
      {
         $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '">' . $subforum['name'] . '</a>';
      }
      $s_subforums_list = (string) implode(', ', $s_subforums_list);

      if ($row['forum_type'] != FORUM_LINK)
      {
         $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
      }
      else
      {
         // If the forum is a link and we count redirects we need to visit it
         // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
         if (($row['forum_flags'] && FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
         {
            $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
         }
         else
         {
            $u_viewforum = $row['forum_link'];
         }
               }

      $template->assign_block_vars('catrow.forumrow', array(
         'S_IS_LINK'         => ($row['forum_type'] == FORUM_LINK) ? true : false,
         'S_UNREAD_FORUM'      => $forum_unread,
         'S_LOCKED_FORUM'      => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
         'S_SUBFORUMS'         => (sizeof($subforums_list)) ? true : false,

         'FORUM_ID'         => $row['forum_id'],
         'FORUM_NAME'         => $row['forum_name'],
         'FORUM_DESC'         => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),

         'TOPICS'            => $row['forum_topics'],
         $l_post_click_count         => $post_click_count,
         
         'FORUM_FOLDER_IMG'      => $user->img($folder_image, $folder_alt),
         
         'FORUM_FOLDER_IMG_SRC'   => $user->img($folder_image, $folder_alt, false, '', 'src'),

         'FORUM_IMAGE'         => ($row['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) . '"><img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" /></a>' : '',
         'FORUM_IMAGE_SRC'      => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',

         'LAST_POST_SUBJECT'      => censor_text($last_post_subject),
         'LAST_POST_TIME'      => $last_post_time,
         'LAST_POSTER'         => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_COLOUR'      => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'LAST_POSTER_FULL'      => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),

         'MODERATORS'         => $moderators_list,
         'SUBFORUMS'         => $s_subforums_list,

         'L_SUBFORUM_STR'      => $l_subforums,
         'L_FORUM_FOLDER_ALT'      => $folder_alt,
         'L_MODERATOR_STR'      => $l_moderator,

         'U_VIEWFORUM'         => $u_viewforum,
         'U_LAST_POSTER'         => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
         'U_LAST_POST'         => $last_post_url)
      );

      // Assign subforums loop for style authors
      foreach ($subforums_list as $subforum)
      {
         $template->assign_block_vars('forumrow.subforum', array(
            'U_SUBFORUM'      => $subforum['link'],
            'SUBFORUM_NAME'   => $subforum['name'],
            'S_UNREAD'      => $subforum['unread'])
         );
      }
   }
}
//
// End category based loops
//
   $template->assign_vars(array(
      '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') : '',
      'S_HAS_SUBFORUM'   => ($visible_forums) ? true : false,
      'L_SUBFORUM'      => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
      'LAST_POST_IMG'      => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
      'UNAPPROVED_IMG'   => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
   ));

   if ($return_moderators)
   {
      return array($active_forum_ary, $forum_moderators);
   }

   return array($active_forum_ary, array());
}

/**
* Create forum rules for given forum
*/
function generate_forum_rules(&$forum_data)
{
   if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
   {
      return;
   }

   global $template, $phpbb_root_path, $phpEx;

   if ($forum_data['forum_rules'])
   {
      $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']);
   }

   $template->assign_vars(array(
      'S_FORUM_RULES'   => true,
      'U_FORUM_RULES'   => $forum_data['forum_rules_link'],
      'FORUM_RULES'   => $forum_data['forum_rules'])
   );
}

/**
* Create forum navigation links for given forum, create parent
* list if currently null, assign basic forum info to template
*/
function generate_forum_nav(&$forum_data)
{
   global $db, $user, $template, $auth, $config;
   global $phpEx, $phpbb_root_path;

   if (!$auth->acl_get('f_list', $forum_data['forum_id']))
   {
      return;
   }

   // Get forum parents
   $forum_parents = get_forum_parents($forum_data);

   // Build navigation links
   if (!empty($forum_parents))
   {
      foreach ($forum_parents as $parent_forum_id => $parent_data)
      {
         list($parent_name, $parent_type) = array_values($parent_data);

         // Skip this parent if the user does not have the permission to view it
         if (!$auth->acl_get('f_list', $parent_forum_id))
         {
            continue;
         }

         $template->assign_block_vars('navlinks', array(
            'S_IS_CAT'      => ($parent_type == FORUM_CAT) ? true : false,
            'S_IS_LINK'      => ($parent_type == FORUM_LINK) ? true : false,
            'S_IS_POST'      => ($parent_type == FORUM_POST) ? true : false,
            'FORUM_NAME'   => $parent_name,
            'FORUM_ID'      => $parent_forum_id,
            'U_VIEW_FORUM'   => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id))
         );
      }
   }

   $template->assign_block_vars('navlinks', array(
      'S_IS_CAT'      => ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
      'S_IS_LINK'      => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
      'S_IS_POST'      => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
      'FORUM_NAME'   => $forum_data['forum_name'],
      'FORUM_ID'      => $forum_data['forum_id'],
      'U_VIEW_FORUM'   => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']))
   );

   $template->assign_vars(array(
      'FORUM_ID'       => $forum_data['forum_id'],
      'FORUM_NAME'   => $forum_data['forum_name'],
      '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']),

      '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,
   ));

   return;
}

/**
* Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise
*/
function get_forum_parents(&$forum_data)
{
   global $db;

   $forum_parents = array();

   if ($forum_data['parent_id'] > 0)
   {
      if ($forum_data['forum_parents'] == '')
      {
         $sql = 'SELECT forum_id, forum_name, forum_type
            FROM ' . FORUMS_TABLE . '
            WHERE left_id < ' . $forum_data['left_id'] . '
               AND right_id > ' . $forum_data['right_id'] . '
            ORDER BY left_id ASC';
         $result = $db->sql_query($sql);

         while ($row = $db->sql_fetchrow($result))
         {
            $forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']);
         }
         $db->sql_freeresult($result);

         $forum_data['forum_parents'] = serialize($forum_parents);

         $sql = 'UPDATE ' . FORUMS_TABLE . "
            SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "'
            WHERE parent_id = " . $forum_data['parent_id'];
         $db->sql_query($sql);
      }
      else
      {
         $forum_parents = unserialize($forum_data['forum_parents']);
      }
   }

   return $forum_parents;
}

/**
* Generate topic pagination
*/
function topic_generate_pagination($replies, $url)
{
   global $config, $user;

   // Make sure $per_page is a valid value
   $per_page = ($config['posts_per_page'] <= 0) ? 1 : $config['posts_per_page'];

   if (($replies + 1) > $per_page)
   {
      $total_pages = ceil(($replies + 1) / $per_page);
      $pagination = '';

      $times = 1;
      for ($j = 0; $j < $replies + 1; $j += $per_page)
      {
         $pagination .= '<a href="' . $url . ($j == 0 ? '' : '&amp;start=' . $j) . '">' . $times . '</a>';
         if ($times == 1 && $total_pages > 5)
         {
            $pagination .= ' ... ';

            // Display the last three pages
            $times = $total_pages - 3;
            $j += ($total_pages - 4) * $per_page;
         }
         else if ($times < $total_pages)
         {
            $pagination .= '<span class="page-sep">' . $user->lang['COMMA_SEPARATOR'] . '</span>';
         }
         $times++;
      }
   }
   else
   {
      $pagination = '';
   }

   return $pagination;
}

/**
* Obtain list of moderators of each forum
*/
function get_moderators(&$forum_moderators, $forum_id = false)
{
   global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth;

   $forum_id_ary = array();

   if ($forum_id !== false)
   {
      if (!is_array($forum_id))
      {
         $forum_id = array($forum_id);
      }

      // Exchange key/value pair to be able to faster check for the forum id existence
      $forum_id_ary = array_flip($forum_id);
   }

   $sql_array = array(
      'SELECT'   => 'm.*, u.user_colour, g.group_colour, g.group_type',

      'FROM'      => array(
         MODERATOR_CACHE_TABLE   => 'm',
      ),

      'LEFT_JOIN'   => array(
         array(
            'FROM'   => array(USERS_TABLE => 'u'),
            'ON'   => 'm.user_id = u.user_id',
         ),
         array(
            'FROM'   => array(GROUPS_TABLE => 'g'),
            'ON'   => 'm.group_id = g.group_id',
         ),
      ),

      'WHERE'      => 'm.display_on_index = 1',
   );

   // We query every forum here because for caching we should not have any parameter.
   $sql = $db->sql_build_query('SELECT', $sql_array);
   $result = $db->sql_query($sql, 3600);

   while ($row = $db->sql_fetchrow($result))
   {
      $f_id = (int) $row['forum_id'];

      if (!isset($forum_id_ary[$f_id]))
      {
         continue;
      }

      if (!empty($row['user_id']))
      {
         $forum_moderators[$f_id][] = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
      }
      else
      {
         $group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);

         if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
         {
            $forum_moderators[$f_id][] = '<span' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . '>' . $group_name . '</span>';
         }
         else
         {
            $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>';
         }
      }
   }
   $db->sql_freeresult($result);

   return;
}

/**
* User authorisation levels output
*
* @param   string   $mode         Can be forum or topic. Not in use at the moment.
* @param   int      $forum_id      The current forum the user is in.
* @param   int      $forum_status   The forums status bit.
*/
function gen_forum_auth_level($mode, $forum_id, $forum_status)
{
   global $template, $auth, $user, $config;

   $locked = ($forum_status == ITEM_LOCKED && !$auth->acl_get('m_edit', $forum_id)) ? true : false;

   $rules = array(
      ($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'],
      ($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'],
      ($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'],
      ($user->data['is_registered'] && $auth->acl_gets('f_delete', 'm_delete', $forum_id) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
   );

   if ($config['allow_attachments'])
   {
      $rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'];
   }

   foreach ($rules as $rule)
   {
      $template->assign_block_vars('rules', array('RULE' => $rule));
   }

   return;
}

/**
* Generate topic status
*/
function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$folder_alt, &$topic_type)
{
   global $user, $config;

   $folder = $folder_new = '';

   if ($topic_row['topic_status'] == ITEM_MOVED)
   {
      $topic_type = $user->lang['VIEW_TOPIC_MOVED'];
      $folder_img = 'topic_moved';
      $folder_alt = 'TOPIC_MOVED';
   }
   else
   {
      switch ($topic_row['topic_type'])
      {
         case POST_GLOBAL:
            $topic_type = $user->lang['VIEW_TOPIC_GLOBAL'];
            $folder = 'global_read';
            $folder_new = 'global_unread';
         break;

         case POST_ANNOUNCE:
            $topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
            $folder = 'announce_read';
            $folder_new = 'announce_unread';
         break;

         case POST_STICKY:
            $topic_type = $user->lang['VIEW_TOPIC_STICKY'];
            $folder = 'sticky_read';
            $folder_new = 'sticky_unread';
         break;

         default:
            $topic_type = '';
            $folder = 'topic_read';
            $folder_new = 'topic_unread';

            // Hot topic threshold is for posts in a topic, which is replies + the first post. ;)
            if ($config['hot_threshold'] && ($replies + 1) >= $config['hot_threshold'] && $topic_row['topic_status'] != ITEM_LOCKED)
            {
               $folder .= '_hot';
               $folder_new .= '_hot';
            }
         break;
      }

      if ($topic_row['topic_status'] == ITEM_LOCKED)
      {
         $topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
         $folder .= '_locked';
         $folder_new .= '_locked';
      }


      $folder_img = ($unread_topic) ? $folder_new : $folder;
      $folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');

      // Posted image?
      if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted'])
      {
         $folder_img .= '_mine';
      }
   }

   if ($topic_row['poll_start'] && $topic_row['topic_status'] != ITEM_MOVED)
   {
      $topic_type = $user->lang['VIEW_TOPIC_POLL'];
   }
}

/**
* Assign/Build custom bbcodes for display in screens supporting using of bbcodes
* The custom bbcodes buttons will be placed within the template block 'custom_codes'
*/
function display_custom_bbcodes()
{
   global $db, $template, $user;

   // Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
   $num_predefined_bbcodes = 22;

   $sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
      FROM ' . BBCODES_TABLE . '
      WHERE display_on_posting = 1
      ORDER BY bbcode_tag';
   $result = $db->sql_query($sql);

   $i = 0;
   while ($row = $db->sql_fetchrow($result))
   {
      // If the helpline is defined within the language file, we will use the localised version, else just use the database entry...
      if (isset($user->lang[strtoupper($row['bbcode_helpline'])]))
      {
         $row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])];
      }

      $template->assign_block_vars('custom_tags', array(
         'BBCODE_NAME'      => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
         'BBCODE_ID'         => $num_predefined_bbcodes + ($i * 2),
         'BBCODE_TAG'      => $row['bbcode_tag'],
         'BBCODE_HELPLINE'   => $row['bbcode_helpline'],
         'A_BBCODE_HELPLINE'   => str_replace(array('&amp;', '&quot;', "'", '&lt;', '&gt;'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
      ));

      $i++;
   }
   $db->sql_freeresult($result);
}

/**
* Display reasons
*/
function display_reasons($reason_id = 0)
{
   global $db, $user, $template;

   $sql = 'SELECT *
      FROM ' . REPORTS_REASONS_TABLE . '
      ORDER BY reason_order ASC';
   $result = $db->sql_query($sql);

   while ($row = $db->sql_fetchrow($result))
   {
      // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
      if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
      {
         $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
         $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
      }

      $template->assign_block_vars('reason', array(
         'ID'         => $row['reason_id'],
         'TITLE'         => $row['reason_title'],
         'DESCRIPTION'   => $row['reason_description'],
         'S_SELECTED'   => ($row['reason_id'] == $reason_id) ? true : false)
      );
   }
   $db->sql_freeresult($result);
}

/**
* Display user activity (action forum/topic)
*/
function display_user_activity(&$userdata)
{
   global $auth, $template, $db, $user;
   global $phpbb_root_path, $phpEx;

   // Do not display user activity for users having more than 5000 posts...
   if ($userdata['user_posts'] > 5000)
   {
      return;
   }

   $forum_ary = array();

   // Do not include those forums the user is not having read access to...
   $forum_read_ary = $auth->acl_getf('!f_read');

   foreach ($forum_read_ary as $forum_id => $not_allowed)
   {
      if ($not_allowed['f_read'])
      {
         $forum_ary[] = (int) $forum_id;
      }
   }

   $forum_ary = array_unique($forum_ary);
   $forum_sql = (sizeof($forum_ary)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary, true) : '';

   $fid_m_approve = $auth->acl_getf('m_approve', true);
   $sql_m_approve = (!empty($fid_m_approve)) ? 'OR ' . $db->sql_in_set('forum_id', array_keys($fid_m_approve)) : '';

   // Obtain active forum
   $sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
      FROM ' . POSTS_TABLE . '
      WHERE poster_id = ' . $userdata['user_id'] . "
         AND post_postcount = 1
         AND (post_approved = 1
            $sql_m_approve)
         $forum_sql
      GROUP BY forum_id
      ORDER BY num_posts DESC";
   $result = $db->sql_query_limit($sql, 1);
   $active_f_row = $db->sql_fetchrow($result);
   $db->sql_freeresult($result);

   if (!empty($active_f_row))
   {
      $sql = 'SELECT forum_name
         FROM ' . FORUMS_TABLE . '
         WHERE forum_id = ' . $active_f_row['forum_id'];
      $result = $db->sql_query($sql, 3600);
      $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
      $db->sql_freeresult($result);
   }

   // Obtain active topic
   $sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
      FROM ' . POSTS_TABLE . '
      WHERE poster_id = ' . $userdata['user_id'] . "
         AND post_postcount = 1
         AND (post_approved = 1
            $sql_m_approve)
         $forum_sql
      GROUP BY topic_id
      ORDER BY num_posts DESC";
   $result = $db->sql_query_limit($sql, 1);
   $active_t_row = $db->sql_fetchrow($result);
   $db->sql_freeresult($result);

   if (!empty($active_t_row))
   {
      $sql = 'SELECT topic_title
         FROM ' . TOPICS_TABLE . '
         WHERE topic_id = ' . $active_t_row['topic_id'];
      $result = $db->sql_query($sql);
      $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
      $db->sql_freeresult($result);
   }

   $userdata['active_t_row'] = $active_t_row;
   $userdata['active_f_row'] = $active_f_row;

   $active_f_name = $active_f_id = $active_f_count = $active_f_pct = '';
   if (!empty($active_f_row['num_posts']))
   {
      $active_f_name = $active_f_row['forum_name'];
      $active_f_id = $active_f_row['forum_id'];
      $active_f_count = $active_f_row['num_posts'];
      $active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0;
   }

   $active_t_name = $active_t_id = $active_t_count = $active_t_pct = '';
   if (!empty($active_t_row['num_posts']))
   {
      $active_t_name = $active_t_row['topic_title'];
      $active_t_id = $active_t_row['topic_id'];
      $active_t_count = $active_t_row['num_posts'];
      $active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0;
   }

   $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'];

   $template->assign_vars(array(
      'ACTIVE_FORUM'         => $active_f_name,
      'ACTIVE_FORUM_POSTS'   => ($active_f_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_f_count),
      'ACTIVE_FORUM_PCT'      => sprintf($l_active_pct, $active_f_pct),
      'ACTIVE_TOPIC'         => censor_text($active_t_name),
      'ACTIVE_TOPIC_POSTS'   => ($active_t_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_t_count),
      'ACTIVE_TOPIC_PCT'      => sprintf($l_active_pct, $active_t_pct),
      'U_ACTIVE_FORUM'      => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
      'U_ACTIVE_TOPIC'      => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
      'S_SHOW_ACTIVITY'      => true)
   );
}

/**
* Topic and forum watching common code
*/
function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0)
{
   global $template, $db, $user, $phpEx, $start, $phpbb_root_path;

   $table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
   $where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
   $match_id = ($mode == 'forum') ? $forum_id : $topic_id;
   $u_url = "uid={$user->data['user_id']}";
   $u_url .= ($mode == 'forum') ? '&amp;f' : '&amp;f=' . $forum_id . '&amp;t';

   // Is user watching this thread?
   if ($user_id != ANONYMOUS)
   {
      $can_watch = true;

      if ($notify_status == 'unset')
      {
         $sql = "SELECT notify_status
            FROM $table_sql
            WHERE $where_sql = $match_id
               AND user_id = $user_id";
         $result = $db->sql_query($sql);

         $notify_status = ($row = $db->sql_fetchrow($result)) ? $row['notify_status'] : NULL;
         $db->sql_freeresult($result);
      }

      if (!is_null($notify_status) && $notify_status !== '')
      {

         if (isset($_GET['unwatch']))
         {
            $uid = request_var('uid', 0);
            if ($uid != $user_id)
            {
               $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
               $message = $user->lang['ERR_UNWATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
               trigger_error($message);
            }
            if ($_GET['unwatch'] == $mode)
            {
               $is_watching = 0;

               $sql = 'DELETE FROM ' . $table_sql . "
                  WHERE $where_sql = $match_id
                     AND user_id = $user_id";
               $db->sql_query($sql);
            }

            $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");

            meta_refresh(3, $redirect_url);

            $message = $user->lang['NOT_WATCHING_' . strtoupper($mode)] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
            trigger_error($message);
         }
         else
         {
            $is_watching = true;

            if ($notify_status != NOTIFY_YES)
            {
               $sql = 'UPDATE ' . $table_sql . "
                  SET notify_status = " . NOTIFY_YES . "
                  WHERE $where_sql = $match_id
                     AND user_id = $user_id";
               $db->sql_query($sql);
            }
         }
      }
      else
      {
         if (isset($_GET['watch']))
         {
            $token = request_var('hash', '');
            $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");

            if ($_GET['watch'] == $mode && check_link_hash($token, "{$mode}_$match_id"))
            {
               $is_watching = true;

               $sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status)
                  VALUES ($user_id, $match_id, " . NOTIFY_YES . ')';
               $db->sql_query($sql);
               $message = $user->lang['ARE_WATCHING_' . strtoupper($mode)] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
            }
            else
            {
               $message = $user->lang['ERR_WATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
            }

            meta_refresh(3, $redirect_url);

            trigger_error($message);
         }
         else
         {
            $is_watching = 0;
         }
      }
   }
   else
   {
      if (isset($_GET['unwatch']) && $_GET['unwatch'] == $mode)
      {
         login_box();
      }
      else
      {
         $can_watch = 0;
         $is_watching = 0;
      }
   }

   if ($can_watch)
   {
      $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"));
      $s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
      $s_watching['is_watching'] = $is_watching;
   }

   return;
}

/**
* Get user rank title and image
*
* @param int $user_rank the current stored users rank id
* @param int $user_posts the users number of posts
* @param string &$rank_title the rank title will be stored here after execution
* @param string &$rank_img the rank image as full img tag is stored here after execution
* @param string &$rank_img_src the rank image source is stored here after execution
*
* 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
*/
function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
{
   global $ranks, $config, $phpbb_root_path;

   if (empty($ranks))
   {
      global $cache;
      $ranks = $cache->obtain_ranks();
   }

   if (!empty($user_rank))
   {
      $rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : '';
      $rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : '';
      $rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : '';
   }
   else if ($user_posts !== false)
   {
      if (!empty($ranks['normal']))
      {
         foreach ($ranks['normal'] as $rank)
         {
            if ($user_posts >= $rank['rank_min'])
            {
               $rank_title = $rank['rank_title'];
               $rank_img = (!empty($rank['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
               $rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] : '';
               break;
            }
         }
      }
   }
}

/**
* Get user avatar
*
* @param string $avatar Users assigned avatar name
* @param int $avatar_type Type of avatar
* @param string $avatar_width Width of users avatar
* @param string $avatar_height Height of users avatar
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
* @return string Avatar image
*/
function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $alt = 'USER_AVATAR', $ignore_config = false)
{
   global $user, $config, $phpbb_root_path, $phpEx;

   if (empty($avatar) || !$avatar_type || (!$config['allow_avatar'] && !$ignore_config))
   {
      return '';
   }

   $avatar_img = '';

   switch ($avatar_type)
   {
      case AVATAR_UPLOAD:
         if (!$config['allow_avatar_upload'] && !$ignore_config)
         {
            return '';
         }
         $avatar_img = $phpbb_root_path . "download/file.$phpEx?avatar=";
      break;

      case AVATAR_GALLERY:
         if (!$config['allow_avatar_local'] && !$ignore_config)
         {
            return '';
         }
         $avatar_img = $phpbb_root_path . $config['avatar_gallery_path'] . '/';
      break;

      case AVATAR_REMOTE:
         if (!$config['allow_avatar_remote'] && !$ignore_config)
         {
            return '';
         }
      break;
   }

   $avatar_img .= $avatar;
   return '<img src="' . (str_replace(' ', '%20', $avatar_img)) . '" width="' . $avatar_width . '" height="' . $avatar_height . '" alt="' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';
}

?>
cheollyeon
New member
New member
Posts: 3
Joined: 05 Dec 2011, 11:26

Re: 2 Column Forum Layout

Post by cheollyeon »

There are still bugs :/ help pls..
Miriam
New member
New member
Posts: 2
Joined: 01 Jan 2012, 00:02

Re: 2 Column Forum Layout

Post by Miriam »

Hello all,

one of our community members found that snippet useful, but did not make it work properly on phpBB 3.0.9.
In the meantime we found a solution for these issues that this code caused to phpBB3.

Here comes one possible solution:
in index.php
FIND:

Code: Select all

define('IN_PHPBB', true);  

AFTER ADD:

Code: Select all

define('ON_INDEX', true);  


in /includes/functions_display.php
FIND:

Code: Select all

            $last_catless = $catless;
        }      

AFTER ADD:

Code: Select all

        //
        // Start category based loops
        // Credits to Noxwizard of phpBB.com for this code
        //

        //Sort forums by category

        $cat_array = array();
        foreach($forum_rows as $forum)
        {
            if (defined('ON_INDEX'))
            {
            if (($forum['forum_type'] == FORUM_CAT) AND ($forum['parent_id'] == 0))
               {
                  $cat_array[$forum['forum_id']] = $forum;
               }
            else
               {
                  $id = $forum['parent_id'];
                  @$cat_array[$id]['children'][@count(@$cat_array[$id]['children'])] = $forum;
               }
            }
            else
            {
            if (($forum['forum_type'] == FORUM_CAT) AND ($forum['parent_id'] > 0))
               {
                  $cat_array[$forum['forum_id']] = $forum;
               }
            else
               {
                  $id = $forum['parent_id'];
                  @$cat_array[$id]['children'][@count(@$cat_array[$id]['children'])] = $forum;
               }
            }
        }

        //Loop through the categories
        foreach($cat_array as $cat)
        {
            if (isset($cat['forum_id']))
            {
                $template->assign_block_vars('catrow', array(
                   'FORUM_ID'         => $cat['forum_id'],
                   'FORUM_NAME'         => $cat['forum_name'],
                   'FORUM_DESC'         => generate_text_for_display($cat['forum_desc'], $cat['forum_desc_uid'], $cat['forum_desc_bitfield'], $cat['forum_desc_options']),
                   'FORUM_FOLDER_IMG'            => '',
                   'FORUM_FOLDER_IMG_SRC'   => '',
                   'FORUM_IMAGE'         => ($cat['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']) . '"><img src="' . $phpbb_root_path . $cat['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" /></a>' : '',
                   'FORUM_IMAGE_SRC'      => ($cat['forum_image']) ? $phpbb_root_path . $cat['forum_image'] : '',
                   'CHILDREN_COUNT'      => count($cat['children']),
                   'U_VIEWFORUM'         => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $cat['forum_id']))
                );
            }
            else
            {
                $template->assign_block_vars('catrow', array(
                   'CHILDREN_COUNT'      => count($cat['children']))
                );
            }
         

           //Forums under category
           foreach($cat['children'] as $row)
           {
              $visible_forums++;
              $forum_id = $row['forum_id'];
             
              $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;

              $folder_image = $folder_alt = $l_subforums = '';
              $subforums_list = array();

              // Generate list of subforums if we need to
              if (isset($subforums[$forum_id]))
              {
                 foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
                 {
                    $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;

                    if ($subforum_row['display'] && $subforum_row['name'])
                    {
                       $subforums_list[] = array(
                          'link'      => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
                          'name'      => $subforum_row['name'],
                          'unread'      => $subforum_unread,
                       );
                    }
                    else
                    {
                       unset($subforums[$forum_id][$subforum_id]);
                    }

                    // If one subforum is unread the forum gets unread too...
                    if ($subforum_unread)
                    {
                       $forum_unread = true;
                    }
                 }

                 $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
                 $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
              }
              else
              {
                 switch ($row['forum_type'])
                 {
                    case FORUM_POST:
                       $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
                    break;

                    case FORUM_LINK:
                       $folder_image = 'forum_link';
                    break;
                 }
              }

              // Which folder should we display?
              if ($row['forum_status'] == ITEM_LOCKED)
              {
                 $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
                 $folder_alt = 'FORUM_LOCKED';
              }
              else
              {
                 $folder_alt = ($forum_unread) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
              }
             
              // Create last post link information, if appropriate
              if ($row['forum_last_post_id'])
              {
                 $last_post_subject = $row['forum_last_post_subject'];
                 $last_post_time = $user->format_date($row['forum_last_post_time']);
                 $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'];
              }
              else
              {
                 $last_post_subject = $last_post_time = $last_post_url = '';
              }

              // Output moderator listing ... if applicable

              $l_moderator = $moderators_list = '';
              if ($display_moderators && !empty($forum_moderators[$forum_id]))
              {
                 $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
                 $moderators_list = implode(', ', $forum_moderators[$forum_id]);
              }

              $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
              $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] && FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';

              $s_subforums_list = array();

              foreach ($subforums_list as $subforum)
              {
                 $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '">' . $subforum['name'] . '</a>';
              }
              $s_subforums_list = (string) implode(', ', $s_subforums_list);

              if ($row['forum_type'] != FORUM_LINK)
              {
                 $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
              }
              else
              {
                 // If the forum is a link and we count redirects we need to visit it
                 // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
                 if (($row['forum_flags'] && FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
                 {
                    $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
                 }
                 else
                 {
                    $u_viewforum = $row['forum_link'];
                 }
                       }

              $template->assign_block_vars('catrow.forumrow', array(
                 'S_IS_LINK'         => ($row['forum_type'] == FORUM_LINK) ? true : false,
                 'S_UNREAD_FORUM'      => $forum_unread,
                 'S_LOCKED_FORUM'      => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
                 'S_SUBFORUMS'         => (sizeof($subforums_list)) ? true : false,

                 'FORUM_ID'         => $row['forum_id'],
                 'FORUM_NAME'         => $row['forum_name'],
                 'FORUM_DESC'         => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),

                 'TOPICS'            => $row['forum_topics'],
                 $l_post_click_count         => $post_click_count,
                 
                 'FORUM_FOLDER_IMG'      => $user->img($folder_image, $folder_alt),
                 
                 'FORUM_FOLDER_IMG_SRC'   => $user->img($folder_image, $folder_alt, false, '', 'src'),

                 'FORUM_IMAGE'         => ($row['forum_image']) ? '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) . '"><img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" /></a>' : '',
                 'FORUM_IMAGE_SRC'      => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',

                 'LAST_POST_SUBJECT'      => censor_text($last_post_subject),
                 'LAST_POST_TIME'      => $last_post_time,
                 'LAST_POSTER'         => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
                 'LAST_POSTER_COLOUR'      => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
                 'LAST_POSTER_FULL'      => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),

                 'MODERATORS'         => $moderators_list,
                 'SUBFORUMS'         => $s_subforums_list,

                 'L_SUBFORUM_STR'      => $l_subforums,
                 'L_FORUM_FOLDER_ALT'      => $folder_alt,
                 'L_MODERATOR_STR'      => $l_moderator,

                 'U_VIEWFORUM'         => $u_viewforum,
                 'U_LAST_POSTER'         => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
                 'U_LAST_POST'         => $last_post_url)
              );

              // Assign subforums loop for style authors
              foreach ($subforums_list as $subforum)
              {
                 $template->assign_block_vars('forumrow.subforum', array(
                    'U_SUBFORUM'      => $subforum['link'],
                    'SUBFORUM_NAME'   => $subforum['name'],
                    'S_UNREAD'      => $subforum['unread'])
                 );
              }
           }
        }
        //
        // End category based loops
        //


Change the template files as described.
User avatar
tumba25
Supporter
Supporter
Posts: 1052
Joined: 24 Oct 2007, 13:10
Real name: Jari Kanerva
Location: Kokkola, Finland.
Contact:

Re: 2 Column Forum Layout

Post by tumba25 »

Thanks for the fix Miriam.
stickygreen
New member
New member
Posts: 2
Joined: 28 Oct 2008, 02:55

Re: 2 Column Forum Layout

Post by stickygreen »

I have this working but have one problem. It's not showing the subforums on the forum list.

When I revert back to my standard forumlist they are there. It has something to do with catrow maybe?

Any suggestions?
Miriam
New member
New member
Posts: 2
Joined: 01 Jan 2012, 00:02

Re: 2 Column Forum Layout

Post by Miriam »

Did you change the template files as well?
stickygreen
New member
New member
Posts: 2
Joined: 28 Oct 2008, 02:55

Re: 2 Column Forum Layout

Post by stickygreen »

Yes.

Like I said. Everything works perfectly but the subforums aren't listed under each forum.
Neculai Anișor
Supporter
Supporter
Posts: 150
Joined: 11 Jan 2013, 17:01
Location: Liverpool, UK

Re: 2 Column Forum Layout

Post by Neculai Anișor »

Can be done for a specific category only?
User avatar
tumba25
Supporter
Supporter
Posts: 1052
Joined: 24 Oct 2007, 13:10
Real name: Jari Kanerva
Location: Kokkola, Finland.
Contact:

Re: 2 Column Forum Layout

Post by tumba25 »

Yes, but it would require some coding. With all phpBB 3.0 MODs being converted to 3.1 Extensions I don't think anybody has any free time for it now.
Neculai Anișor
Supporter
Supporter
Posts: 150
Joined: 11 Jan 2013, 17:01
Location: Liverpool, UK

Re: 2 Column Forum Layout

Post by Neculai Anișor »

Damn.
I see ... thanks anyway.
Post Reply