Community management insight at ManagingCommunities.com

Bookmark and Share

Dynamic Sites With phpBB

Dynamic Sites With phpBB

Postby AJ Quick » December 5th 2002, 9:04 pm

In this tutorial, I will show you how to make your whole site more dynamic, by including the phpBB login to work all all the pages of your site. This tutorial will hopefully help increase your knowledge of PHP, and mySQL. With some very simple, and easy modifications, which I include here, you can easily add Birthday Announcements, Users Online, Private Messages, and Recent Discussion to any page of your site. You can also use the PHPbb login information with other custom DB forms on your site. Expanding your site into an extremely dynamic community.

This tutorial will use many hacks from http://www.phpbbhacks.com - some were greatly changed by me and others. I will try my best to give credit to those who wrote the code or came up with the idea.

1. Userdata Accessing

In order to use the phpBB login on all the pages of your site, you will need to add the correct code to the headers of all of your non-phpbb pages. I hope you used something easy like making a 'top.php' header you included in all the pages, or else you've got a lot of code to insert on every page. I will explain all the code, then have all the code you need later, so don't worry about copying it now.

First part to add, define in phpBB. This was a security measure added in version 2.0.0 of the software, added to stop people from hacking into your forums and in this case, even yourself.

Code: Select all
define('IN_PHPBB', true); 


Now, you will need to include the files phpBB uses. This should be fairly simple, and easy to do, all you need to change are the absolute paths to your files.

Code: Select all
$site_root_path = '/web/etc/you'; //<-- Modify
$phpbb_root_path2 = '/phpbb2/'; //<-- Modify
$phpbb_root_path = $site_root_path . $phpbb_root_path2;
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.php'); 
include($phpbb_root_path . 'config.php'); 


Next, you will need to add the user management code, this actually does all the important work. It grabs the userdata from the database for the person if they are logged in. It also will define all the phpBB variables you will end up using for the parts of your site.

Code: Select all
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 


Well, that should be all you need to really actually make users accessible to your site. The very simple code can actually do pretty much all you would want to do, but in the next sections, I will show you how to go the extra mile. Here is the full code for this section:

Code: Select all
define('IN_PHPBB', true); 

$site_root_path = '/web/etc/you/'; //<-- Modify
$phpbb_root_path2 = '/phpbb2/'; //<-- Modify
$phpbb_root_path = $site_root_path . $phpbb_root_path2;
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.php'); 

$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata);


2. Who Is Online?

One of the things most people will want to add to their site is a list showing who is online. This one will be very complex to modify to your liking, so it is recommended that if you want to change it, you be very skilled in PHP. This hack is copied straight from the phpBB coding and looks like it does on your forum. It is available in hack form by Acid at the link here: http://www.phpbbhacks.com/viewhack.php?id=201. Since it is so long, I won't be explaining what it does.

Code: Select all
$user_forum_sql = ( !empty($forum_id) ) ? "AND ( u.user_session_page = $forum_id 
OR s.session_page = $forum_id)" : ""; 

$sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_ip 
FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s 
WHERE u.user_id = s.session_user_id 
AND ( s.session_time >= ".( time() - 300 ) . " 
OR u.user_session_time >= " . ( time() - 300 ) . " ) 
$user_forum_sql 
ORDER BY u.username ASC"; 
$result = $db->sql_query($sql); 
if(!$result) 
{ 
message_die(GENERAL_ERROR, "Couldn't obtain user/online information.", "", __LINE__, __FILE__, $sql); 
} 

$userlist_ary = array(); 
$userlist_visible = array(); 

$logged_visible_online = 0; 
$logged_hidden_online = 0; 
$guests_online = 0; 
$online_userlist = ""; 

$prev_user_id = 0; 
$prev_session_ip = 0; 

while( $row = $db->sql_fetchrow($result) ) 
{ 
// User is logged in and therefor not a guest 
if( $row['session_logged_in'] ) 
{ 
// Skip multiple sessions for one user 
if( $row['user_id'] != $prev_user_id ) 
{ 
$style_color = ""; 
if( $row['user_level'] == ADMIN ) 
{ 
$row['username'] = '<b>' . $row['username'] . '</b>'; 
$style_color = 'style="color:#' . $theme['fontcolor3'] . '"'; 
} 
else if( $row['user_level'] == MOD ) 
{ 
$row['username'] = '<b>' . $row['username'] . '</b>'; 
$style_color = 'style="color:#' . $theme['fontcolor2'] . '"'; 
} 

if( $row['user_allow_viewonline'] ) 
{ 
$user_online_link = '<a href="' . append_sid($phpbb_root_path2."profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'>' . $row['username'] . '</a>'; 
$logged_visible_online++; 
} 
else 
{ 
$user_online_link = '<a href="' . append_sid($phpbb_root_path."profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'><i>' . $row['username'] . '</i></a>'; 
$logged_hidden_online++; 
} 

if( $row['user_allow_viewonline'] || $userdata['user_level'] == ADMIN ) 
{ 
$online_userlist .= ( $online_userlist != "" ) ? ", " . $user_online_link : $user_online_link; 
} 
} 
} 
else 
{ 
if( $row['session_ip'] != $prev_session_ip ){
$guests_online++; 
} 
} 

$prev_user_id = $row['user_id']; 
$prev_session_ip = $row['session_ip']; 
} 

if( empty($online_userlist) ) 
{ 
$online_userlist = $lang['None']; 
} 
$online_userlist = ( ( isset($forum_id) ) ? $lang['Browsing_forum'] : $lang['Registered_users'] ) . " " . $online_userlist; 

$total_online_users = $logged_visible_online + $logged_hidden_online + $guests_online; 

if($total_online_users > $board_config['record_online_users']) 
{ 
$sql = "UPDATE " . CONFIG_TABLE . " 
SET config_value = '$total_online_users' 
WHERE config_name = 'record_online_users'"; 
if( !$result = $db->sql_query($sql) ) 
{ 
message_die(GENERAL_ERROR, "Couldn't update online user record (nr of users)", "", __LINE__, __FILE__, $sql); 
} 

$sql = "UPDATE " . CONFIG_TABLE . " 
SET config_value = '" . time() . "' 
WHERE config_name = 'record_online_date'"; 
if( !$result = $db->sql_query($sql) ) 
{ 
message_die(GENERAL_ERROR, "Couldn't update online user record (date)", "", __LINE__, __FILE__, $sql); 
} 

$board_config['record_online_users'] = $total_online_users; 
$board_config['record_online_date'] = time(); 
} 

if( $total_online_users == 0 ) 
{ 
$l_t_user_s = $lang['Online_users_zero_total']; 
} 
else if( $total_online_users == 1 ) 
{ 
$l_t_user_s = $lang['Online_user_total']; 
} 
else 
{ 
$l_t_user_s = $lang['Online_users_total']; 
} 

if( $logged_visible_online == 0 ) 
{ 
$l_r_user_s = $lang['Reg_users_zero_total']; 
} 
else if( $logged_visible_online == 1 ) 
{ 
$l_r_user_s = $lang['Reg_user_total']; 
} 
else 
{ 
$l_r_user_s = $lang['Reg_users_total']; 
} 

if( $logged_hidden_online == 0 ) 
{ 
$l_h_user_s = $lang['Hidden_users_zero_total']; 
} 
else if( $logged_hidden_online == 1 ) 
{ 
$l_h_user_s = $lang['Hidden_user_total']; 
} 
else 
{ 
$l_h_user_s = $lang['Hidden_users_total']; 
} 

if( $guests_online == 0 ) 
{ 
$l_g_user_s = $lang['Guest_users_zero_total']; 
} 
else if( $guests_online == 1 ) 
{ 
$l_g_user_s = $lang['Guest_user_total']; 
} 
else 
{ 
$l_g_user_s = $lang['Guest_users_total']; 
} 

$l_online_users = sprintf($l_t_user_s, $total_online_users); 
$l_online_users .= sprintf($l_r_user_s, $logged_visible_online); 
$l_online_users .= sprintf($l_h_user_s, $logged_hidden_online); 
$l_online_users .= sprintf($l_g_user_s, $guests_online); 

$onlinet="$l_online_users<br>$online_userlist<br>";


Now, in order to use what it just generated, echo the variable $onlinet in the page, and it will generate all the data. If you wish to change the way the data is displayed, you will need to modify the code above. Start at the top, as a lot of parts are used towards the bottom, where you want to customize.

3. Extending Private Messaging Capabilities

This was a hack I had not seen done on any sites I've visited. So I decided to add it to my site, and create the hack in return. This will actually check and see if you have any new private messages and pop-up a box if the user has it set to do so. I have written this as a hack available here: http://www.phpbbhacks.com/viewhack.php?id=710. The first part of the code is required and will be used lots of places from now on. It checks if the user is logged in.

Code: Select all
if($userdata['session_logged_in']){ //logged in


Don't forget to close that later on after the hack is finished. I'll remind you. This next part does all the money, it starts by looking and seeing if you have any new messages and if not, it won't do anything. But if you do it will start checking and seeing if you do. Then it will update the table so it doesn't have to tell you twice.

Code: Select all
if ( $userdata['user_new_privmsg'] ) //private messages by AJ Quick
{
$l_message_new = ( $userdata['user_new_privmsg'] == 1 ) ? $lang['New_pm'] : $lang['New_pms']; 
$l_privmsgs_text = sprintf($l_message_new, $userdata['user_new_privmsg']); 

if ( $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] )
{
$sql = "UPDATE " . USERS_TABLE . "
SET user_last_privmsg = " . $userdata['user_lastvisit'] . " 
WHERE user_id = " . $userdata['user_id'];
if ( !$db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not update private message new/read time for user', '', __LINE__, __FILE__, $sql);
}

$s_privmsg_new = 1;
$icon_pm = $images['pm_new_msg'];
}
else
{
$s_privmsg_new = 0;
$icon_pm = $images['pm_no_new_msg'];
}


That part basically does the checking if you have a new message, and updates it so you don't get told more than once. The next piece of code you must use will enter in the variables of text so you can show later on what the status of the PMs are.

Code: Select all
}
else
{
$l_privmsgs_text = $lang['No_new_pm'];

$s_privmsg_new = 0;
$icon_pm = $images['pm_no_new_msg'];
}

if ( $userdata['user_unread_privmsg'] )
{
$l_message_unread = ( $userdata['user_unread_privmsg'] == 1 ) ? $lang['Unread_pm'] : $lang['Unread_pms']; 
$l_privmsgs_text_unread = sprintf($l_message_unread, $userdata['user_unread_privmsg']); 
}
else
{
$l_privmsgs_text_unread = $lang['No_unread_pm'];
}


Now, close that user logged in bracket. It is important or else no one will be able to do anything else on your site with out being logged in.

Code: Select all
} // if user logged in


In order to out put the data as text, you will want to add this line of code somewhere in your site where you want it displayed:

Code: Select all
<a href="<?php echo $phpbb_root_path2 ?>privmsg.php?folder=inbox"><?php echo $l_privmsgs_text ?></a>


Simple, eh? This next part is to add the capabilites of the new PM Popup's when a new one arrives. You will need to add this code in your site's HTML head tags. It should be fine as it is:

Code: Select all
<?php
if ( !empty($userdata['user_popup_pm']) ){
?>
<script language="Javascript" type="text/javascript">
<!--
if (<?php echo $s_privmsg_new ?>)
{
window.open('<?php echo $phpbb_root_path2 ."privmsg.".$phpEx."?mode=newpm" ?>', '_phpbbprivmsg', 'HEIGHT=225,resizable=yes,WIDTH=400');;
}
//-->
</script>
<?php
}
?> 


4. Extending Birthday Announcments

This is written to add the Birthday announcements to the rest of your site, so it doesn't only pop-up on your forum. This will only work with the Birthday hack installed. See here for the hack by Niels Chr: http://www.phpbbhacks.com/viewhack.php?id=187 If you don't have this installed, skip this step, although, I highly recommend taking the time and installing the birthdays hack.

Ok! So you've got the great birthday hack installed on your board? Well now, why not make the announcement pop-up on the main page, or any other page instead of just your forums? I don't see a reason why not, this is a very simple change like the Private Message one above it. Start with making sure the user is logged in:

Code: Select all
if($userdata['session_logged_in']){ //logged in


This should all go around the same place as the Private Message hack, you can even use the same if user is logged in code if you want. This code is straight from the hack, and doesn't need any changing.

Code: Select all
// see if user has or have had birthday, also see if greeting are enabled 
$year=create_date('Y', time(), $board_config['default_timezone']);
if ($userdata['user_birthday']!=999999 && $board_config['birthday_greeting'] && create_date('Ymd', time(), $board_config['default_timezone']) >= $userdata['user_next_birthday_greeting'].realdate ('md',$userdata['user_birthday'])) 
{ 
$sql = "UPDATE " . USERS_TABLE . " 
SET user_next_birthday_greeting = " . ($year+1) . " 
WHERE user_id = " . $userdata['user_id']; 
if( !$status = $db->sql_query($sql) ) 
{ 
message_die(GENERAL_ERROR, "Could not update next_birthday_greeting for user.", "", __LINE__, __FILE__, $sql); 
} 
$db->sql_freeresult($status);
$greeting_flag=1; 
} else $greeting_flag=0;//Sorry user shall not have a greeting this year


Now close your if user logged in bracket.

Code: Select all
}//user logged in


You will want to add this part, as it is the most important part - ok they are all equally important. But, this makes the window pop-up if it is their birthday. Here is the code, add it under the private message pop-up in the HTML head tags.

Code: Select all
<?php
if(date('Y') == $userdata['user_next_birthday_greeting']){
?>
<script language="Javascript" type="text/javascript"> 
<!-- 
var greeting_flag = <?php echo $greeting_flag ?>; 

if( greeting_flag ) 
{ 
window.open('<?php echo $phpbb_root_path2 ?>privmsg.php?mode=birthday', '_phpbbprivmsg', 'HEIGHT=225,resizable=yes,WIDTH=400'); 
} 
//--> 
</script> 
<?php
}


5. Logged In Information

This should be the final step in making the site work really nicely. It will display to the user if they are logged in, and will display other pertinent information. This is all up to you and can go anywhere in the HTML you want. I won't really even give an example, because it is all a prefrence of choice.

Basically, the first thing you need to do is check if the user is logged in.

Code: Select all
<?php
if($userdata['session_logged_in']){
?>


Then, just type that the user is logged in, in some friendly manner. Like: "Welcome To Site Name", "You Are Logged In!", "Welcome Back"... etc. It would then be good to tell them who they are logged in as. This code is very simple as well and is:

Code: Select all
<?php echo $userdata[username] ?>


You can then add things like links to the profile and the logout and other features you may have for your site. I recommend a link to their own profile and to logout at the very least. The correct ways to do each of these is:

Code: Select all
<a href="<?php echo $phpbb_root_path2 ?>profile.php?mode=editprofile">Profile</a>
<a href="<?php echo $phpbb_root_path2 ?>login.php?logout=true">Logout</a>


You can now close out the if user is logged in function that we opened up at the start. Don't be done right now, you will still want to give the users a way to log-in into your site, and even register. Start with the else function, then place links to the places you want the un-logged-in people to go. Then close the "else" tag.

Code: Select all
<?php
}else{
?>

<a href="<?php echo $phpbb_root_path2 ?>login.php">Login</a>
<a href="<?php echo $phpbb_root_path2 ?>profile.php?mode=register">Register</a> 

<?php
}
?>


6. Final Code & Conclusion

Here is a text file of all the code that was used in this tutorial, it is literally cut and paste with some minor alterations. Please go through it and check all the parts as there are places that need to be changed for you.

There you go! That should be all you need for this tutorial, now your phpBB portal is open to your imagination. Thank you for reading and have fun!
AJ Quick - Support Team Member
Dynamic Sites with phpBB Tutorial - Be Sure to Read My Tutorial!
AJ Quick.com - More phpBB related mods, and tutorials..
Auto Vendors Network - Find aftermarket autoparts for the best prices.
User avatar
AJ Quick
Well Known User
 
Posts: 155
Joined: July 23rd 2002, 2:20 pm
Location: Minnetonka, MN

Return to phpBB 2: Integrating phpBB With Your Website

Who is online

Users browsing this forum: No registered users and 0 guests