PDA

View Full Version : vB4: Board Statistics On All Pages


CrumbDown
12-03-2012, 06:39 AM
Hi everyone!

I want to display the board stats on all pages (in footer). I have copied the codes from the forum.php and created a new template and all is well. The only thing does not show is the Threads and Posts count, they all show "0". This is not the issue.

I can have the board stats on all pages but that means I would have to edit all the templates and the relevant php files. This would not make any sense. If I need to change a word then I would have to edit all templates again lol.

My thing is, how can I get the board stats to work in the footer template? It may not be possible because I do not see any footer.php file. Is there a work around?

OR, how to get this to work in the footer template: {vb:raw numbermembers}

Regards

kh99
12-03-2012, 11:42 AM
To get the stats to work in the footer template you could create a plugin using hook parse_templates and your code in there. You can then use vB_Template::preRegister() to register a variable to the footer template.

CrumbDown
12-03-2012, 04:32 PM
Thanks Kev!

Im a noob really, can you show me a link to read "how to"? I sure want to learn.

Thanks

kh99
12-03-2012, 04:49 PM
Well, you said you managed to find the code for the stats and use it in a new template, so it sounds like you've figured out some of it. Creating a plugin isn't hard, the instructions are in the manual (which is under "Support" on vbulletin.com). It's really just a matter of going to Plugins & Products in the admincp and clicking on "Add new Plugin" and filling in the fields.

There's an article here about templates: https://vborg.vbsupport.ru/showthread.php?t=228078.

You can check for other articles in the article forum but I don't know if there's any comprehensive "here's how to write plugins for vbulletin" article. Plugins are really just pieces of code that get executed at certain points in the vbulletin scripts, so I think it's really difficult to write one without reading the vbulletin php files and seeing what's going on, and which hook locations are useful. I have the vbulletin code on my local computer and I use an application to search across all files, so I usually recommend that (although I know it's probably not practical to non programmers or casual programmers).

As for what you're trying to do, I suggested the hook location parse_templates because I know it will be called once before the header and footer templates are rendered, so if you want to add something to either of those it's a good choice. It's in includes/class_bootstrap.php around line 430, if you want to see what's going on there. The line that calls the plugin code looks like this:

($hook = vBulletinHook::fetch_hook('parse_templates')) ? eval($hook) : false;

CrumbDown
12-04-2012, 07:14 AM
Hi Kev

Ok Ive done that but when I go to my forum, I see the footer with the stats great that the stats shows in the footer but why the footer shows as the forum itself? Meaning when I go to example.com/forum, I just see the footer.

kh99
12-04-2012, 01:06 PM
I'm not sure why that is, I'd have to know more about what you did. Are you saying you made a plugin and it caused the rest of the forum to disappear?

CrumbDown
12-04-2012, 01:24 PM
Are you saying you made a plugin and it caused the rest of the forum to disappear?
Yes.

Below shows if I want the stats to show in a custom template, example if I go to forum/footer.php. If I add {vb:raw numbermembers} into the footer template and then navigate to forum/footer.php, the stat shows.

<?php

error_reporting(E_ALL & ~E_NOTICE);
define('THIS_SCRIPT', 'index');
define('CSRF_PROTECTION', true);
define('CSRF_SKIP_LIST', '');
define('VB_ENTRY', 'footer.php');

// get special phrase groups
$phrasegroups = array('holiday');

// get special data templates from the datastore
$specialtemplates = array(
'userstats',
'birthdaycache',
'maxloggedin',
'iconcache',
'eventcache',
'mailqueue',
'activeblocks',
);

// pre-cache templates used by all actions
$globaltemplates = array(
'ad_board_after_forums',
'ad_board_below_whats_going_on',
'block_blogentries',
'block_cmsarticles',
'block_newposts',
'block_sgdiscussions',
'block_tagcloud',
'block_threads',
'block_html',
'FORUMHOME',
'forumhome_event',
'forumhome_subforums',
'forumhome_forumbit_level1_nopost',
'forumhome_forumbit_level1_post',
'forumhome_forumbit_level2_nopost',
'forumhome_forumbit_level2_post',
'forumhome_lastpostby',
'tag_cloud_link',
'footer',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

require_once('./global.php');
require_once(DIR . '/includes/functions_bigthree.php');
require_once(DIR . '/includes/functions_forumlist.php');


verify_forum_url($vbulletin->options['forumhome']);

($hook = vBulletinHook::fetch_hook('forumhome_start')) ? eval($hook) : false;

// get permissions to view forumhome
if (!($permissions['forumpermissions'] & $vbulletin->bf_ugp_forumpermissions['canview']))
{
print_no_permission();
}

$navbits = array();

if (empty($foruminfo['forumid']))
{
// show all forums
$forumid = -1;

$navbits[''] = $vbphrase['forum'];
}
else
{
// check forum permissions
$_permsgetter_ = 'index';
$forumperms = fetch_permissions($foruminfo['forumid']);

if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview']))
{
print_no_permission();
}

// check if there is a forum password and if so, ensure the user has it set
verify_forum_password($foruminfo['forumid'], $foruminfo['password']);

// draw nav bar
$navbits[fetch_seo_url('forumhome', array())] = $vbphrase['forum'];
$parentlist = array_reverse(explode(',', substr($foruminfo['parentlist'], 0, -3)));
foreach ($parentlist AS $forumID)
{
$forumTitle =& $vbulletin->forumcache["$forumID"]['title'];
$navbits[fetch_seo_url('forum', array('forumid' => $forumID, 'title' => $forumTitle))] = $forumTitle;
}

// pop the last element off the end of the $nav array so that we can show it without a link
array_pop($navbits);

$navbits[''] = $foruminfo['title'];
}

$today = vbdate('Y-m-d', TIMENOW, false, false);

$navbits = construct_navbits(array('' => 'footer'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'test page';


$birthdays = array();
$show['birthdays'] = false;
if ($vbulletin->options['showbirthdays'])
{
if (!is_array($vbulletin->birthdaycache)
OR ($today != $vbulletin->birthdaycache['day1'] AND $today != $vbulletin->birthdaycache['day2'])
OR !is_array($vbulletin->birthdaycache['users1'])
)
{
// Need to update!
require_once(DIR . '/includes/functions_databuild.php');
$birthdaystore = build_birthdays();
DEVDEBUG('Updated Birthdays');
}
else
{
$birthdaystore = $vbulletin->birthdaycache;
}

switch ($today)
{
case $birthdaystore['day1']:
$birthdaysarray = $birthdaystore['users1'];
break;

case $birthdaystore['day2']:
$birthdaysarray = $birthdaystore['users2'];
break;

default:
$birthdaysarray = array();
}
// memory saving
unset($birthdaystore);

$clc = 0;
foreach ($birthdaysarray AS $birthday)
{
$clc++;
$show['birthdays'] = true;
$birthday['comma'] = $vbphrase['comma_space'];
$birthdays[$clc] = $birthday;
}

// Last element
if ($clc)
{
$birthdays[$clc]['comma'] = '';
}
}



// ### TODAY'S EVENTS
if ($vbulletin->options['showevents'])
{
require_once(DIR . '/includes/functions_calendar.php');

$future = gmdate('n-j-Y' , TIMENOW + 86400 + 86400 * $vbulletin->options['showevents']);

if (!is_array($vbulletin->eventcache) OR $future != $vbulletin->eventcache['date'])
{
// Need to update!
$eventstore = build_events();
DEVDEBUG('Updated Events');
}
else
{
$eventstore = $vbulletin->eventcache;
}

unset($eventstore['date']);
$events = array();
$eventcount = 0;
$holiday_calendarid = 0;

foreach ($eventstore AS $eventid => $eventinfo)
{
$offset = $eventinfo['dst'] ? $vbulletin->userinfo['timezoneoffset'] : $vbulletin->userinfo['tzoffset'];
$eventstore["$eventid"]['dateline_from_user'] = $eventinfo['dateline_from_user'] = $eventinfo['dateline_from'] + $offset * 3600;
$eventstore["$eventid"]['dateline_to_user'] = $eventinfo['dateline_to_user'] = $eventinfo['dateline_to'] + $offset * 3600;
$gettime = TIMENOW - $vbulletin->options['hourdiff'];
$iterations = 0;
$todaydate = getdate($gettime);

if (!$eventinfo['singleday'] AND !$eventinfo['recurring'] AND $eventinfo['dateline_from_user'] < gmmktime(0, 0, 0, $todaydate['mon'], $todaydate['mday'], $todaydate['year']))
{
$sub = -3;
}
else if (!empty($eventinfo['holidayid']))
{
$sub = -2;
}
else if ($eventinfo['singleday'])
{
$sub = -1;
}
else
{
$sub = $eventinfo['dateline_from_user'] - (86400 * (intval($eventinfo['dateline_from_user'] / 86400)));
}

if ($vbulletin->userinfo['calendarpermissions']["$eventinfo[calendarid]"] & $vbulletin->bf_ugp_calendarpermissions['canviewcalendar'] OR ($eventinfo['holidayid'] AND $vbulletin->options['showholidays']))
{
if ($eventinfo['holidayid'] AND $vbulletin->options['showholidays'])
{
if (!$holiday_calendarid)
{
$holiday_calendarid = -1; // stop this loop from running again in the future
if (is_array($eventinfo['holiday_calendarids']))
{
foreach ($eventinfo['holiday_calendarids'] AS $potential_holiday_calendarid)
{
if ($vbulletin->userinfo['calendarpermissions']["$potential_holiday_calendarid"] & $vbulletin->bf_ugp_calendarpermissions['canviewcalendar'])
{
$holiday_calendarid = $potential_holiday_calendarid;
break;
}
}
}
}

if ($holiday_calendarid < 0)
{
continue;
}

$eventstore["$eventid"]['calendarid'] = $holiday_calendarid;
$eventinfo['calendarid'] = $holiday_calendarid;
}

if ($eventinfo['userid'] == $vbulletin->userinfo['userid'] OR $vbulletin->userinfo['calendarpermissions']["$eventinfo[calendarid]"] & $vbulletin->bf_ugp_calendarpermissions['canviewothersevent'] OR ($eventinfo['holidayid'] AND $vbulletin->options['showholidays']))
{
if (!$eventinfo['recurring'] AND !$vbulletin->options['showeventtype'] AND !$eventinfo['singleday'] AND cache_event_info($eventinfo, $todaydate['mon'], $todaydate['mday'], $todaydate['year']))
{
$events["$eventid"][] = $gettime . "_$sub";
}
else
{
while ($iterations < $vbulletin->options['showevents'])
{
$addcache = false;

$todaydate = getdate($gettime);
if (isset($eventinfo['holidayid']) AND $eventinfo['holidayid'] AND $eventinfo['recurring'] == 6)
{
if ($eventinfo['recuroption'] == "$todaydate[mon]|$todaydate[mday]")
{
$addcache = true;
}
}
else if (cache_event_info($eventinfo, $todaydate['mon'], $todaydate['mday'], $todaydate['year']))
{
$addcache = true;
}

if ($addcache)
{
if (!$vbulletin->options['showeventtype'])
{
$events["$eventid"][] = $gettime . "_$sub";
}
else
{
$events["$gettime"][] = $eventid;
}
$eventcount++;
}

$iterations++;
$gettime = strtotime('+1 day', $gettime);
}
}
}
}
}

if (!empty($events))
{
if ($vbulletin->options['showeventtype'])
{
ksort($events, SORT_NUMERIC);
}
else
{
function groupbyevent($a, $b)
{
if ($a[0] == $b[0])
{
return 0;
}
else
{
$values1 = explode('_', $a[0]);
$values2 = explode('_', $b[0]);
if ($values1[0] != $values2[0])
{
return ($values1[0] < $values2[0]) ? -1 : 1;
}
else
{
// Same day events. Check the event start time to order them properly (compare number of seconds from 00:00)
return ($values1[1] < $values2[1]) ? -1 : 1;
}
}
}
uasort($events, 'groupbyevent');
// this crazy code is to remove $sub added above that ensures a event maintains its position after the sort
// if associative values are the same
foreach($events AS $eventid => $times)
{
foreach ($times AS $key => $time)
{
$events["$eventid"]["$key"] = intval($time);
}
}
}

$upcomingevents = '';
foreach($events AS $index => $value)
{
$pastevent = 0;
$pastcount = 0;

$comma = $eventdates = $daysevents = '';
if (!$vbulletin->options['showeventtype'])
{ // Group by Event // $index = $eventid
$eventinfo = $eventstore["$index"];
if (empty($eventinfo['recurring']) AND empty($eventinfo['singleday']))
{ // ranged event -- show it from its real start and real end date (vbgmdate)
$fromdate = vbdate($vbulletin->options['dateformat'], $eventinfo['dateline_from_user'], false, true, false, true);
$todate = vbdate($vbulletin->options['dateformat'], $eventinfo['dateline_to_user'], false, true, false, true);
if ($fromdate != $todate)
{
$eventdates = construct_phrase($vbphrase['event_x_to_y'], $fromdate, $todate);
}
else
{
$eventdates = vbdate($vbulletin->options['dateformat'], $eventinfo['dateline_from_user'], false, true, false, true);
}
$day = vbdate('Y-n-j', $eventinfo['dateline_from_user'], false, false);
}
else
{
unset($day);
foreach($value AS $key => $dateline)
{
if ((strtotime('-1 day', $dateline)) == $pastevent AND !$eventinfo['holidayid'])
{
$pastevent = $dateline;
$pastcount++;
continue;
}
else
{
if ($pastcount)
{
$eventdates = construct_phrase($vbphrase['event_x_to_y'], $eventdates, vbdate($vbulletin->options['dateformat'], $pastevent, false, true, false));
}
$pastcount = 0;
$pastevent = $dateline;
}
if (!$day)
{
$day = vbdate('Y-n-j', $dateline, false, false, false);
}
$eventdates .= $comma . vbdate($vbulletin->options['dateformat'], $dateline, false, true, false);
$comma = ', ';
}
if ($pastcount)
{
$eventdates = construct_phrase($vbphrase['event_x_to_y'], $eventdates, vbdate($vbulletin->options['dateformat'], $pastevent, false, true, false));
}
}

if ($eventinfo['holidayid'])
{
$callink = '<a href="calendar.php?' . $vbulletin->session->vars['sessionurl'] . "do=getinfo&amp;day=$day&amp;c=$eventinfo[calendarid]\">" . $vbphrase['holiday' . $eventinfo['holidayid'] . '_title'] . "</a>";
}
else
{
$callink = '<a href="calendar.php?' . $vbulletin->session->vars['sessionurl'] . "do=getinfo&amp;day=$day&amp;e=$eventinfo[eventid]&amp;c=$eventinfo[calendarid]\">$eventinfo[title]</a>";
}
}
else
{ // Group by Date
$eventdate = vbdate($vbulletin->options['dateformat'], $index, false, true, false);

$day = vbdate('Y-n-j', $index, false, false, false);
foreach($value AS $key => $eventid)
{
$eventinfo = $eventstore["$eventid"];
if ($eventinfo['holidayid'])
{
$daysevents .= $comma . '<a href="calendar.php?' . $vbulletin->session->vars['sessionurl'] . "do=getinfo&amp;day=$day&amp;c=$eventinfo[calendarid]\">" . $vbphrase['holiday' . $eventinfo['holidayid'] . '_title'] . "</a>";
}
else
{
$daysevents .= $comma . '<a href="calendar.php?' . $vbulletin->session->vars['sessionurl'] . "do=getinfo&amp;day=$day&amp;e=$eventinfo[eventid]&amp;c=$eventinfo[calendarid]\">$eventinfo[title]</a>";
}
$comma = ', ';
}
}

($hook = vBulletinHook::fetch_hook('forumhome_event')) ? eval($hook) : false;
$templater = vB_Template::create('forumhome_event');
$templater->register('callink', $callink);
$templater->register('daysevents', $daysevents);
$templater->register('eventdate', $eventdate);
$templater->register('eventdates', $eventdates);
$upcomingevents .= $templater->render();
}
// memory saving
unset($events, $eventstore);
$show['upcomingevents'] = iif ($upcomingevents, true, false);
}
$show['todaysevents'] = iif ($vbulletin->options['showevents'] == 1, true, false);
}
else
{
$show['upcomingevents'] = false;
}

// ### LOGGED IN USERS #################################################
if (($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 2 OR ($vbulletin->options['displayloggedin'] > 2 AND $vbulletin->userinfo['userid'])) AND !$show['search_engine'])
{
$datecut = TIMENOW - $vbulletin->options['cookietimeout'];
$numbervisible = 0;
$numberregistered = 0;
$numberguest = 0;

$hook_query_fields = $hook_query_joins = $hook_query_where = '';
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser_ query')) ? eval($hook) : false;

$forumusers = $db->query_read_slave("
SELECT
user.username, (user.options & " . $vbulletin->bf_misc_useroptions['invisible'] . ") AS invisible, user.usergroupid, user.lastvisit,
session.userid, session.inforum, session.lastactivity, session.badlocation,
IF(displaygroupid=0, user.usergroupid, displaygroupid) AS displaygroupid, infractiongroupid
$hook_query_fields
FROM " . TABLE_PREFIX . "session AS session
LEFT JOIN " . TABLE_PREFIX . "user AS user ON(user.userid = session.userid)
$hook_query_joins
WHERE session.lastactivity > $datecut
$hook_query_where
" . iif($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 3, "ORDER BY username ASC") . "
");

if ($vbulletin->userinfo['userid'])
{
// fakes the user being online
$vbulletin->userinfo['joingroupid'] = iif($vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['usergroupid']);
$userinfos = array
(
$vbulletin->userinfo['userid'] => array
(
'userid' =>& $vbulletin->userinfo['userid'],
'username' =>& $vbulletin->userinfo['username'],
'invisible' =>& $vbulletin->userinfo['invisible'],
'inforum' => 0,
'lastactivity' => TIMENOW,
'lastvisit' =>& $vbulletin->userinfo['lastvisit'],
'usergroupid' =>& $vbulletin->userinfo['usergroupid'],
'displaygroupid' =>& $vbulletin->userinfo['displaygroupid'],
'infractiongroupid' =>& $vbulletin->userinfo['infractiongroupid'],
)
);
}
else
{
$userinfos = array();
}

$inforum = array();
while ($loggedin = $db->fetch_array($forumusers))
{
$userid = $loggedin['userid'];
if (!$userid)
{ // Guest
$numberguest++;
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
if (!$loggedin['badlocation'])
{
$inforum["$loggedin[inforum]"]++;
}
}
else if (empty($userinfos["$userid"]) OR ($userinfos["$userid"]['lastactivity'] < $loggedin['lastactivity']))
{
$userinfos["$userid"] = $loggedin;
}
}

// We are a guest and somehow got missed by the query.
if (!$vbulletin->userinfo['userid'] AND !$numberguest)
{
$numberguest++;
}

$activeusers = array();
/* VBIV-12365
Users who are moderated or awaiting e-mail confirmation were being counted as guests.
This was causing online count discrepancies between this and online.php, removed code */
foreach ($userinfos AS $userid => $loggedin)
{
$numberregistered++;
if ($userid != $vbulletin->userinfo['userid'] AND !$loggedin['badlocation'])
{
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
$inforum["$loggedin[inforum]"]++;
}

fetch_musername($loggedin);
$loggedin['comma'] = $vbphrase['comma_space'];
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser' )) ? eval($hook) : false;

if (fetch_online_status($loggedin))
{
$numbervisible++;
$activeusers[$numbervisible] = $loggedin;
}
}

// Last element
if ($numbervisible)
{
$activeusers[$numbervisible]['comma'] = '';
}

// memory saving
unset($userinfos, $loggedin);

$db->free_result($forumusers);

$totalonline = $numberregistered + $numberguest;
$numberinvisible = $numberregistered - $numbervisible;

// ### MAX LOGGEDIN USERS ################################
if (intval($vbulletin->maxloggedin['maxonline']) <= $totalonline)
{
$vbulletin->maxloggedin['maxonline'] = $totalonline;
$vbulletin->maxloggedin['maxonlinedate'] = TIMENOW;
build_datastore('maxloggedin', serialize($vbulletin->maxloggedin), 1);
}

$recordusers = vb_number_format($vbulletin->maxloggedin['maxonline']);
$recorddate = vbdate($vbulletin->options['dateformat'], $vbulletin->maxloggedin['maxonlinedate'], true);
$recordtime = vbdate($vbulletin->options['timeformat'], $vbulletin->maxloggedin['maxonlinedate']);

$show['loggedinusers'] = true;
}
else
{
$show['loggedinusers'] = false;
}


// ### BOARD STATISTICS #################################################

// get total threads & posts from the forumcache
$totalthreads = 0;
$totalposts = 0;
if (is_array($vbulletin->forumcache))
{
foreach ($vbulletin->forumcache AS $forum)
{
$totalthreads += $forum['threadcount'];
$totalposts += $forum['replycount'];
}
}
$totalthreads = vb_number_format($totalthreads);
$totalposts = vb_number_format($totalposts);

// get total members and newest member from template
$numbermembers = vb_number_format($vbulletin->userstats['numbermembers']);
$newuserinfo = array(
'userid' => $vbulletin->userstats['newuserid'],
'username' => $vbulletin->userstats['newusername']
);
$activemembers = vb_number_format($vbulletin->userstats['activemembers']);
$show['activemembers'] = ($vbulletin->options['activememberdays'] > 0 AND ($vbulletin->options['activememberoptions'] & 2)) ? true : false;

$ad_location['board_after_forums'] = vB_Template::create('ad_board_after_forums')->render();
$ad_location['board_below_whats_going_on'] = vB_Template::create('ad_board_below_whats_going_on ')->render();






// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater = vB_Template::create('footer');
$templater->register_page_templates();
$templater->register('activemembers', $activemembers);
$templater->register('activeusers', $activeusers);
$templater->register('forumbits', $forumbits);
$templater->register('newuserinfo', $newuserinfo);
$templater->register('numberguest', $numberguest);
$templater->register('numbermembers', $numbermembers);
$templater->register('numberregistered', $numberregistered);
$templater->register('totalonline', $totalonline);
$templater->register('totalposts', $totalposts);
$templater->register('totalthreads', $totalthreads);
$templater->register('wgo_members',$wgo_members);
$templater->register('wgo_members_list',$wgo_members_list);
print_output($templater->render());

?>

CrumbDown
12-04-2012, 01:25 PM
Now if I want the stats to show in a template, without creating a php file, I create a new plugin and add this:

// ### BOARD STATISTICS #################################################

// get total threads & posts from the forumcache
$totalthreads = 0;
$totalposts = 0;
if (is_array($vbulletin->forumcache))
{
foreach ($vbulletin->forumcache AS $forum)
{
$totalthreads += $forum['threadcount'];
$totalposts += $forum['replycount'];
}
}
$totalthreads = vb_number_format($totalthreads);
$totalposts = vb_number_format($totalposts);

// get total members and newest member from template
$numbermembers = vb_number_format($vbulletin->userstats['numbermembers']);
$newuserinfo = array(
'userid' => $vbulletin->userstats['newuserid'],
'username' => $vbulletin->userstats['newusername']
);
$activemembers = vb_number_format($vbulletin->userstats['activemembers']);
$show['activemembers'] = ($vbulletin->options['activememberdays'] > 0 AND ($vbulletin->options['activememberoptions'] & 2)) ? true : false;

$ad_location['board_after_forums'] = vB_Template::create('ad_board_after_forums')->render();
$ad_location['board_below_whats_going_on'] = vB_Template::create('ad_board_below_whats_going_on ')->render();






// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater = vB_Template::create('footer');
$templater->register_page_templates();
$templater->register('activemembers', $activemembers);
$templater->register('activeusers', $activeusers);
$templater->register('forumbits', $forumbits);
$templater->register('newuserinfo', $newuserinfo);
$templater->register('numberguest', $numberguest);
$templater->register('numbermembers', $numbermembers);
$templater->register('numberregistered', $numberregistered);
$templater->register('totalonline', $totalonline);
$templater->register('totalposts', $totalposts);
$templater->register('totalthreads', $totalthreads);
$templater->register('wgo_members',$wgo_members);
$templater->register('wgo_members_list',$wgo_members_list);
print_output($templater->render());


When I navigate to /forum, I get the footer ONLY and the stats. forumhome is gone lol

I followed your step to create a custom vb:raw xxx but that only display just text. I need it to execute php scripts: https://vborg.vbsupport.ru/showthread.php?t=282796

kh99
12-04-2012, 01:52 PM
Oh, OK, if you're using a plugin on hook location parse_templates like we were talking about, then you don't need to render the footer template because that will be done by the vbulletin code. All you need to do is call vB_Template::preRegister() for any new variables you want to use in the footer template, like:


// put code here to calculate new variables, then...

$templatevalues = array('activemembers' => $activemembers,
'activeusers' => $activeusers,
'newuserinfo' => $newuserinfo,
'numberguest' => $numberguest,
'numbermembers' => $numbermembers,
'numberregistered' => $numberregistered,
'totalonline' => $totalonline,
'totalposts' => $totalposts,
'totalthreads' => $totalthreads);
vB_Tempate::preRegister('footer', $templatevalues);


Then you can use those variables in the footer template. Your plugin only needs to include the code for variables you want to add, so you don't need ot worry about all the other things in the footer template.

Another way to do it might be to create a small template for the stats you want to add to the footer, render it like you've done above except instead of calling print_output, save it to a string variable. Then preRegister that variable to the footer template, and you only have to insert one variable in the footer template.

BTW, the reason you are getting only the footer showing is that print_output exits the script when it's done, so it can really only be called as the last thing on a page.

CrumbDown
12-04-2012, 02:10 PM
Ok. Should I copy the code above and paste it inside of the plugin php code box?

kh99
12-04-2012, 02:15 PM
You also need part of the code you posted above. I guess the whole thing would look something like this:

// ### BOARD STATISTICS #################################################

// get total threads & posts from the forumcache
$totalthreads = 0;
$totalposts = 0;
if (is_array($vbulletin->forumcache))
{
foreach ($vbulletin->forumcache AS $forum)
{
$totalthreads += $forum['threadcount'];
$totalposts += $forum['replycount'];
}
}
$totalthreads = vb_number_format($totalthreads);
$totalposts = vb_number_format($totalposts);

// get total members and newest member from template
$numbermembers = vb_number_format($vbulletin->userstats['numbermembers']);
$newuserinfo = array(
'userid' => $vbulletin->userstats['newuserid'],
'username' => $vbulletin->userstats['newusername']
);
$activemembers = vb_number_format($vbulletin->userstats['activemembers']);
$show['activemembers'] = ($vbulletin->options['activememberdays'] > 0 AND ($vbulletin->options['activememberoptions'] & 2)) ? true : false;

$templatevalues = array('activemembers' => $activemembers,
'activeusers' => $activeusers,
'newuserinfo' => $newuserinfo,
'numberguest' => $numberguest,
'numbermembers' => $numbermembers,
'numberregistered' => $numberregistered,
'totalonline' => $totalonline,
'totalposts' => $totalposts,
'totalthreads' => $totalthreads);
vB_Template::preRegister('footer', $templatevalues);


but I think that's preRegistering a couple things you're not actually calculating in your code. I don't know if those are coming from somewhere else or if they should be removed.

CrumbDown
12-04-2012, 02:38 PM
Ahhhhh! That worked, BUT:

When I added these inside of the footer template: {vb:raw totalonline}, {vb:raw numberregistered}, {vb:raw numberguest}, they do not show but all other does like threads, posts etc

kh99
12-04-2012, 02:46 PM
Those are the ones your code isn't calculating. You probably need to find the code for those in forum.php and add it to your plugin code.

CrumbDown
12-04-2012, 02:49 PM
I've been looking but only see these:

// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater = vB_Template::create('footer');
$templater->register_page_templates();
$templater->register('activemembers', $activemembers);
$templater->register('activeusers', $activeusers);
$templater->register('forumbits', $forumbits);
$templater->register('newuserinfo', $newuserinfo);
$templater->register('numberguest', $numberguest);
$templater->register('numbermembers', $numbermembers);
$templater->register('numberregistered', $numberregistered);
$templater->register('totalonline', $totalonline);
$templater->register('totalposts', $totalposts);
$templater->register('totalthreads', $totalthreads);

print_output($templater->render());


Should I be using this layout?:

$templater->register('totalonline', $totalonline);

--------------- Added 1354636855 at 1354636855 ---------------

Found the other part:

// ### LOGGED IN USERS #################################################
if (($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 2 OR ($vbulletin->options['displayloggedin'] > 2 AND $vbulletin->userinfo['userid'])) AND !$show['search_engine'])
{
$datecut = TIMENOW - $vbulletin->options['cookietimeout'];
$numbervisible = 0;
$numberregistered = 0;
$numberguest = 0;

$hook_query_fields = $hook_query_joins = $hook_query_where = '';
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser_ query')) ? eval($hook) : false;

$forumusers = $db->query_read_slave("
SELECT
user.username, (user.options & " . $vbulletin->bf_misc_useroptions['invisible'] . ") AS invisible, user.usergroupid, user.lastvisit,
session.userid, session.inforum, session.lastactivity, session.badlocation,
IF(displaygroupid=0, user.usergroupid, displaygroupid) AS displaygroupid, infractiongroupid
$hook_query_fields
FROM " . TABLE_PREFIX . "session AS session
LEFT JOIN " . TABLE_PREFIX . "user AS user ON(user.userid = session.userid)
$hook_query_joins
WHERE session.lastactivity > $datecut
$hook_query_where
" . iif($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 3, "ORDER BY username ASC") . "
");

if ($vbulletin->userinfo['userid'])
{
// fakes the user being online
$vbulletin->userinfo['joingroupid'] = iif($vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['usergroupid']);
$userinfos = array
(
$vbulletin->userinfo['userid'] => array
(
'userid' =>& $vbulletin->userinfo['userid'],
'username' =>& $vbulletin->userinfo['username'],
'invisible' =>& $vbulletin->userinfo['invisible'],
'inforum' => 0,
'lastactivity' => TIMENOW,
'lastvisit' =>& $vbulletin->userinfo['lastvisit'],
'usergroupid' =>& $vbulletin->userinfo['usergroupid'],
'displaygroupid' =>& $vbulletin->userinfo['displaygroupid'],
'infractiongroupid' =>& $vbulletin->userinfo['infractiongroupid'],
)
);
}
else
{
$userinfos = array();
}

$inforum = array();
while ($loggedin = $db->fetch_array($forumusers))
{
$userid = $loggedin['userid'];
if (!$userid)
{ // Guest
$numberguest++;
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
if (!$loggedin['badlocation'])
{
$inforum["$loggedin[inforum]"]++;
}
}
else if (empty($userinfos["$userid"]) OR ($userinfos["$userid"]['lastactivity'] < $loggedin['lastactivity']))
{
$userinfos["$userid"] = $loggedin;
}
}

// We are a guest and somehow got missed by the query.
if (!$vbulletin->userinfo['userid'] AND !$numberguest)
{
$numberguest++;
}

$activeusers = array();
/* VBIV-12365
Users who are moderated or awaiting e-mail confirmation were being counted as guests.
This was causing online count discrepancies between this and online.php, removed code */
foreach ($userinfos AS $userid => $loggedin)
{
$numberregistered++;
if ($userid != $vbulletin->userinfo['userid'] AND !$loggedin['badlocation'])
{
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
$inforum["$loggedin[inforum]"]++;
}

fetch_musername($loggedin);
$loggedin['comma'] = $vbphrase['comma_space'];
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser' )) ? eval($hook) : false;

if (fetch_online_status($loggedin))
{
$numbervisible++;
$activeusers[$numbervisible] = $loggedin;
}
}

// Last element
if ($numbervisible)
{
$activeusers[$numbervisible]['comma'] = '';
}

// memory saving
unset($userinfos, $loggedin);

$db->free_result($forumusers);

$totalonline = $numberregistered + $numberguest;
$numberinvisible = $numberregistered - $numbervisible;

// ### MAX LOGGEDIN USERS ################################
if (intval($vbulletin->maxloggedin['maxonline']) <= $totalonline)
{
$vbulletin->maxloggedin['maxonline'] = $totalonline;
$vbulletin->maxloggedin['maxonlinedate'] = TIMENOW;
build_datastore('maxloggedin', serialize($vbulletin->maxloggedin), 1);
}

$recordusers = vb_number_format($vbulletin->maxloggedin['maxonline']);
$recorddate = vbdate($vbulletin->options['dateformat'], $vbulletin->maxloggedin['maxonlinedate'], true);
$recordtime = vbdate($vbulletin->options['timeformat'], $vbulletin->maxloggedin['maxonlinedate']);

$show['loggedinusers'] = true;
}
else
{
$show['loggedinusers'] = false;
}


But gives me an error: Fatal error:

Call to a member function query_read_slave() on a non-object in includes/class_bootstrap.php(430) : eval()'d code on line 17

kh99
12-04-2012, 04:44 PM
I think that error is caused by using $db->query_read_slave(). Either change it to $vbulletin->db->query_read_slave() or else put a "global $db;" line in your plugin code.

CrumbDown
12-04-2012, 04:53 PM
...Either change it to $vbulletin->db->query_read_slave()
Not sure what you are talking about. Where do I find that?


or else put a "global $db;" line in your plugin code.

I've added "global $db;", without the quotes, inside the plugin php but changes nothing.

I must thank you for your continued support.

kh99
12-04-2012, 04:56 PM
Are you still getting "Call to a member function query_read_slave() on a non-object "? Did you put the global line at the beginning? Maybe you should post your current plugin code.

CrumbDown
12-04-2012, 05:00 PM
Yea I think I need to ;)

Code:

// ### LOGGED IN USERS #################################################
if (($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 2 OR ($vbulletin->options['displayloggedin'] > 2 AND $vbulletin->userinfo['userid'])) AND !$show['search_engine'])
{
$datecut = TIMENOW - $vbulletin->options['cookietimeout'];
$numbervisible = 0;
$numberregistered = 0;
$numberguest = 0;

$hook_query_fields = $hook_query_joins = $hook_query_where = '';
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser_ query')) ? eval($hook) : false;

$forumusers = $db->query_read_slave("
SELECT
user.username, (user.options & " . $vbulletin->bf_misc_useroptions['invisible'] . ") AS invisible, user.usergroupid, user.lastvisit,
session.userid, session.inforum, session.lastactivity, session.badlocation,
IF(displaygroupid=0, user.usergroupid, displaygroupid) AS displaygroupid, infractiongroupid
$hook_query_fields
FROM " . TABLE_PREFIX . "session AS session
LEFT JOIN " . TABLE_PREFIX . "user AS user ON(user.userid = session.userid)
$hook_query_joins
WHERE session.lastactivity > $datecut
$hook_query_where
" . iif($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 3, "ORDER BY username ASC") . "
");

if ($vbulletin->userinfo['userid'])
{
// fakes the user being online
$vbulletin->userinfo['joingroupid'] = iif($vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['displaygroupid'], $vbulletin->userinfo['usergroupid']);
$userinfos = array
(
$vbulletin->userinfo['userid'] => array
(
'userid' =>& $vbulletin->userinfo['userid'],
'username' =>& $vbulletin->userinfo['username'],
'invisible' =>& $vbulletin->userinfo['invisible'],
'inforum' => 0,
'lastactivity' => TIMENOW,
'lastvisit' =>& $vbulletin->userinfo['lastvisit'],
'usergroupid' =>& $vbulletin->userinfo['usergroupid'],
'displaygroupid' =>& $vbulletin->userinfo['displaygroupid'],
'infractiongroupid' =>& $vbulletin->userinfo['infractiongroupid'],
)
);
}
else
{
$userinfos = array();
}

$inforum = array();
while ($loggedin = $db->fetch_array($forumusers))
{
$userid = $loggedin['userid'];
if (!$userid)
{ // Guest
$numberguest++;
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
if (!$loggedin['badlocation'])
{
$inforum["$loggedin[inforum]"]++;
}
}
else if (empty($userinfos["$userid"]) OR ($userinfos["$userid"]['lastactivity'] < $loggedin['lastactivity']))
{
$userinfos["$userid"] = $loggedin;
}
}

// We are a guest and somehow got missed by the query.
if (!$vbulletin->userinfo['userid'] AND !$numberguest)
{
$numberguest++;
}

$activeusers = array();
/* VBIV-12365
Users who are moderated or awaiting e-mail confirmation were being counted as guests.
This was causing online count discrepancies between this and online.php, removed code */
foreach ($userinfos AS $userid => $loggedin)
{
$numberregistered++;
if ($userid != $vbulletin->userinfo['userid'] AND !$loggedin['badlocation'])
{
if (!isset($inforum["$loggedin[inforum]"]))
{
$inforum["$loggedin[inforum]"] = 0;
}
$inforum["$loggedin[inforum]"]++;
}

fetch_musername($loggedin);
$loggedin['comma'] = $vbphrase['comma_space'];
($hook = vBulletinHook::fetch_hook('forumhome_loggedinuser' )) ? eval($hook) : false;

if (fetch_online_status($loggedin))
{
$numbervisible++;
$activeusers[$numbervisible] = $loggedin;
}
}

// Last element
if ($numbervisible)
{
$activeusers[$numbervisible]['comma'] = '';
}

// memory saving
unset($userinfos, $loggedin);

$db->free_result($forumusers);

$totalonline = $numberregistered + $numberguest;
$numberinvisible = $numberregistered - $numbervisible;

// ### MAX LOGGEDIN USERS ################################
if (intval($vbulletin->maxloggedin['maxonline']) <= $totalonline)
{
$vbulletin->maxloggedin['maxonline'] = $totalonline;
$vbulletin->maxloggedin['maxonlinedate'] = TIMENOW;
build_datastore('maxloggedin', serialize($vbulletin->maxloggedin), 1);
}

$recordusers = vb_number_format($vbulletin->maxloggedin['maxonline']);
$recorddate = vbdate($vbulletin->options['dateformat'], $vbulletin->maxloggedin['maxonlinedate'], true);
$recordtime = vbdate($vbulletin->options['timeformat'], $vbulletin->maxloggedin['maxonlinedate']);

$show['loggedinusers'] = true;
}
else
{
$show['loggedinusers'] = false;
}



// ### BOARD STATISTICS #################################################

// get total threads & posts from the forumcache
$totalthreads = 0;
$totalposts = 0;
if (is_array($vbulletin->forumcache))
{
foreach ($vbulletin->forumcache AS $forum)
{
$totalthreads += $forum['threadcount'];
$totalposts += $forum['replycount'];
}
}
$totalthreads = vb_number_format($totalthreads);
$totalposts = vb_number_format($totalposts);

// get total members and newest member from template
$numbermembers = vb_number_format($vbulletin->userstats['numbermembers']);
$newuserinfo = array(
'userid' => $vbulletin->userstats['newuserid'],
'username' => $vbulletin->userstats['newusername']
);
$activemembers = vb_number_format($vbulletin->userstats['activemembers']);
$show['activemembers'] = ($vbulletin->options['activememberdays'] > 0 AND ($vbulletin->options['activememberoptions'] & 2)) ? true : false;

$templatevalues = array('activemembers' => $activemembers,
'activeusers' => $activeusers,
'newuserinfo' => $newuserinfo,
'numberguest' => $numberguest,
'numbermembers' => $numbermembers,
'numberregistered' => $numberregistered,
'totalonline' => $totalonline,
'totalposts' => $totalposts,
'totalthreads' => $totalthreads);
vB_Template::preRegister('footer', $templatevalues);

kh99
12-04-2012, 05:04 PM
OK, try putting the global $db line just inside the if, like:

// ### LOGGED IN USERS #################################################
if (($vbulletin->options['displayloggedin'] == 1 OR $vbulletin->options['displayloggedin'] == 2 OR ($vbulletin->options['displayloggedin'] > 2 AND $vbulletin->userinfo['userid'])) AND !$show['search_engine'])
{
global $db;
$datecut = TIMENOW - $vbulletin->options['cookietimeout'];

CrumbDown
12-04-2012, 05:09 PM
Kev, you deserve a donation, really you do!!

Although this maybe different, how to get the stats to show on all templates?

kh99
12-04-2012, 05:18 PM
Do you mean in the footer on all pages? I think the issue there is that the data in $vbulletin->userstats and maxloggedin won't be there unless that page is loading those as "special templates". What you can do is make an additional plugin using hook location init_startup and code like this:

$new_datastore_fetch = array_unique(array_merge($new_datastore_fetch, array('userstats', 'maxloggedin')));

CrumbDown
12-04-2012, 05:25 PM
Do you mean in the footer on all pages? I think the issue there is that the data in $vbulletin->userstats and maxloggedin won't be there unless that page is loading those as "special templates". What you can do is make an additional plugin using hook location init_startup and code like this:

$new_datastore_fetch = array_unique(array_merge($new_datastore_fetch, array('userstats', 'maxloggedin')));


Ok we getting there for a donation.

The code works but not showing the total post and total threads; they show "0".

kh99
12-04-2012, 06:26 PM
I think you need to add a call to cache the forums, like:


// get total threads & posts from the forumcache
$totalthreads = 0;
$totalposts = 0;
cache_ordered_forums(1, 1, $vbulletin->userinfo['userid']);
if (is_array($vbulletin->forumcache))
{

CrumbDown
12-04-2012, 07:03 PM
Thanks again. That worked. I have noticed few things. Whenever the plugin in enabled I get this on few pages:

Fatal error: Call to undefined function fetch_online_status() in .../html/includes/class_bootstrap.php(430) : eval()'d code on line 105

To resolve that, I have to add this is the affected php files:

require_once(DIR . '/includes/functions_bigthree.php');

Also on the member's profile page, the style sheet is not working properly. But if the plugin is disabled, all is well.

I know I have been asking for your continued support but I must give you a donation at the end. You can respond when you are ready.

kh99
12-04-2012, 07:07 PM
To resolve that, I have to add this is the affected php files:

require_once(DIR . '/includes/functions_bigthree.php');

You can add that in your plugin code. Probably just inside the 'if' is a good place.


Also on the member's profile page, the style sheet is not working properly. But if the plugin is disabled, all is well.

Hopefully that's being caused by the error message, so it might go away when the above is added.


I know I have been asking for your continued support but I must give you a donation at the end. You can respond when you are ready.

Thanks but I do this as a volunteer, so don't worry about it (the upside is that I only do what I feel like doing instead of having to do what I'm told. :) )

CrumbDown
12-04-2012, 07:32 PM
Don't know what to say! Everything is working perfectly. Not sure how to thank you but thank you very, very much!

My site: here (http://imaynerobotics.com/forum.php).

The footer will be changed to look beautiful. The Store template is a different story so that issue is with the developer of the Store Im using.

Kevin, once again, thank you and you will reach very far in life ;)

BTW, if I come back here that means a user of the forum found an issue lol