Topic: [Extension release] 1.3 Final - Active Topics list on Index
*huff* About darn time this extension made it out of the shop. A much needed add-on for forums that need an attention-grabber.
I have no idea about performance implications, as it was a pain-in-the-arse enough just getting the stupid thing working! The design of this forum is very unconductive to adding or rearranging page elements, as I had to make this work without editing any of the existing stylesheet. Seeing as though, thanks to the genius that decided to inject CSS into every aspect of PunBB, the whole page layout is constructed in CSS, all I could really do is recycle and abuse other existing CSS classes and hope it doesn't break.
Seriously: fixed-defining the positions of elements to "fake" a table out of a list element is doin it rong. Very "rong".
Anyway, on with the show.
Create a new folder in your extensions folder, call it "active_topics". Save the following code as "manifest.xml":
<?xml version="1.0" encoding="utf-8"?>
<extension engine="1.0">
<id>active_topics</id>
<title>Active Topics List on Index</title>
<version>1.2</version>
<description>This will add the x most recent posts to the index page of the forum for easy navigation and attention-grabbing.</description>
<author>Slavok and FalconFour</author>
<minversion>1.3</minversion>
<maxtestedon>1.3</maxtestedon>
<install>
<![CDATA[
]]>
</install>
<uninstall>
<![CDATA[
]]>
</uninstall>
<hooks>
<hook id="in_main_output_start"><![CDATA[
$topics_count = 5;
$query_active_topics= array(
'SELECT' => 't.id AS tid, t.poster, t.subject, t.posted AS has_posted, t.last_post, t.last_post_id, t.num_replies, t.num_views, t.closed, t.sticky, t.forum_id, t.last_poster',
'FROM' => 'topics AS t',
'JOINS' => array(
array(
'INNER JOIN' => 'forums AS f',
'ON' => 'f.id=t.forum_id'
),
array(
'LEFT JOIN' => 'forum_perms AS fp',
'ON' => '(fp.forum_id=f.id AND fp.group_id='.$forum_user['g_id'].')'
)
),
'WHERE' => '(fp.read_forum IS NULL OR fp.read_forum=1)',
'ORDER BY' => 't.last_post DESC',
'LIMIT' => $topics_count
);
$result_active = $forum_db->query_build($query_active_topics) or error(__FILE__, __LINE__);
if ($forum_db->num_rows($result_active) == 0) {
?>
<div class="main-content main-message">
<p>There are no active topics.</p>
</div>
<?php
} else {
require_once FORUM_ROOT.'lang/'.$forum_user['language'].'/forum.php';
?>
<div class="main-subhead">
<p class="item-summary">
<span>
<strong class="subject-title"><?php echo $lang_index['Topics']; ?></strong>
<strong class="info-replies"><?php echo $lang_forum['Replies']; ?></strong>
<strong class="info-views"><?php echo $lang_forum['Views']; ?></strong>
<strong class="info-lastpost"><?php echo $lang_index['last post']; ?></strong>
</span>
</p>
</div>
<div class="main-content main-forum">
<?php
$item_num = 1;
while ($cur_set = $forum_db->fetch_assoc($result_active))
{
// Start from scratch
$item_subject = $item_body = $item_status = $item_nav = $item_title = array();
$item_indicator = '';
if (!empty($item_nav))
$item_title['nav'] = '<span class="item-nav">'.sprintf($lang_forum['Topic navigation'], implode('  ', $item_nav)).'</span>';
if ($cur_set['sticky'] == '1')
{
$item_subject_status['sticky'] = $lang_forum['Sticky'];
$item_status['sticky'] = 'sticky';
}
if ($cur_set['closed'] != '0')
{
$item_subject_status['closed'] = $lang_forum['Closed'];
$item_status['closed'] = 'closed';
}
if (!empty($item_subject_status))
$item_title['status'] = '<span class="item-status">'.sprintf($lang_forum['Item status'], implode(' ', $item_subject_status)).'</span>';
$item_title['link'] = '<a href="'.forum_link($forum_url['post'], $cur_set['last_post_id']).'">'.forum_htmlencode($cur_set['subject']).'</a>';
if (!$forum_user['is_guest'] && $forum_config['o_show_dot'] == '1' && $cur_set['has_posted'] > 0)
{
$item_title['posted'] = '<span class="posted-mark">'.$lang_forum['You posted indicator'].'</span>';
$item_status['posted'] = 'posted';
}
$item_body['subject']['title'] = '<h3 class="hn"><span class="item-num">'.forum_number_format(++$item_num).'</span> '.implode(' ', $item_title).'</h3> <em> by '.forum_htmlencode($cur_set['poster']).'</em>';
// Does this topic contain posts we haven't read? If so, tag it accordingly.
if (!$forum_user['is_guest'] && $cur_set['last_post'] > $forum_user['last_visit'] && (!isset($tracked_topics['topics'][$cur_set['tid']]) || $tracked_topics['topics'][$cur_set['tid']] < $cur_set['last_post']) && (!isset($tracked_topics['forums'][$cur_set['forum_id']]) || $tracked_topics['forums'][$cur_set['forum_id']] < $cur_set['last_post']))
{
$item_status['new'] = 'new';
}
$item_body['subject']['desc'] = implode(' ', $item_subject);
if (empty($item_status))
$item_status['normal'] = 'normal';
$item_style = (($item_num % 2 != 0) ? ' odd' : ' even').(($item_num == 1) ? ' main-first-item' : '').((!empty($item_status)) ? ' '.implode(' ', $item_status) : '');
$item_body['info']['replies'] = '<li class="info-replies"><strong>'.forum_number_format($cur_set['num_replies']).'</strong> <span class="label">'.(($cur_set['num_replies'] == 1) ? $lang_forum['Reply'] : $lang_forum['Replies']).'</span></li>';
$item_body['info']['views'] = '<li class="info-replies"><strong>'.forum_number_format($cur_set['num_views']).'</strong> <span class="label">'.(($cur_set['num_views'] == 1) ? $lang_forum['View'] : $lang_forum['Views']).'</span></li>';
$item_body['info']['last_post'] = '<li class="info-lastpost"><span class="label">'.$lang_index['Last post'].'</span> <strong><a href="'.forum_link($forum_url['post'], $cur_set['last_post_id']).'">'.format_time($cur_set['last_post']).'</a></strong> <cite>'.sprintf($lang_index['Last poster'], forum_htmlencode($cur_set['last_poster'])).'</cite></li>';
?>
<div class="main-item<?php echo $item_style ?>">
<span class="icon <?php echo implode(' ', $item_status) ?>"><!-- --></span>
<div class="item-subject">
<?php echo implode("\n\t\t\t\t", $item_body['subject'])."\n" ?>
</div>
<ul class="item-info">
<?php echo implode("\n\t\t\t\t", $item_body['info'])."\n" ?>
</ul>
</div>
<?php
}
}
]]></hook>
</hooks>
</extension>
Change $topics_count = 5 in the first line of the hook script, to however many topics you want to show in the list.
Go to your extensions page, and hit install.
Enjoy!
Now, time for me to lay off the CSS for a while before my mind melts out my ears.
Version history:
1.0 - First version (unreleased)
1.1 - Made "new posts" indicator work properly
1.2 - Fixed the "item status" (closed, sticky) indicators appear properly. Made the list respect permissions, which is kinda important if you have an active moderator forum