Go Back   vb.org Archive > vBulletin 4 Discussion > vB4 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 04-16-2010, 10:04 AM
Citizen Bleys Citizen Bleys is offline
 
Join Date: Feb 2003
Location: Moncton, NB
Posts: 8
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Parsing BBCodes on an external page

Originally taken up in a borrowed thread

Basics: I want to write a script that copies the text of threads from my news forum to my front site. I've hand-coded a mostly-working script from scratch, but I have no idea how to parse BBCodes, so any multiline news posts or posts that contain BBCodes show up as a giant mishmash on the front site.

My front site is in / and the forums are in /forums/, so I have to chdir() into forums and back whenever I want to call any vBulletin functionality. Having searched the forums, I've seen code that looks like this:

PHP Code:
require_once(DIR '/includes/class_bbcode.php');

$bbcode_parser =& new vB_BbCodeParser($vbulletinfetch_tag_list());

$text "[color=red]some text with tags[/color]";
$html $bbcode_parser->parse($text); 
(example lifted directly from the other thread)

Problem is, it doesn't work.

The other thread in the vB3 forum solved most of the initial issues I had, so I'll leave them out, but now I'm running into some dependency problems. I'm not all that familiar with the internal workings of vBulletin--for that matter, OOP in general is not my forte--so I don't know what classes/methods/functions are where.

Here's my current code:

PHP Code:
/* Save the old version */
 //echo "<p>".$news_threads[$counter]["postbody"]."</p>";
/**/

//attempting to do it with bbcode parser
// global $vbulletin;  // declared in index.php
chdir('forums');
//require_once('./global.php');
//require_once('./includes/init.php');  //uncommenting this line changes nothing
require_once('./includes/class_bbcode.php');
$bbcode_parser = new vB_BbCodeParser($vbulletinfetch_tag_list());  // I don't understand this line at all, just copied it from the forums
// next 2 lines currently commented out, which is how I determined where the problem lies, but they should work
$parsedNews $bbcode_parser->do_parse($news_threads[$counter]["postbody"]);
echo 
"<p>$parsedNews</p>";

chdir('..');
//end attempt to do it with bbcode parser 
$news_threads[$counter]["postbody"] is a vanilla associative array containing the text of the first post of each thread in the news forum exactly as entered by the user, complete with all BBCodes and whitespace. I didn't use any vBulletin code to pull the data from the db, it's all handcoded, but it works -- it just doesn't display right as HTML because the whitespace is ignored and BBCodes aren't parsed.

With that code in the while loop, I get the following error:

Code:
Fatal error: Call to a member function query_read_slave() on a non-object in /(elided)/forums/includes/class_bbcode.php on line 220
The error (and the body of the post) disappears if I comment out the line instantiating the new vB_BbcodeParser.

If it matters, the basic structure of my frontsite is as follows

frontconfig.php: contains global variables for my code -- nothing relating to vBulletin
index.php: Shell HTML page containing the CSS and basic table structure -- a vanilla site with a sidebar containing links and a main page body containing news posts
sidebar.php: Links, inserted into index.php with an include() statement
main.php: contains some static HTML and my news script.

/forums/global.php is include()d at the top of index.php; since main.php is called only from within index.php, it should always include global.php. There's also a "global vbulletin;" statement in index.php which should likewise be inherited into main.
Reply With Quote
  #2  
Old 04-16-2010, 03:30 PM
Dylanblitz Dylanblitz is offline
 
Join Date: Oct 2005
Location: OC, California
Posts: 732
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You should reread Marco's post in the other thread you posted in. You need to chdir before you include the forum files.

From your script and what you said it looks like you require the global higher up before you chdir to the forum.
Reply With Quote
  #3  
Old 04-16-2010, 06:04 PM
NickyDee NickyDee is offline
 
Join Date: Aug 2008
Posts: 53
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You might find it easier to do this whole thing with an RSS feed grabber or if you have access to it the CMS.

I've personally found chdir to be so irritatingly incosistent when working with vBulletin that I just moved my files top level files into the /Forum/ folder and then just set my top-level .htaccess to show /Forum/filename.php as the main page.
Reply With Quote
  #4  
Old 04-16-2010, 09:47 PM
Citizen Bleys Citizen Bleys is offline
 
Join Date: Feb 2003
Location: Moncton, NB
Posts: 8
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Dylanblitz View Post
You should reread Marco's post in the other thread you posted in. You need to chdir before you include the forum files.

From your script and what you said it looks like you require the global higher up before you chdir to the forum.
I did chdir into the forums directory before including the forum files--it's actually the first non-commented-out line in the script I posted. Calling global is the first line in the script, it can't be called any earlier than that

Quote:
Originally Posted by NickyDee View Post
You might find it easier to do this whole thing with an RSS feed grabber or if you have access to it the CMS.

I've personally found chdir to be so irritatingly incosistent when working with vBulletin that I just moved my files top level files into the /Forum/ folder and then just set my top-level .htaccess to show /Forum/filename.php as the main page.
I don't know what the CMS is, let alone have access to it, nor how to use an RSS feed grabber. However, the whole purpose for getting a vBulletin, for me, was to write scripts to interact with it, for educational purposes. That's why I didn't just download a "portal" designed to interact with vBulletin.
Reply With Quote
  #5  
Old 04-18-2010, 05:02 AM
Citizen Bleys Citizen Bleys is offline
 
Join Date: Feb 2003
Location: Moncton, NB
Posts: 8
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Update: I tried to play with this in a separate script that does nothing but parse, hoping to encapsulate it in a function and call it in my main script.

This works (full script)

PHP Code:
<?php
chdir
('forums');
include(
'global.php');
require_once(
'includes/class_bbcode.php');
chdir('..');

global 
$text;
global 
$parser;

$text '[b][i]text[/i][/b]';

$parser = new vB_BbCodeParser($vbulletinfetch_tag_list());
$text $parser->parse($text);

echo 
$text;
?>
So far so good...problem is, this does not:

PHP Code:
<?php
chdir
('forums');
include(
'global.php');
require_once(
'includes/class_bbcode.php');
chdir('..');

global 
$text;
global 
$parser;

$text '[b][i]text[/i][/b]';

function 
parseMe() {
$parser = new vB_BbCodeParser($vbulletinfetch_tag_list());
$text $parser->parse($text);
}

parseMe();
echo 
$text;
?>
I get the same thing as if I try to change the prototype to parseMe($text) and include a return($text) statement, and whether or not I use global variables

The output is:

Code:
Fatal error: Call to a member function query_read_slave() on a non-object in /(elided)/forums/includes/class_bbcode.php on line 220
as usual.

Since it works unencapsulated, I think this has just become a pure PHP question instead of vBulletin-specific, let alone version specific.
Reply With Quote
  #6  
Old 04-18-2010, 06:26 AM
Dylanblitz Dylanblitz is offline
 
Join Date: Oct 2005
Location: OC, California
Posts: 732
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Citizen Bleys View Post
I did chdir into the forums directory before including the forum files--it's actually the first non-commented-out line in the script I posted. Calling global is the first line in the script, it can't be called any earlier than that
You said that you include the global before on the main index page before this one is included. It wont work that way, the global.php file includes other files by relative path so if you're not in the forum directory when you include it, it wont work right. Unless the index file changes to the forum directory as well?


Also, with your function on the following post, it is not quite right, there are a few things wrong. You need to set vbulletin as global in the function, you're not returning the text and you are not passing the variable into the function to be parsed.

PHP Code:
function parseMe($parse_var) {
global 
$vbulletin;
$parser = new vB_BbCodeParser($vbulletinfetch_tag_list());
$parsed_text $parser->parse($parse_var);
return 
$parsed_text;
}

$text parseMe($text);
echo 
$text
Reply With Quote
  #7  
Old 04-18-2010, 07:12 AM
Citizen Bleys Citizen Bleys is offline
 
Join Date: Feb 2003
Location: Moncton, NB
Posts: 8
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Now we're getting somewhere! OK, the standalone test works; I couldn't get it working in my main page so I started doing some trial and error. I wrote the parseMe() function at the very top of index.php right after calling global.php. It tested OK everywhere in index.php up until I called main.php. Just to be sure, I called parseMe() right before include('main.php') and it worked, but it failed right after.

I started moving down main.php until I found the code causing the failure:

PHP Code:
include('frontconfig.php'); // contains db name, username, password, etc.

echo parseMe("[b]Hello![/b]"); // works here

if (!($db mysql_connect($db_host,$db_user,$db_password))) {
 echo 
"<p>\$db_host is $db_host</p>";
 echo 
"<p>\$db_user is $db_user</p>";
 exit(
"MySQL database connection failed!");
}

echo 
parseMe("[b]Hello![/b]"); // fails here with same reference to read_query_slave() 
This makes no sense at all...I didn't even do anything with the db, just opened a connection and made sure it didn't fail.

EDIT: More "This makes no sense" -- I tried switching to MySQLi instead and commented out the whole if statement above.

This, placed directly below the above (commented out) code fails:

PHP Code:
$db mysqli_connect($db_host,$db_user,$db_password,$db_name)
 or die (
"MySQL failed to connect!");

echo 
parseMe("[b]Hello![/b]"); 
THIS, however, works

PHP Code:
$throwaway parseMe("[b]Hello![/b]");  // This variable is never again referenced ANYWHERE.  It has the same impact on the code as a comment.
// but fails if it's commented out.

$db mysqli_connect($db_host,$db_user,$db_password,$db_name)
 or die (
"MySQL failed to connect!");

echo 
parseMe("[b]Hello![/b]"); 
The new error from commenting out the do-nothing line is:

Code:
Fatal error: Call to undefined method mysqli::query_read_slave() in /homepages/32/d89350510/htdocs/forums/includes/class_bbcode.php on line 220
Same line, same file, different error.

I eventually got my script working BUT I sure would like to know why I have to call a function for no reason in the middle of my script

EDIT: Spoke too soon -- as soon as I use a Quote tag in any of my posts, the frontsite script crashes with this error:

Code:
Fatal error: Call to undefined method mysqli::query_read_slave() in /homepages/32/d89350510/htdocs/forums/includes/functions.php on line 3912
same thing occurred with the code and php tags...I'm not sure what these bbcodes have in common what makes them blow up the front site but everything else works fine
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 08:51 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03904 seconds
  • Memory Usage 2,264KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (4)bbcode_code
  • (8)bbcode_php
  • (3)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (7)post_thanks_box
  • (7)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (7)post_thanks_postbit_info
  • (7)postbit
  • (7)postbit_onlinestatus
  • (7)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete