Gossamer Forum
Home : Products : Gossamer Forum : Discussion :

HOWTO: Adding RSS feeds to your forum

Quote Reply
HOWTO: Adding RSS feeds to your forum
We frequently get asked about how to create RSS feeds for gforum, so here's a quick howto for adding RSS feeds to your forum:
  1. Add an rss.xml template to your default template set. Here's a sample one from our list archive:
    Code:
    <?xml version="1.0" encoding="iso-8859-1" ?><%rss_feed%><%if rss_error%>Ooops: <%rss_error%><%else%>
    <rss version="2.0">
    <channel>
    <%loop forum_loop%>
    <title><%xmlrss($cat_name)%> | <%xmlrss($forum_name)%></title>
    <description>Mailing List Archive by Gossamer Threads</description>
    <link>http://www.gossamer-threads.com/lists/<%list%>/<%lc forum_name%>/</link>
    <language>en-us</language>
    <copyright>(c) Gossamer Threads Inc. All rights reserved.</copyright>
    <lastBuildDate><%rss_current_date%></lastBuildDate>
    <ttl>120</ttl>
    <image>
    <title>Gossamer Threads | <%xmlrss($cat_name)%> | <%xmlrss($forum_name)%></title>
    <width>75</width>
    <height>23</height>
    <link>http://www.gossamer-threads.com/lists/<%list%>/<%lc forum_name%>/</link>
    <url>http://www.gossamer-threads.com/images/lists/rss_logo.jpg</url>
    </image>
    <%loop post_loop%><item>
    <title><%xmlrss($post_subject)%></title>
    <description><%xmlrss($post_summary)%></description>
    <pubDate><%post_rss_date%></pubDate>
    <link>http://www.gossamer-threads.com/lists/<%list%>/<%lc forum_name%>/<%post_id%></link>
    </item><%endloop%>
    <%endloop%>
    </channel>
    </rss><%endif%>
  2. Add the following globals:
    rss_feed:
    Code:
    sub {
    my $forum_id = $IN->param('forum_id');
    if ($forum_id !~ /^\d+$/) {
    return { rss_error => "Invalid forum id." };
    }
    my $forum_group_table = $DB->table('ForumGroup');
    if (!$forum_group_table->count(GT::SQL::Condition->new('group_id_fk','=','100','forum_perms','>=','3', 'forum_id_fk','=',$forum_id))) {
    return { rss_error => "You are not allowed to view this forum." };
    }
    my $Category = $DB->table('Category');
    my $Post = $DB->table('Post');
    my $Forum = $DB->table('Forum');
    my $count = $IN->param('count');
    $count = 10 unless ($count and $count =~ /^(5|10|15|25|50|100)$/);
    my $format = $IN->param('format') || 'topics';
    $format = 'topics' unless ($format and $format =~ /^(topics|posts)$/);

    my @forums;
    require GForum::Forum;
    require GForum::Post;
    my $forum = $Forum->select( { forum_id => $forum_id } )->fetchrow_hashref;
    if (! $forum) { return { rss_error => "Unknown forum." }; }
    $forum->{cat_id} ||= $forum->{cat_id_fk};
    GForum::Forum::normalize($forum);
    $Post->select_options('ORDER BY post_time DESC', "LIMIT $count");
    my @post_ids;
    if ($format eq 'topics') {
    @post_ids = $Post->select( 'post_id', { forum_id_fk => $forum_id, post_root_id => 0 })->fetchall_list;
    }
    else {
    # Ugh, MySQL picks the wrong index here.
    my $name = $Post->name;
    my $sth = $Post->do_query("SELECT post_id FROM $name USE INDEX (p_fmn) WHERE forum_id_fk = $forum_id ORDER BY post_time DESC LIMIT $count");
    @post_ids = $sth->fetchall_list;
    }
    next unless @post_ids;

    $Post->select_options('ORDER BY post_time DESC');
    my $posts = $Post->select( { post_id => \@post_ids } )->fetchall_hashref;

    for my $post (@$posts) {
    GForum::Post::plain_text(\$post->{post_message}, $post);
    $post->{post_summary} = substr($post->{post_message}, 0, 150);
    $post->{post_summary} =~ s/[\w\d]*$//;
    $post->{post_rss_date} = GT::Date::date_get($post->{post_time}, "%dd% %mmm% %yyyy% %HH%:%MM%:%ss% -0800");
    }
    GForum::Post::normalize($posts);
    $forum->{post_loop} = $posts;
    push @forums, $forum;

    my $cat_info = $Category->select( { cat_id => $forum->{cat_id_fk} })->fetchrow_hashref;
    my $rss_current_date = GT::Date::date_get(time, "%dd% %mmm% %yyyy% %HH%:%MM%:%ss% -0800");
    return { forum_loop => \@forums, %$cat_info, rss_current_date => $rss_current_date };
    }
    xmlrss:
    Code:
    sub {
    my $review = shift;
    $review = GT::CGI::html_escape($review);
    $review =~ s/\n/ /g;
    $review =~ s/\r/ /g;
    $review =~ s/ / /g;
    $review =~ tr/\x91\x92/'/;
    $review =~ tr/\x93\x94/"/;
    $review =~ s/\x95/&#149;/g;
    $review =~ tr/\x96/-/;
    $review =~ s/\x97/--/;
    $review =~ s/^\s+|\s+$//g;
    return $review;
    }
  3. Add a new action to give access to this page. Go to the admin => Setup => Actions => Add action => rss, with the page=rss.xml
  4. Finally, add a link on your forum to the rss feed. It will have the format: gforum.cgi?do=rss;forum_id=<%forum_id%>


Adrian

Last edited by:

brewt: Nov 22, 2007, 3:37 PM
Quote Reply
Re: [brewt] HOWTO: Adding RSS feeds to your forum In reply to
I tried it- added the action, the xml template...

Butr when I put in the global, I get blank pages for EVERYTHING in the forum....

The error log says: [Tue Nov 20 20:45:28 2007] [notice] child pid xxxxx exit signal Segmentation fault (11)
dave

Big Cartoon DataBase
Big Comic Book DataBase
Quote Reply
Re: [carfac] HOWTO: Adding RSS feeds to your forum In reply to
How did you add the globals? Using the globals editor or using a text editor editing the globals.txt file directly?

Adrian
Quote Reply
Re: [brewt] HOWTO: Adding RSS feeds to your forum In reply to
 

I used the Admin method, I did NOT edit directly. I cut and pasted directly.
dave

Big Cartoon DataBase
Big Comic Book DataBase
Quote Reply
Re: [carfac] HOWTO: Adding RSS feeds to your forum In reply to
Sorry, the globals I pasted were directly from the globals.txt file, so they weren't really suitable to be pasted into the globals editor. I've fixed the globals in my post above. Try them again.

Adrian