Show last 5 posts from thread x on a non-vb page (and parse BB)
by
21 Apr 2010
Note: The arcticle below is based on working with vb3.7.3 PL1 and it's fully functional there. I ought it be functional within the rest of the 3.x range, but I can't guarantee anything.
Introduction
This is the first article related to programming I've ever written, so bare with me. While looking for a proper solution myself I have noticed that a lot of people were looking on how to pull posts from a specific thread (not just forum, can use RSS for that) and show either the first x or last x posts from that thread on a non-vb page. On top of that I noticed that in the meantime, which isn't less important, that people were also struggling on how to parse BB Code at the same time. I am not a programmer or anything, but am more than willing to share my knowledge of this, after having ploughed through hundreds of posts and dozens of threads. As I know how frustrating this can be. All credits go to all that contributed through their posts in other threads in order for me to complete this piece of coding.
What is not covered?
I am going to assume that you are familiar with connecting to databases, even connecting to multiple databases and that you will familiarize yourself with the structure of your 'post' table in your forum's database. If you want information on how to connect to 2 databases within the same page, check php.net on mysql_connect() for more info on that.
What is covered?
I'll show you what files regarding the interaction with vbulletin are required for fetching the information and parsing BB Code and give you a little comparisson information on what I did with the true/false settings you can do with the parse. Right, lets get started.
Required lines of code for vbulletin interaction and parsing BB Code
PHP Code:
$curdir = getcwd ();
chdir('/path to forum');
require_once('/path to forum/global.php');
require_once('/path to forum/includes/class_bbcode.php');
$parser =& new vB_BbCodeParser($vbulletin, fetch_tag_list());
// $parsed_text = $parser->do_parse($text, $do_html, $do_smilies, $do_bbcode, $do_imgcode, $do_nl2br, $cachable);
chdir ($curdir);
What this basically does is get the interaction going with the vbulletin database and get the required information to properly parse your BB Code. As you can see I commented (//) the line with $parsed_text out, as I only use this specific line for reference later on in the script. We will get back on that later on.
Don't forget to set your path to your forum!
Setting your variables for the Query on the post table
I think the code below is obvious. Of course you can replace 'your_forum_db' and 'thread_id' with values you pull from another database, but lets keep it simple here. Also make sure your threadid exists
PHP Code:
// Set variables
$db_name = 'your_forum_db'; // for example 'forums'
$db_table = 'your_post_table'; // for example 'prefix_post'
$thread_id = 'thread_id'; // for example '6201'
Determine postcount for thread
Now we're going to make sure you get those last 5 posts and we have to set a limit for that. Now there are other way to approach this, but I am planning to keep it simple and basically this is what suits my needs.
PHP Code:
$max = "SELECT COUNT(postid) AS highest_id FROM ".$db_name.".".$db_table." WHERE threadid=".$thread_id;
$max_result = mysql_query($max);
$max_output = mysql_fetch_array($max_result);
$limit = $max_output['highest_id']-5;
So what I have done here is count the occurances of postid where the information equals a specific threadid. In other words, how many posts have already been made to this thread. In the end I set a $limit variable and deduct 5 from the postcount that was queried. This is not the query for getting the posts themselves, we will cover that in the next bit.
Getting the post information based on the limit
Now that we know the postcount on thread x, we can go on querying the post table for its contents.
PHP Code:
$query3 = "SELECT postid, username, userid , threadid, pagetext FROM ".$db_name.".".$db_table." WHERE threadid=".$thread_id." ORDER BY postid ASC LIMIT ".$limit.",5";
$result3 = mysql_query($query3);
while ($output3=mysql_fetch_array($result3))
Above I have definied 5 cellnames I found interesting to see (postid, username, userid, threadid and pagetext) from my post table and I had the data extracted from the variables I set earlier ($db_name and $db_table). The condition set was to only get the information where my variable $thread_id aplies and in the end set the $limit and show 5 records. If you properly examine it, it gets as easy as reading a comic book at one point
Parsing the BB-code and output the posts
Now it's time to get things going, parse the bb-code (and in my case also strip it of quotes) and get the information returned onto your screen.
PHP Code:
{
// Strip the text of QUOTES
$pagetext1 = strip_quotes($output3['pagetext']);
// Parse the text for BB CODE, look at line 7 for reference
$parsed_poster = $parser->do_parse($pagetext1, false, false, true, false, false, false);
$parsed_post = $parsed_poster; // Not a clue why I build in this step
// Output your 5 posts on your non-vb page
echo "<b>".$output3['username']."(".$output3['userid'].")</b><br />;".$parsed_post."<br /> (".$output3['threadid'].")<br />";
}
As you can see in the 2nd line, I stripped the quote tags and its content from my posts, as I simply don't like to show that bit, as in my opinion it clutters the page.
Next up is the actuall parsing of the BB-Code. Remember when I commented out that line at the beginning of this article?
This is why and I urge you to only use this to compare the two lines, do not add them (again):
Code:
$parsed_text = $parser->do_parse($text, $do_html, $do_smilies, $do_bbcode, $do_imgcode, $do_nl2br, $cachable);
$parsed_poster = $parser->do_parse($pagetext1, false, false, true, false, false, false);
Now, the starting variable is irrelevant to the idea behind this. What I would like to make clear with this is that you have to look at what you're doing. I noticed that people had problems with getting the parse line set up properly. But if you now compare the two, I think it becomes quite clear.
What I am basically telling the parser to do is the following
$pagetext1 (this is what I set earlier, that contains the pagetext (read: post) information)
$do_html = false (NO, do not parse HTML code --> security risk)
$do_smilies = false (NO, do not show any smilies)
$do_bbcode = true (YES, parse normal BB code for me)
$do_imgcode = false (NO, do not show images but their url instead)
$do_nl2br = false (NO, I don't want you to use linebreaks --> I use it for a comment system)
$cachable = false (NO, do not cache the contents --> Not sure of the impact but set to false)
You can probably see the $parsed_post line. I don't have any clue why I built that in anymore.. Hehe.. I think it was because I added a limit of 200 characters or something and ran into problems with quoted text (this was before I added the strip quote).
Then last but not least, the output to a browser client and we're done.
For those who don't want to pickup the bits and pieces, below the full code where everything is put together (again without code for db connection).
Full code
PHP Code:
<?
$curdir = getcwd ();
chdir('/path to forum');
require_once('/path to forum/global.php');
require_once('/path to forum/includes/class_bbcode.php');
$parser =& new vB_BbCodeParser($vbulletin, fetch_tag_list());
// $parsed_text = $parser->do_parse($text, $do_html, $do_smilies, $do_bbcode, $do_imgcode, $do_nl2br, $cachable);
chdir ($curdir);
// Set variables
$db_name = 'your_forum_db'; // for example 'forums'
$db_table = 'your_post_table'; // for example 'prefix_post'
$thread_id = 'thread_id'; // for example '6201'
echo "<p>5 latest post from thread X set to ASC</p>";
// Determine postcount on thread and deduct 5
$max = "SELECT COUNT(postid) AS highest_id FROM ".$db_name.".".$db_table." WHERE threadid=".$thread_id;
$max_result = mysql_query($max);
$max_output = mysql_fetch_array($max_result);
$limit = $max_output['highest_id']-5;
// Query the information you want
$query3 = "SELECT postid, username, userid , threadid, pagetext FROM ".$db_name.".".$db_table." WHERE threadid=".$thread_id." ORDER BY postid ASC LIMIT ".$limit.",5";
$result3 = mysql_query($query3);
while ($output3=mysql_fetch_array($result3))
{
// Strip the text of QUOTES
$pagetext1 = strip_quotes($output3['pagetext']);
// Parse the text for BB CODE, look at line 7 for reference
$parsed_poster = $parser->do_parse($pagetext1, false, false, true, false, false, false);
$parsed_post = $parsed_poster; // Not a clue why I build in this step
// Output your 5 posts on your non-vb page
echo "<b>".$output3['username']."(".$output3['userid'].")</b><br />;".$parsed_post."<br /> (".$output3['threadid'].")<br />";
}
?>
Conclusion
Well there you go, connect it to a database, get the PATH to your forum right and put it in a php file and see if it works. Hope this was useful to some people and gives a bit more insight of what is needed to fetch information from post and parse bb-code. And if anyone has suggestions, please be my guest, can only be beneficial to us all
|