1

Topic: [Release?] Extern.php News Extension

Hi, I just installed PunBB today and I'm going to be using it to build a community website. I just finished part one of the development phase, which was to use a forum in PunBB to be able to post news from. I looked around at some of the current solutions and found none of them to be "just right" for what I wanted to do.

This first release currently:
* Automatically pulls news from 1 or more forums
* Allows you to limit the number of articles pulled
* Allows you to select how to order them (last commented on or date posted)
* Displays the number of comments and (expanded) views each news item has had.
* Allows you to summarise the message body, only displaying the first paragraph of each post.
* Allows the concept of HEADLINES: latest/top news item has message text and full news details, the rest are just headlines.

Files modified: extern.php

In EXTERN.PHP

Copy and paste this to the bottom of the file BEFORE

else
    exit('Bad request');

##############################

//
// Use this to display 'news' - the recent topics from a specific forum
// expanded to include the first post text, posters, comments, etc.
//

else if ($_GET['action'] == 'news')
{
    $order_by = ($_GET['action'] == 'active') ? 't.last_post' : 't.posted';
    $forum_sql = '';

    // Get the forum id(s) you'd like to post news from
    if (isset($_GET['fid']) && $_GET['fid'] != '')
    {
        $fids = explode(',', trim($_GET['fid']));
        $fids = array_map('intval', $fids);

        if (!empty($fids))
            $forum_sql = ' AND f.id IN('.implode(',', $fids).')';
    }

    // RSS support not implemented, if anyone wants to do it, feel free..
    if (isset($_GET['type']) && strtoupper($_GET['type']) == 'RSS')
    {    
    }
    // Regular HTML output
    else
    {
        $show = isset($_GET['show']) ? intval($_GET['show']) : $show_default_topics;
        if ($show < 1 || $show > $show_max_topics)
            $show = $show_default_topics;        

        $result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.num_replies, t.num_views, f.id AS fid, f.forum_name FROM '.$db_prefix.'topics AS t INNER JOIN '.$db_prefix.'forums AS f ON t.forum_id=f.id WHERE t.moved_to IS NULL '.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT '.$show.' ') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
        $show_count = 0;

        if(!$db->num_rows($result))
        {
            echo "No news to display";
        }
        else
        {

            while ( ($show_count < $show) && ($cur_topic = $db->fetch_assoc($result)) ) 
            {
                echo "<div class=newsblock>";
                $temp = '';
                if ($pun_config['o_censoring'] == '1')
                    $cur_topic['subject'] = censor_words($cur_topic['subject']);
                if (pun_strlen($cur_topic['subject']) > $max_subject_length)
                    $subject_truncated = trim(substr($cur_topic['subject'], 0, ($max_subject_length-5))).' ...';
                else
                    $subject_truncated = $cur_topic['subject'];

                // Simplify frequently required display information
                $thisdate = date('l, d F Y', $cur_topic['posted']);
                $poster = $cur_topic['poster'];
                $comments = $cur_topic['num_replies'];
                $views = $cur_topic['num_views'];

                // If using headlines, then after first item only show headlines...
                if(isset($_GET['headlines']) && $show_count > 0)
                {
                    echo "<p class=\"newsheadline\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a> ($comments)</p> \n";
                }
                else
                {
                    // DISPLAY FOR TITLE OF NEWS
                    echo "<p class=\"newstitle\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a></p> \n";

                    $id = $cur_topic['id'];
                    $msg = $db->query('SELECT id, poster, poster_id, poster_ip, poster_email, message, posted, edited, edited_by FROM '.$db_prefix.'posts WHERE topic_id='.$id.' LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
                    if ( !$db->num_rows($msg) ) continue;

                    $cur_post = $db->fetch_assoc($msg);
                    $posterid = $cur_post['poster_id'];    

                    // DISPLAY FOR "Posted on DATE by POSTER"
                    echo "<p class=\"newsdetails\">Posted on $thisdate by <a href=".$pun_config['o_base_url']."/profile.php?id=$posterid>$poster</a></p> \n";

                    $truncate = isset($_GET['summary']) ? 1 : 0;
                    if ($truncate == 1)
                    {
                        $paragraph = preg_split("/\s*\n+/", $cur_post['message']);
                        if (isset($paragraph[1])) 
                        {
                            $cur_post['message'] = $paragraph[0] . "...";
                        }
                    }

                    $message = parse_message($cur_post['message'], 0);            
                    echo "<p class=\"newstext\">$message";
                    if ($truncate == 1) { echo "<p><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">Read More...</a></p>"; }
                    echo "</p> \n";

                    echo "<p class=\"newsextra\">Comments(<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$comments</a>) | Views (<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$views</a>) </p> \n";                
                }
                echo "</div>"; // end newsblock div
                $show_count++;
            }
        }
    }
}

THEN

Find the following code:
######################
define('PUN_ROOT', './');
@include PUN_ROOT.'config.php';

Add this line afterwards:
#######################
require PUN_ROOT.'include/parser.php';

FINALLY:

Find the following code:
########################
// The length at which topic subjects will be truncated (for HTML output)
$max_subject_length = 30;

Add the following code:
########################
// If you exceed max number of allowed topics, how many to display?
$show_default_topics = 10;

HOW TO USE IT
######################

Using PHP includes:(default sorting order is by date posted)

include('http://www.yourhost.com/forums/extern.php?action=news')
This displays the latest $show_default_topics (default value: 10) topics posted in your messageboard as news items.

include('http://www.yourhost.com/forums/extern.php?action=news&fid=1,4,5')
Displays the latest $show_default_topics topics posted in forums 1,4 and 5 as news items.

include('http://www.yourhost.com/forums/extern.php?action=news&fid=1,4,5&summary=yes')
Displays the latest $show_default_topics topics posted in forums 1,4 and 5 as news items. Summarises the news text so that only the first paragraph is shown with a "Read More..." link replacing the rest.

Example: http://www.mesaverde.co.uk/forums/example.php

include('http://www.yourhost.com/forums/extern.php?action=news&fid=1,4,5&summary=yes&show=5')
Displays the latest 5 topics posted in forums 1,4 and 5 as news items. Summarises the news text so that only the first paragraph is shown with a "Read More..." link replacing the rest.

include('http://www.yourhost.com/forums/extern.php?action=news&fid=1,4,5&summary=yes&show=5&headlines=yes')
Fully displays the first news item from forums 1,4 and 5, summarising the text. The other news items (4) are shown as headlines.

Example; http://www.mesaverde.co.uk/forums/example2.php

THE PRESENTATION

<div id=newsblock>
    <p class=newstitle> Subject Title </p>
    <p class=newsdetails> Posted on DATE by POSTER</p>
    <p class=newstext> Message Text </p>
    <p class=newsextra> Comments(# of comments) | Views (# of views) </p>
</div>
<div id=newsblock>
    <p class=newstitle> Subject Title (# of comments) </p>
    ...
</div>

OR:
<div id=newsblock>
    <p class=newstitle> Subject Title </p>
    <p class=newsdetails> Posted on DATE by POSTER</p>
    <p class=newstext> Message Text </p>
    <p class=newsextra> Comments(# of comments) | Views (# of views) </p>
</div>
<div id=newsblock>
    <p class=newstitle> Subject Title (# of comments) </p>
</div>
...

This was mostly based on the tutorial at http://nupusi.net/punbb:tutorials:miniportal except it is not a function and has some added bits here and there. The fact that it is in extern.php almost makes it much easier to use (imo).

If you try it and get it working or run into problems, please let me know. Also if anyone has ideas to improve it or sees stupid mistakes, etc. then go ahead and fix it!

Thanks,
David

Re: [Release?] Extern.php News Extension

the reason the mini portal does not just edit extern.php and include it is lots of people have problems including html via php because of their hosting settings, anyway good work might be worth adding to the punres wiki smile

3

Re: [Release?] Extern.php News Extension

Very nice, wiki material for sure.

4 (edited by XuMiX 2005-05-19 19:41)

Re: [Release?] Extern.php News Extension

if anybody wants, i can put this kind of news somewhere.
without comments displayed
with comments displayed
this is a little modified Connorhd's miniportal mod

Re: [Release?] Extern.php News Extension

Connorhd wrote:

the reason the mini portal does not just edit extern.php and include it is lots of people have problems including html via php because of their hosting settings, anyway good work might be worth adding to the punres wiki smile

yeh thats my problem the ads follow the include ._.

6

Re: [Release?] Extern.php News Extension

Connorhd wrote:

the reason the mini portal does not just edit extern.php and include it is lots of people have problems including html via php because of their hosting settings, anyway good work might be worth adding to the punres wiki smile

Ah, I see. Actually, I have this problem in my local editting environment.. what setting is it that causes this?

Re: [Release?] Extern.php News Extension

one of the php.ini ones i dunno i've never set it

Re: [Release?] Extern.php News Extension

Hi this is EXACTLY [almost!] what I have been looking for.
I wanted an easy cms that had clean code, that didn't require me to create a site around it (ie template the cms output), that I could just insert the bits I wanted however I wanted (in my case just the heading and description).
I also wanted the comments system to tie into punbb (user db etc).
Basically an article post/display/edit/comment sytem tied into punbb.

So this is perfect [ish]!

But!

I need a way so that any contributer can create an article but it has to be checked and 'published' by an editor before it becomes live and pushes the top news story off the page.

Preferably I would want to do this elegantly without having to, say, move by hand an article from a 'to be checked' forum to a 'live' forum.
Which is why I'm here smile

Also is there way I can grab specific topic titles, tack on a witty description and publish them to the frontpage?

Thanks again for this extension you are a life saver.

Re: [Release?] Extern.php News Extension

A small modification of this script to make it parse the smiley codes, which it did not do before (not for me anyway).  I am sure someone can come up with something better, but this works (once more, for me anyway).

Find

$message = parse_message($cur_post['message'], 0);            
                    echo "<p class=\"newstext\">$message";

and replace it with

// parse BBCode, smilies and HTML
                       $cur_post['message'] = parse_message($cur_post['message'], 0);
                    if ($pun_config['o_smilies'] == '1')
                    $message = do_smilies($cur_post['message']);
                    
     
                    echo str_replace("img/smilies", "forum/img/smilies", "<p class=\"newstext\">$message");

Replace the "forum" part of the "forum/img/smilies" to reflect whatever you named your forum root folder.  This should make smilies parse correctly.

10

Re: [Release?] Extern.php News Extension

Very good !!!! smile top the would be to add the avatar (in my case, I would like to use this extension for my editos, and we are several to post)

Re: [Release?] Extern.php News Extension

Ask and thou shalt receive.  This worked for me, so it should work for you.

Find

(If using the default version, without the smilies modification from me)

$message = parse_message($cur_post['message'], 0);            
                    echo "<p class=\"newstext\">$message";

else find

// parse BBCode, smilies and HTML
                       $cur_post['message'] = parse_message($cur_post['message'], 0);
                    if ($pun_config['o_smilies'] == '1')
                    $message = do_smilies($cur_post['message']);

Place after

if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif'))
                    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg'))
                    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png'))
                    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" '.$img_size[3].' alt="" />';

To put the avatar into the news post, put $user_avatar anywhere you want.  BE SURE to use

echo str_replace("img/avatars", "forum/img/avatars", "wherever you put the avatar, like in the smilies mod a post or two up");

to fix where the script tries to call the avatars directory, once more replacing "forum" with whatever you named your punBB root directory.

12

Re: [Release?] Extern.php News Extension

Dumb I am ... but is it possible to have SIMPLY a modified externnews.php to Copy / Paste with all the present features inside this thread ? smile

Re: [Release?] Extern.php News Extension

Well, it is slightly modified from the versions I posted, to make it easier to edit some things.

<?php
/***********************************************************************

  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)

  This file is part of PunBB.

  PunBB is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published
  by the Free Software Foundation; either version 2 of the License,
  or (at your option) any later version.

  PunBB is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  MA  02111-1307  USA

************************************************************************


  INSTRUCTIONS

  This script is used to include information about your board from
  pages outside the forums and to syndicate news about recent
  discussions via RSS. The script can display a list of recent
  discussions (sorted by post time or last post time), a list of
  active users or a collection of general board statistics. The
  script can be called directly via an URL (for RSS), from a PHP
  include command or through the use of Server Side Includes (SSI).

  The scripts behaviour is controlled via variables supplied in the
  URL to the script. The different variables are: action (what to
  output), show (how many topics to display), fid (the ID or ID's of
  the forum(s) to poll for topics), nfid (the ID or ID's of forums
  that should be excluded) and type (output as HTML or RSS). The
  only mandatory variable is action. Possible/default values are:

    action: active (show most recently active topics) (HTML or RSS)
            new (show newest topics) (HTML or RSS)
            online (show users online) (HTML)
            online_full (as above, but includes a full list) (HTML)
            stats (show board statistics) (HTML)

    show:   Any integer value between 1 and 50. This variables is
            ignored for RSS output. The default is 15.

    fid:    One or more forum ID's (comma-separated). If ignored,
            topics from all guest-readable forums will be polled.

    nfid:   One or more forum ID's (comma-separated) that are to be
            excluded. E.g. the ID of a a test forum.

    type:   RSS. Anything else means HTML output.

  Here are some examples using PHP include().

    Show the 15 most recently active topics from all forums:
    include('http://host.com/forums/extern.php?action=active');

    Show the 10 newest topics from forums with ID 5, 6 and 7:
    include('http://host.com/forums/extern.php?action=new&show=10&fid=5,6,7');

    Show users online:
    include('http://host.com/forums/extern.php?action=online');

    Show users online with full listing of users:
    include('http://host.com/forums/extern.php?action=online_full');

    Show board statistics:
    include('http://host.com/forums/extern.php?action=stats');

  Here are some examples using SSI.

    Show the 5 newest topics from forums with ID 11 and 22:
    <!--#include virtual="forums/extern.php?action=new&show=5&fid=11,22" -->

    Show board statistics:
    <!--#include virtual="forums/extern.php?action=stats" -->

  And finally some examples using extern.php to output an RSS 0.91
  feed.

    Output the 15 most recently active topics:
    http://host.com/extern.php?action=active&type=RSS

    Output the 15 newest topics from forum with ID=2:
    http://host.com/extern.php?action=active&type=RSS&fid=2

  Below you will find some variables you can edit to tailor the
  scripts behaviour to your needs.


/***********************************************************************/

// The maximum number of topics that will be displayed
$show_max_topics = 60;

// The length at which topic subjects will be truncated (for HTML output)
$max_subject_length = 30;

// If you exceed max number of allowed topics, how many to display?
$show_default_topics = 10;

// Define the location of your punBB install
$forums = "forum";

/***********************************************************************/

// DO NOT EDIT ANYTHING BELOW THIS LINE! (unless you know what you are doing)


define('PUN_ROOT', './');
@include PUN_ROOT.'config.php';
require PUN_ROOT.'include/parser.php';

// If PUN isn't defined, config.php is missing or corrupt
if (!defined('PUN'))
    exit('The file \'config.php\' doesn\'t exist or is corrupt. Please run install.php to install PunBB first.');


// Make sure PHP reports all errors except E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);

// Turn off magic_quotes_runtime
set_magic_quotes_runtime(0);


// Load the functions script
require PUN_ROOT.'include/functions.php';

// Load DB abstraction layer and try to connect
require PUN_ROOT.'include/dblayer/common_db.php';

// Load cached config
@include PUN_ROOT.'cache/cache_config.php';
if (!defined('PUN_CONFIG_LOADED'))
{
    require PUN_ROOT.'include/cache.php';
    generate_config_cache();
    require PUN_ROOT.'cache/cache_config.php';
}

// Make sure we (guests) have permission to read the forums
$result = $db->query('SELECT g_read_board FROM '.$db->prefix.'groups WHERE g_id=3') or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
if ($db->result($result) == '0')
    exit('No permission');


// Attempt to load the common language file
@include PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/common.php';
if (!isset($lang_common))
    exit('There is no valid language pack \''.$pun_config['o_default_lang'].'\' installed. Please reinstall a language of that name.');

if (!isset($_GET['action']))
    exit('No parameters supplied. See extern.php for instructions.');


//
// Converts the CDATA end sequence ]]> into ]]>
//
function escape_cdata($str)
{
    return str_replace(']]>', ']]>', $str);
}


//
// Show recent discussions
//
if ($_GET['action'] == 'active' || $_GET['action'] == 'new')
{
    $order_by = ($_GET['action'] == 'active') ? 't.last_post' : 't.posted';
    $forum_sql = '';

    // Was any specific forum ID's supplied?
    if (isset($_GET['fid']) && $_GET['fid'] != '')
    {
        $fids = explode(',', trim($_GET['fid']));
        $fids = array_map('intval', $fids);

        if (!empty($fids))
            $forum_sql = ' AND f.id IN('.implode(',', $fids).')';
    }

    // Any forum ID's to exclude?
    if (isset($_GET['nfid']) && $_GET['nfid'] != '')
    {
        $nfids = explode(',', trim($_GET['nfid']));
        $nfids = array_map('intval', $nfids);

        if (!empty($nfids))
            $forum_sql = ' AND f.id NOT IN('.implode(',', $nfids).')';
    }

    // Should we output this as RSS?
    if (isset($_GET['type']) && strtoupper($_GET['type']) == 'RSS')
    {
        $rss_description = ($_GET['action'] == 'active') ? $lang_common['RSS Desc Active'] : $lang_common['RSS Desc New'];
        $url_action = ($_GET['action'] == 'active') ? '&action=new' : '';

        // Send XML/no cache headers
        header('Content-Type: text/xml');
        header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');

        // It's time for some syndication!
        echo '<?xml version="1.0" encoding="'.$lang_common['lang_encoding'].'"?>'."\r\n";
        echo '<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">'."\r\n";
        echo '<rss version="0.91">'."\r\n";
        echo '<channel>'."\r\n";
        echo "\t".'<title>'.pun_htmlspecialchars($pun_config['o_board_title']).'</title>'."\r\n";
        echo "\t".'<link>'.$pun_config['o_base_url'].'/</link>'."\r\n";
        echo "\t".'<description>'.pun_htmlspecialchars($rss_description.' '.$pun_config['o_board_title']).'</description>'."\r\n";
        echo "\t".'<language>en-us</language>'."\r\n";

        // Fetch 15 topics
        $result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, f.id AS fid, f.forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL'.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT 15') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());

        while ($cur_topic = $db->fetch_assoc($result))
        {
            if ($pun_config['o_censoring'] == '1')
                $cur_topic['subject'] = censor_words($cur_topic['subject']);

            echo "\t".'<item>'."\r\n";
            echo "\t\t".'<title>'.pun_htmlspecialchars($cur_topic['subject']).'</title>'."\r\n";
            echo "\t\t".'<link>'.$pun_config['o_base_url'].'/viewtopic.php?id='.$cur_topic['id'].$url_action.'</link>'."\r\n";
            echo "\t\t".'<description><![CDATA['.escape_cdata($lang_common['Forum'].': <a href="'.$pun_config['o_base_url'].'/viewforum.php?id='.$cur_topic['fid'].'">'.$cur_topic['forum_name'].'</a><br />'."\r\n".$lang_common['Author'].': '.$cur_topic['poster'].'<br />'."\r\n".$lang_common['Posted'].': '.date('r', $cur_topic['posted']).'<br />'."\r\n".$lang_common['Last post'].': '.date('r', $cur_topic['last_post'])).']]></description>'."\r\n";
            echo "\t".'</item>'."\r\n";
        }

        echo '</channel>'."\r\n";
        echo '</rss>';
    }


    // Output regular HTML
    else
    {
        $show = isset($_GET['show']) ? intval($_GET['show']) : 15;
        if ($show < 1 || $show > 50)
            $show = 15;

        // Fetch $show topics
        $result = $db->query('SELECT t.id, t.subject FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL'.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT '.$show) or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());

        while ($cur_topic = $db->fetch_assoc($result))
        {
            if ($pun_config['o_censoring'] == '1')
                $cur_topic['subject'] = censor_words($cur_topic['subject']);

            if (pun_strlen($cur_topic['subject']) > $max_subject_length)
                $subject_truncated = pun_htmlspecialchars(trim(substr($cur_topic['subject'], 0, ($max_subject_length-5)))).' …';
            else
                $subject_truncated = pun_htmlspecialchars($cur_topic['subject']);

            echo '<li><a href="'.$pun_config['o_base_url'].'/viewtopic.php?id='.$cur_topic['id'].'&action=new" title="'.pun_htmlspecialchars($cur_topic['subject']).'">'.$subject_truncated.'</a></li>'."\n";
        }
    }

    return;
}


//
// Show users online
//
else if ($_GET['action'] == 'online' || $_GET['action'] == 'online_full')
{
    // Load the index.php language file
    require PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/index.php';
    
    // Fetch users online info and generate strings for output
    $num_guests = $num_users = 0;
    $users = array();
    $result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());

    while ($pun_user_online = $db->fetch_assoc($result))
    {
        if ($pun_user_online['user_id'] > 1)
        {
            $users[] = '<a href="'.$pun_config['o_base_url'].'/profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
            ++$num_users;
        }
        else
            ++$num_guests;
    }

    echo $lang_index['Guests online'].': '.$num_guests.'<br />';

    if ($_GET['action'] == 'online_full')
        echo $lang_index['Users online'].': '.implode(', ', $users).'<br />';
    else
        echo $lang_index['Users online'].': '.$num_users.'<br />';

    return;
}


//
// Show board statistics
//
else if ($_GET['action'] == 'stats')
{
    // Load the index.php language file
    require PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/index.php';

    // Collect some statistics from the database
    $result = $db->query('SELECT COUNT(id)-1 FROM '.$db->prefix.'users') or error('Unable to fetch total user count', __FILE__, __LINE__, $db->error());
    $stats['total_users'] = $db->result($result);

    $result = $db->query('SELECT id, username FROM '.$db->prefix.'users ORDER BY registered DESC LIMIT 1') or error('Unable to fetch newest registered user', __FILE__, __LINE__, $db->error());
    $stats['last_user'] = $db->fetch_assoc($result);

    $result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());
    list($stats['total_topics'], $stats['total_posts']) = $db->fetch_row($result);

    echo $lang_index['No of users'].': '.$stats['total_users'].'<br />';
    echo $lang_index['Newest user'].': <a href="'.$pun_config['o_base_url'].'/profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a><br />';
    echo $lang_index['No of topics'].': '.$stats['total_topics'].'<br />';
    echo $lang_index['No of posts'].': '.$stats['total_posts'];

    return;
}

//
// Use this to display 'news' - the recent topics from a specific forum
// expanded to include the first post text, posters, comments, etc.
//

else if ($_GET['action'] == 'news')
{
    $order_by = ($_GET['action'] == 'active') ? 't.last_post' : 't.posted';
    $forum_sql = '';

    // Get the forum id(s) you'd like to post news from
    if (isset($_GET['fid']) && $_GET['fid'] != '')
    {
        $fids = explode(',', trim($_GET['fid']));
        $fids = array_map('intval', $fids);

        if (!empty($fids))
            $forum_sql = ' AND f.id IN('.implode(',', $fids).')';
    }

    // RSS support not implemented, if anyone wants to do it, feel free..
    if (isset($_GET['type']) && strtoupper($_GET['type']) == 'RSS')
    {    
    }
    // Regular HTML output
    else
    {
        $show = isset($_GET['show']) ? intval($_GET['show']) : $show_default_topics;
        if ($show < 1 || $show > $show_max_topics)
            $show = $show_default_topics;        

        $result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.num_replies, t.num_views, f.id AS fid, f.forum_name FROM '.$db_prefix.'topics AS t INNER JOIN '.$db_prefix.'forums AS f ON t.forum_id=f.id WHERE t.moved_to IS NULL '.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT '.$show.' ') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
        $show_count = 0;

        if(!$db->num_rows($result))
        {
            echo "No news to display";
        }
        else
        {

            while ( ($show_count < $show) && ($cur_topic = $db->fetch_assoc($result)) ) 
            {
                echo "<div class=newsblock>";
                $temp = '';
                if ($pun_config['o_censoring'] == '1')
                    $cur_topic['subject'] = censor_words($cur_topic['subject']);
                if (pun_strlen($cur_topic['subject']) > $max_subject_length)
                    $subject_truncated = trim(substr($cur_topic['subject'], 0, ($max_subject_length-5))).' ...';
                else
                    $subject_truncated = $cur_topic['subject'];
                    
                // Call Avatars Code
                    if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" '.$img_size[3].' alt="" />';

                // Simplify frequently required display information
                $thisdate = date('l, d F Y', $cur_topic['posted']);
                $poster = $cur_topic['poster'];
                $comments = $cur_topic['num_replies'];
                $views = $cur_topic['num_views'];

                // If using headlines, then after first item only show headlines...
                if(isset($_GET['headlines']) && $show_count > 0)
                {
                    echo "<p class=\"newsheadline\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a> ($comments)</p> \n";
                }
                else
                {
                    // DISPLAY FOR TITLE OF NEWS
                    echo "<p class=\"newstitle\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a></p> \n";

                    $id = $cur_topic['id'];
                    $msg = $db->query('SELECT id, poster, poster_id, poster_ip, poster_email, message, posted, edited, edited_by FROM '.$db_prefix.'posts WHERE topic_id='.$id.' LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
                    if ( !$db->num_rows($msg) ) continue;

                    $cur_post = $db->fetch_assoc($msg);
                    $posterid = $cur_post['poster_id'];    

                    // DISPLAY FOR "Posted on DATE by POSTER"
                    echo "<p class=\"newsdetails\">Posted on $thisdate by <a href=".$pun_config['o_base_url']."/profile.php?id=$posterid>$poster</a> $user_avatar</p> \n";

                    $truncate = isset($_GET['summary']) ? 1 : 0;
                    if ($truncate == 1)
                    {
                        $paragraph = preg_split("/\s*\n+/", $cur_post['message']);
                        if (isset($paragraph[1])) 
                        {
                            $cur_post['message'] = $paragraph[0] . "...";
                        }
                    }

                    // parse BBCode, smilies and HTML
                    $cur_post['message'] = parse_message($cur_post['message'], 0);
                    if ($pun_config['o_smilies'] == '1')
                    $message = do_smilies($cur_post['message']);        
     
                    echo str_replace("img/smilies", "$forums/img/smilies", "<p class=\"newstext\">$message");
                    if ($truncate == 1) { echo "<p><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">Read More...</a></p>"; }
                    echo "</p> \n";

                    echo "<p class=\"newsextra\">Comments(<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$comments</a>) | Views (<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$views</a>) </p> \n";                
                }
                echo "</div>"; // end newsblock div
                $show_count++;
            }
        }
    }
}

else
    exit('Bad request');

Entire extern.php modified with news mod, smilies mod and avatars mod.  Currently, the avatars are placed right after the poster's name in the Posted By: area.  Remove $user_avatar and place it wherever you want to move it around.

Now, the first thing you should do is change the $forums definition to the name of your punBB root install folder name.  It is currently set as "forum".  The code to change it is placed near the top, easy to find.

14

Re: [Release?] Extern.php News Extension

This is fabulous, thanks!

15

Re: [Release?] Extern.php News Extension

Little problem for me about avatars
http://www.sortons.net/edito.php

Re: [Release?] Extern.php News Extension

This is exactly what I've been looking for, thanks!

Is Rickard's "News Generator" plugin for a different use? Or does it do something similar?

Parimal Satyal - Powermetal from Nepal

17

Re: [Release?] Extern.php News Extension

In action (all the site is not finished, and some thing have been changed inside core : too many div / p kill the simplicity of the xhtml layout smile)

http://www.sortons.net/new_index.htm

18 (edited by livatlantis 2005-10-15 15:55)

Re: [Release?] Extern.php News Extension

I followed the instructions in the initial post, and I got an error:

Parse error: parse error, unexpected ';' in /home/atlantis/public_html/forum/extern.php on line 339

Line 339 is:

    if (isset($_GET['fid']) && $_GET['fid'] != '')

Could someone please make an extern.php with the News Extension mod already in. I don't want the smileys and avatar features.

Thanks

Parimal Satyal - Powermetal from Nepal

Re: [Release?] Extern.php News Extension

this worked nice for me. i used

//
// Use this to display 'news' - the recent topics from a specific forum
// expanded to include the first post text, posters, comments, etc.
//

else if ($_GET['action'] == 'news')
{
    $order_by = ($_GET['action'] == 'active') ? 't.last_post' : 't.posted';
    $forum_sql = '';

    // Get the forum id(s) you'd like to post news from
    if (isset($_GET['fid']) && $_GET['fid'] != '')
    {
        $fids = explode(',', trim($_GET['fid']));
        $fids = array_map('intval', $fids);

        if (!empty($fids))
            $forum_sql = ' AND f.id IN('.implode(',', $fids).')';
    }

    // RSS support not implemented, if anyone wants to do it, feel free..
    if (isset($_GET['type']) && strtoupper($_GET['type']) == 'RSS')
    {    
    }
    // Regular HTML output
    else
    {
        $show = isset($_GET['show']) ? intval($_GET['show']) : $show_default_topics;
        if ($show < 1 || $show > $show_max_topics)
            $show = $show_default_topics;        

        $result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.num_replies, t.num_views, f.id AS fid, f.forum_name FROM '.$db_prefix.'topics AS t INNER JOIN '.$db_prefix.'forums AS f ON t.forum_id=f.id WHERE t.moved_to IS NULL '.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT '.$show.' ') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
        $show_count = 0;

        if(!$db->num_rows($result))
        {
            echo "No news to display";
        }
        else
        {

            while ( ($show_count < $show) && ($cur_topic = $db->fetch_assoc($result)) ) 
            {
                echo "<div class=newsblock>";
                $temp = '';
                if ($pun_config['o_censoring'] == '1')
                    $cur_topic['subject'] = censor_words($cur_topic['subject']);
                if (pun_strlen($cur_topic['subject']) > $max_subject_length)
                    $subject_truncated = trim(substr($cur_topic['subject'], 0, ($max_subject_length-5))).' ...';
                else
                    $subject_truncated = $cur_topic['subject'];
                    
                // Call Avatars Code
                    if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" '.$img_size[3].' alt="" />';
                    else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png'))
                    $user_avatar = '<img src="$forums/'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" '.$img_size[3].' alt="" />';

                // Simplify frequently required display information
                $thisdate = date('l, d F Y', $cur_topic['posted']);
                $poster = $cur_topic['poster'];
                $comments = $cur_topic['num_replies'];
                $views = $cur_topic['num_views'];

                // If using headlines, then after first item only show headlines...
                if(isset($_GET['headlines']) && $show_count > 0)
                {
                    echo "<p class=\"newsheadline\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a> ($comments)</p> \n";
                }
                else
                {
                    // DISPLAY FOR TITLE OF NEWS
                    echo "<p class=\"newstitle\"><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$subject_truncated</a></p> \n";

                    $id = $cur_topic['id'];
                    $msg = $db->query('SELECT id, poster, poster_id, poster_ip, poster_email, message, posted, edited, edited_by FROM '.$db_prefix.'posts WHERE topic_id='.$id.' LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
                    if ( !$db->num_rows($msg) ) continue;

                    $cur_post = $db->fetch_assoc($msg);
                    $posterid = $cur_post['poster_id'];    

                    // DISPLAY FOR "Posted on DATE by POSTER"
                    echo "<p class=\"newsdetails\">Posted on $thisdate by <a href=".$pun_config['o_base_url']."/profile.php?id=$posterid>$poster</a> $user_avatar</p> \n";

                    $truncate = isset($_GET['summary']) ? 1 : 0;
                    if ($truncate == 1)
                    {
                        $paragraph = preg_split("/\s*\n+/", $cur_post['message']);
                        if (isset($paragraph[1])) 
                        {
                            $cur_post['message'] = $paragraph[0] . "...";
                        }
                    }

                    // parse BBCode, smilies and HTML
                    $cur_post['message'] = parse_message($cur_post['message'], 0);
                    if ($pun_config['o_smilies'] == '1')
                    $message = do_smilies($cur_post['message']);        
     
                    echo str_replace("img/smilies", "$forums/img/smilies", "<p class=\"newstext\">$message");
                    if ($truncate == 1) { echo "<p><a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">Read More...</a></p>"; }
                    echo "</p> \n";

                    echo "<p class=\"newsextra\">Comments(<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$comments</a>) | Views (<a href=".$pun_config['o_base_url']."/viewtopic.php?id=".$cur_topic['id'].">$views</a>) </p> \n";                
                }
                echo "</div>"; // end newsblock div
                $show_count++;
            }
        }
    }
}

and did the other two things at the top

20 (edited by livatlantis 2005-10-15 11:28)

Re: [Release?] Extern.php News Extension

I feel I'm getting the placement wrong, although I know I'm putting them in the right places... weird yikes

Update: Tried again. It works! YAY! big_smile

Parimal Satyal - Powermetal from Nepal

21

Re: [Release?] Extern.php News Extension

This sort of sat doing nothing for a while and then all of a sudden people are using it! cool smile

Re: [Release?] Extern.php News Extension

I've seen a lot of posts of people wanting this feature - syndicated the posts as well. I've posted links to this page. I think it helps a lot! Thanks for a great mod!

I'll tell you once I've properly set up my website smile

Parimal Satyal - Powermetal from Nepal

Re: [Release?] Extern.php News Extension

i tried first code on punbb 1.2.7

it gave following error :

Parse error: parse error, unexpected T_ELSE in /home/college/public_html/punbb/extern.php on line 340

can sombody please upload the final version ?

Re: [Release?] Extern.php News Extension

I have a feeling you pasted it in the wrong place

25

Re: [Release?] Extern.php News Extension

This is cool and I am using it... one question... is there a way to make the headline bold and a complete listing while retaining the summarized post content?

Maybe this was addressed here but if so I missed it...