Log in

View Full Version : How do I fetch info from datastore in a plugin?


Kriminal
07-13-2006, 02:04 PM
I want to show stats from my board, like it's explained in this mod:
But, I want to save 3 of the 5 queries, refreshing stats every 5 minutes.
So, the only two stats whose stays "live" are the "online now"; the other 3 (total threads, total posts and total members) will be updated every 5 minutes and saved in datastore.

I did the following steps:
1) Create a ministats.php inside cron folder:

$numbersmembers = $vbulletin->db->query_first("SELECT COUNT(*) AS users,MAX(userid) AS max FROM " . TABLE_PREFIX . "user");
$ministats['numbermembers']= number_format($numbersmembers['users']);

$counter = $vbulletin->db->query_first("SELECT COUNT(postid) AS posts, COUNT(threadid) AS threads FROM " . TABLE_PREFIX . "post");
$ministats['totalposts']=number_format($counter['posts']);

$countthreads = $vbulletin->db->query_first("SELECT COUNT(*) AS threads FROM " . TABLE_PREFIX . "thread");
$ministats['totalthreads']=number_format($countthreads['threads']);

build_datastore('ministats', serialize($ministats));


2) Create a cron task to execute the php. I noticed that it works (the stats are saved in datastore table)

3) Create a plugin that:
a - execute a sql query to fetch the online members
b - retrieve info from datastore

The plugins is allocated in "global_start" hook, and this is the code:

// online users
$datecut = TIMENOW - $vbulletin->options['cookietimeout'];
$headerguests=$db->query_first("SELECT COUNT(*) AS count FROM " . TABLE_PREFIX . "session WHERE userid=0 AND lastactivity>$datecut");
$headerusers=$db->query_first("SELECT COUNT(DISTINCT(userid)) AS count FROM " . TABLE_PREFIX . "session WHERE " . TABLE_PREFIX . "session.userid>0 AND " . TABLE_PREFIX . "session.lastactivity>$datecut");
$headerguests=$headerguests[count];
$headerusers=$headerusers[count];
$totalonline=$headerguests+$headerusers;

// info from datastore
$ministats = unserialize($vbulletin->ministats);
$numbermembers = $ministats['numbermembers'];
$totalposts = $ministats['totalposts'];
$totalthreads = $ministats['totalthreads'];


The online members info retrieves correctly, but the info from datastore not.
So, my question is: how I do to fetch that info in the plugin?

Thanks in advance,

PS: In the topic title, I put a "g" instead a "f". I'm sorry.

Nj?rd Eriksson
07-18-2006, 09:31 AM
I just had the same problem. I couldn't retrieve the data. You might still need an entry in the config.php :

// ****** SPECIALTEMPLATES *****
// Add any specialtemplates here for any products or mods that use the datastore, to save
// from re-doing file edits on an upgrade or re-install of vBulletin (until they give us a better
// way to do it, anyway). Thanks to KirbyDE for the how-to on doing this.
global $specialtemplates;
$specialtemplates = array_merge(
$specialtemplates, array(
'ministats',
));

Kriminal
07-18-2006, 07:04 PM
Let me see if I understand you (I'm not very good at english, I'm really sorry)
You say you had the problem in the past, and the solution is to include the special template; or you're having the same problem now and the special templates is required but it's not the solution?

The code you posted must be included in the script or in the config.php?
Thanks so much!

PS: I've included the code yo pasted in the config.php and it worked fine !! THANKS SO MUCH!!

Paul M
07-19-2006, 02:01 AM
You don't need to merge arrays, just add to the array ;


global $specialtemplates;
$specialtemplates[] = 'ministats';

You shouldn't need the global line either.

Kriminal
07-19-2006, 02:29 PM
Yes, this works well too, and seems to be an optimized way to write the code. Thanks so much, Paul!

But the global line is required, comenting it stats don't show.

Thanks again!