vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB3 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=15)
-   -   Where does the "forum list" SELECT statement reside? (https://vborg.vbsupport.ru/showthread.php?t=166337)

footose 12-28-2007 07:14 PM

Where does the "forum list" SELECT statement reside?
 
I'm trying to figure out where the "index.php" (and associated functions) generate the "SELECT" statement that eventually lists all of the forums that are on the main page.

I've tried the debug mode, and taking each SELECT statement into SQL itself to see if one of those generated it, but it doesn't seem to.

This leads me to believe that it's cached somewhere? Does anyone have a clue?

Thanks.

bobster65 12-28-2007 07:31 PM

Quote:

Originally Posted by footose (Post 1410973)
I'm trying to figure out where the "index.php" (and associated functions) generate the "SELECT" statement that eventually lists all of the forums that are on the main page.

I've tried the debug mode, and taking each SELECT statement into SQL itself to see if one of those generated it, but it doesn't seem to.

This leads me to believe that it's cached somewhere? Does anyone have a clue?

Thanks.

functions_forumlist.php (in the includes folder)

Specifically the $forumbits variable used for the main output is constructed via this function within the functions_forumlist.php file

Quote:

// ###################### Start makeforumbit #######################
// this function returns the properly-ordered and formatted forum lists for forumhome,
// forumdisplay and usercp. Of course, you could use it elsewhere too..
function construct_forum_bit($parentid, $depth = 0, $subsonly = 0)

Opserty 12-28-2007 08:31 PM

Its cached in the datastore table.

$vbulletin->forumcache is the variable for it I think.

footose 12-28-2007 08:48 PM

I was actually playing with the iforumcache before bobster's recommendation, but it seems the $iforumcache only holds the actually forum numbers. I need to somehow "inject" a new "row" into the final array before it's parsed, so I can add a "custom forum", without actually using the link feature

--------------- Added [DATE]1198882259[/DATE] at [TIME]1198882259[/TIME] ---------------

EDIT: I just ran $vbulletin->forumcache through a simple recurisive algo to see what was in it, seems that more then just "forums" are in it... but might be on the right track?

PHP Code:

<?php

global $vbulletin;

require_once(
'./global.php');

show_array($vbulletin->forumcache);

function 
show_array($array)
{
    foreach (
$array as $value)
    {
        if (
is_array($value))
        {
            
show_array($value);
        }
        else
        {
            echo 
$value "<br>";
        }
    }
}

?>

--------------- Added [DATE]1198885645[/DATE] at [TIME]1198885645[/TIME] ---------------

I can't figure out how to read / access this array? ($vbulletin->forumcache)

Does it have special naming conventions or is it [0][0] ?

Opserty 12-28-2007 09:57 PM

Quote:

Originally Posted by footose (Post 1411026)
I can't figure out how to read / access this array? ($vbulletin->forumcache)

Does it have special naming conventions or is it [0][0] ?

run
PHP Code:

var_dump($vbulletin->forumcache); 

in a plugin on the forum home. Then view the source and you will get the contents of the forumcache.

You will have to add to the array (you can see how below) but you will have to figure out the actual data yourself.

PHP Code:

$vbulletin->forumcache[] = array(...); 

I doubt its going to be easy so good luck :o

footose 12-28-2007 10:10 PM

Yes! I was just running that as you typed that! And it wouldn't be fun if it wasn't easy :) Thanks so far, I'm kind of new at the VBulletin end of things, but seem to be picking it up quick.

Seems it a combination of the fields of the "forum" table in the vbulletin database and something else I have yet to figure out. EDIT: Looks like the last part of it is the permissions for the forum.

Here is a list from what I got for anyone that is interested.

PHP Code:


array(53

    [
3]=> array(31
    { 
        [
"forumid"]=> int(3
        [
"styleid"]=> int(0
        [
"title"]=> string(4"Main" 
        
["title_clean"]=> string(4"Main" 
        
["description"]=> string(0"" 
        
["description_clean"]=> string(0"" 
        
["options"]=> int(89795
        [
"displayorder"]=> int(10
        [
"daysprune"]=> int(-1
        [
"newpostemail"]=> string(0"" 
        
["newthreademail"]=> string(0"" 
        
["parentid"]=> int(-1
        [
"parentlist"]=> string(4"3,-1" 
        
["password"]=> string(0"" 
        
["link"]=> string(0"" 
        
["childlist"]=> string(28"3,27,11,32,36,35,33,34,47,-1" 
        
["importforumid"]=> int(0
        [
"importcategoryid"]=> int(1
        [
"lastpostid"]=> int(0
        [
"showprivate"]=> int(0
        [
"defaultsortfield"]=> string(8"lastpost" 
        
["defaultsortorder"]=> string(4"desc" 
        
["hasstatusicons"]=> int(1
        [
"statusiconon"]=> string(29"/images/misc/general_disc.png" 
        
["statusiconoff"]=> string(29"/images/misc/general_disc.png" 
        
["statusiconlockon"]=> string(29"/images/misc/general_disc.png" 
        
["statusiconlockoff"]=> string(29"/images/misc/general_disc.png" 
        
["statusiconlink"]=> string(29"/images/misc/general_disc.png" 
        
["podcast"]=> int(0) ["depth"]=> int(0
        [
"permissions"]=> array(10
        { 
            [
4]=> int(655375
            [
6]=> int(1048575
            [
21]=> int(0
            [
7]=> int(782847
            [
2]=> int(782591
            [
5]=> int(1048575
            [
24]=> int(782591
            [
20]=> int(783607
            [
1]=> int(659471
            [
3]=> int(655375
        } 
    } 
    


This looks like "array 1" holds 53 of these other elements, (i have 53 forums, therefore I assume this holds all the data for each forum). and inside of each, it holds what is parsed by the cache...

--------------- Added [DATE]1198887483[/DATE] at [TIME]1198887483[/TIME] ---------------

Just to note, I just checked the database, and I can confirm that the first part of the array will be the forum number, and the second part of the array will be whatever is listed in your "forum" database, and the final part of the array will be yet another array of the permissions

Example:
Forum # = 3, Title = "Main", Description = "Whatever"

echo $vbulletin->forumcache[3]["Title"]

...

will print "Main"

echo $vbulletin->forumcache[3]["Description"]

...

will print "Whatever"

--------------- Added [DATE]1198887656[/DATE] at [TIME]1198887656[/TIME] ---------------

I have to also note that this doesn't help my original goal, because this does not contain the "last post", "views" and "posts" columns like I original thought it would.

Back to the drawing board. Hopefully this helps someone else.

Opserty 12-28-2007 10:26 PM

For the permissions bit, it will be $vbullletin->forumcache[..]['permissions'][usergroupid].

The permissions are stored as bit fields or something like that. This is a wild guess but I think if you set it to 1 for each usergroup then they should be able to see it I think.

footose 12-28-2007 10:28 PM

Nice!, thank you.

You wouldn't happen to know what $var holds the "Last Post", "Viewed" and "Posts" information would you?

bobster65 12-28-2007 10:30 PM

What exactly is the scope of what you are trying to do?

footose 12-28-2007 10:38 PM

I want to insert a new "forum" on the main forum listing page, but with information that is not directly related to the vbulletin database.

Say for example, you have an image Gallary, and want to show the "latest image" in the "latest post" section.

I've done this already by using a conditional in the forum templates, however, I have been asked to create this into a Product and I would like to eliminate the amount of template edits that need to occur. I was hoping to "highjack" how the forums were parsed so that I can insert what I need to via a plugin.

bobster65 12-28-2007 10:44 PM

Quote:

Originally Posted by footose (Post 1411097)
I want to insert a new "forum" on the main forum listing page, but with information that is not directly related to the vbulletin database.

Say for example, you have an image Gallary, and want to show the "latest image" in the "latest post" section.

I've done this already by using a conditional in the forum templates, however, I have been asked to create this into a Product and I would like to eliminate the amount of template edits that need to occur. I was hoping to "highjack" how the forums were parsed so that I can insert what I need to via a plugin.

Ah sweet! Makes sense to want to bypass the template parts.

as far as counts, I do know that there are counts created in the function file that I posted earlier, but I assume you want to get details before that..

here is a little snippit..

PHP Code:

$counters = array();
    if (
is_array($vbulletin->forumcache))
    {
        foreach(
$vbulletin->forumcache AS $forum)
        {
            
$this_forum =& $counters["$forum[forumid]"];
            
$this_forum['threadcount'] = 0;
            
$this_forum['replycount'] = 0;
            if (
is_array($children["$forum[forumid]"]))
            {
                foreach(
$children["$forum[forumid]"] AS $id => $info)
                {
                    
$this_forum['threadcount'] += $info['threads'];
                    
$this_forum['replycount'] += $info['posts'];
                }
            }
        }
    } 


footose 12-28-2007 10:51 PM

Cool, Im just about to head out for the evening, but I should be back later to take a look at the suggestion.

I'm not sure if I need to grab it before, or grab it after.. but I did look in that particular function (function fetch_last_post_array()) and unfortunately, there is no hooks in there that I can take advantage of. I think I may have to "override" it after the fact.

What I propose may not be possible without actual template edits, but I will still try.

Opserty 12-28-2007 10:58 PM

Here is a very rudimentary start I came up with. Still needs a lot of tweaking but I got it to work so it may help you:

PHP Code:

// I have used 7 as an example forumid, you will need to change it so it doesn't cause conflicts.
$vbulletin->forumcache[] = array(
        
'forumid'   => 7,
        
'styleid'   => 0,
        
'title'     => 'Some Title',
        
'title_clean' => 'Some Title',
        
'description' => 'Some Description',
        
'description_clean' => 'Some Description',
        
'options'       => 73415,
        
'displayorder' => 100,
        
'daysprune' => -1,
        
'newpostemail' => '',
        
'newthreademail' => '',
        
'parentid' => 3,
        
'parentlist' => '7,3,-1',
        
'password' => ''
        
'link' => '',
        
'childlist' => '7, -1' ,
        
'importforumid' => 0,
        
'importcategoryid' => 1,
        
'lastpostid' => ,
        
'showprivate' => ,
        
'defaultsortfield' => 'lastpost',
        
'defaultsortorder' => 'desc',
        
'podcast' => 0,
        
'depth' => 0,
        
'permissions' => array(
                
=> 655375,
                
=> 1048575,
                
=> 0,
                
=> 782847,
                
=> 782847,
                
=> 1048575,
                
=> 655375,
                
=> 655375
                                
)
    );
$vbulletin->userinfo['forumpermissions'][7] = 1048575

EDIT: RE: Lastpostid. I'm not sure you can set your own thing in the last post column, since the lastpostid is cached for that forum and this is then most likely fetched from the database when the forumbit is processed. I'll have a look tomorrow to see if there is way to get around this.

footose 12-28-2007 11:12 PM

^^ Thanks! What hook are you you using?

Been playing with it.. ill update what i find later on

Opserty 12-29-2007 09:46 AM

forumhome_start if I remember correctly.

Edit: Here is the code I managed to get for the "Last Post" column.
PHP Code:

if(THIS_SCRIPT == 'index' && $forumid == 7)
{
    
$show['lastpostinfo'] = $show['icon'] = true;
    
$lastpostinfo['forumid'] = 7;
    
$lastpostinfo['lastthreadid'] = $lastpostinfo['lastpostid'] = 'gallery'// Set up another plugin on showthread_start to catch 'showthread.php?p=gallery' or 't=gallery'
    
$lastpostinfo['lastthread'] = 'Some Random thread';
    
$lastpostinfo['trimthread'] = 'Some Random thr...';
    
$lastpostinfo['postdate'] = 'Set a date in same format as rest of board';
    
$lastpostinfo['posttime'] = 'Same as above';
    
$lastpostinfo['lastpostid'] = 'gallery';
    
$lastpostinfo['lastposter'] = 'Admin?';
    
// Not default but need to clean up so set this info as well
    
$lastpostinfo['lastposterid'] = 1;
    
    eval(
'$forum[\'lastpostinfo\'] = "' fetch_template('forumhome_lastpostby') . '";');
    echo     
'member.php?'$session['sessionurl'] .'findlastposter&amp;f='$lastpostinfo['forumid'];

    
$forum['lastpostinfo'] = str_replace('member.php?'$session['sessionurl'] .'find=lastposter&amp;f='$lastpostinfo['forumid'], 'member.php?'$session['sessionurl'] .'u='.$lastpostinfo['lastposterid'], $forum['lastpostinfo']);


Again by no means final but it will give you an idea of what do to. (Hook Location: forumbit_display)

footose 12-29-2007 03:18 PM

Hey Opserty: Thank you so much for the help!

I was also able to "highjack" the last post column, but it seems you can do it in the original forumhome_start we said as well.. as well as edit the replycount and threadcount... Something like this

PHP Code:

// just check to see if your are an admin
if (is_member_of($vbulletin->userinfo6))
{

// made it insert into "forum 99"
    
$vbulletin->forumcache[99] = array(
    
'forumid'   => 99,
// from database
    
'lastpost' => $lastpost["lastactivity"],
    
'lastposter' => $lastpost["username"],
    
'lastthread' => $lastpost["username"] . "'s car",
// some thread count and reply count
    
'threadcount' => 33544043,
    
'replycount' => 1943543,
    
'styleid'   => 0,
// trying to manipulate the title to display links and such..
    
'title'     => '</strong></a></div><div style="float:left"><a href="thegarage.php"> <strong>The Garage',
    
'title_clean' => '</strong></a><a href="thegarage.php"><strong>The Garage',
    
'description' => '<br>Its 3:30am, so pissoff</div><div align="float:right"><img src="http://forums.generationdub.com/tg/images/3_tn_lowres_rolling_01.jpg"></div>',
    
'description_clean' => 'Upload your ride and brag about it for all to see!',
    
'options'       => 73415,
    
'displayorder' => 100,
    
'daysprune' => -1,
    
'newpostemail' => '',
    
'newthreademail' => '',
    
'parentid' => 3,
    
'parentlist' => '99,3,-1',
    
'password' => ''
    
'link' => '',
    
'childlist' => '99, -1' ,
    
'importforumid' => 0,
    
'importcategoryid' => 1,
    
'lastpostid' => ,
    
'showprivate' => ,
    
'defaultsortfield' => 'lastpost',
    
'defaultsortorder' => 'desc',
    
'podcast' => 0,
    
'depth' => 0,
    
'permissions' => array(
        
=> 0,
        
=> 1048575,
        
21 => 0,
        
=> 0,
        
=> 0,
        
=> 0,
        
24 => 0,
        
20 => 0,
        
=> 0,
        
=> 0
                
)
    );

    
$vbulletin->userinfo['forumpermissions'][99] = 1048575

However, it seems pretty limited because of the way the templates are parsed, it actually uses varibles to fill in the "Last Post" and "Name". Permissions also don't seem to work, unless you add the "userinfo" line at the bottom.

What is it you are doing with the eval fetch_template?

Again, thank you so much for the help thus far.

--------------- Added [DATE]1198948919[/DATE] at [TIME]1198948919[/TIME] ---------------

EDIT

Ahh, I see what you are doing. Basically we could add our own template to use, which is exactly what I wanted to do!

Opserty 12-29-2007 03:28 PM

$vbulletin->userinfo['forumpermissions'][99] = 1048575;
You only need to set this to '1' because you only need to see this forum and because its not a real forum you don't need the other permissions.

footose 12-30-2007 04:12 AM

Very nice man, thank you so much!

What I've began to do is, insert the minimum requirements to "insert" another "forum" using our first piece of code, then "hijacked" the actual last post / count / reply templates and made new ones instead!

footose 01-03-2008 12:12 AM

I have been still working on this. I will post more solutions once I have something final.


All times are GMT. The time now is 01:27 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.01310 seconds
  • Memory Usage 1,893KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (8)bbcode_php_printable
  • (4)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (19)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.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
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete