Go Back   vb.org Archive > vBulletin Article Depository > Read An Article > vBulletin 4 Articles
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools
[HOW TO - vB4] Rendering templates and registering variables - a short guide
cellarius's Avatar
cellarius
Join Date: Aug 2005
Posts: 1,987

 

Show Printable Version Email this Page Subscription
cellarius cellarius is offline 11-15-2009, 10:00 PM

Introduction

Starting with vB4, templates no longer get output using eval:
PHP Code:
eval('$mytemplate = "' fetch_template('mytemplate') . '";'); 
is outdated.
What's more: Variables and arrays from plugins that are executed on a page no longer can automatically be accessed in the templates of that page. They need to be registered first.
.
Basic functionality to render templates and register all variables/arrays you want to use inside

PHP Code:
/* Some Code, setting variables, (multidimensional) array */
$my_var "abc";
$my_array = array(
        
'key1' => 'value1',
        
'key2' => array(
                '
key21' => 'value21',
                '
key22' => 'value22'
        '
)
    );

/* render template and register variables */
$templater vB_Template::create('mytemplate');
    
$templater->register('my_var'$my_var);
    
$templater->register('my_array'$my_array);
$templater->render(); 
  • The first line provides the template that is to be rendered, using the new vB_Template class (vB_Template::create). The method gets passed the name of the template as an argument.
  • The following two lines register a variable and an array that we want to use in our template. Arguments passed are 1. the name you want to use to access the variable, and 2. the variable from the code you want to register. You can register as many variables/arrays as you want. Just remember you have to register every variable and array that you want to use in your custom template in this way. If you don't register them, they will not be available.
  • The fourth line renders the template ($templater->render()).
In the template you know will be able to use the registered variables/arrays in this way:
HTML Code:
{vb:raw my_var}
{vb:raw my_array.key1}
{vb:raw my_array.key2.key21}
Note the last one: multidimensional arrays are perfectly possible.
.
.
.
Now, with the result of the rendering we can do several things:
.
Output template directly - custom pages


PHP Code:
$templater vB_Template::create('mytemplate');
    
$templater->register_page_templates(); 
    
$templater->register('my_var'$my_var);
    
$templater->register('my_array'$my_array);
print_output($templater->render()); 
This immediatly outputs the template. Use this if you have created your own page, for example.
Note the second line, which is special for this type of use:
PHP Code:
$templater->register_page_templates(); 
This auto-registers the page level templates header, footer and headinclude that you will use in the template of your custom page.
.
Use a template hook


PHP Code:
$templater vB_Template::create('mytemplate');
    
$templater->register('my_var'$my_var);
    
$templater->register('my_array'$my_array);
$template_hook[forumhome_wgo_pos2] .= $templater->render(); 
The template will be shown using the choosen template hook (for example: $template_hook[forumhome_wgo_pos2]). See the dot before the = in the last line? The hook may be used by other modifications, too, so we don't want to overwrite it, but rather append our code to it, conserving everything that might already be there.
.
Save into a variable for later use in custom template
PHP Code:
$templater vB_Template::create('mytemplate');
    
$templater->register('my_var'$my_var);
    
$templater->register('my_array'$my_array);
$mytemplate_rendered $templater->render(); 
Now we have saved the rendered template into a variable. This variable in turn we can later on register in another template, if we want:
PHP Code:
$templater vB_Template::create('my_other_template');
     
$templater->register('my_template_rendered'$my_template_rendered);
 
print_output($templater->render()); 
Again, inside my_other_template we now could call
HTML Code:
{vb:raw my_template_rendered}
If you're running the first template call inside a loop, you may want to use .= instead of = in the last line, so that the results of every loop get added instead of overwriting the existing. But that depends, of course.
.
Save into an array and preregister to use in an existing/stock template

PHP Code:
$templater vB_Template::create('mytemplate');
    
$templater->register('my_var'$my_var);
    
$templater->register('my_array'$my_array);
$templatevalues['my_insertvar'] = $templater->render();
vB_Template::preRegister('FORUMHOME'$templatevalues); 
  • This is another, more flexible method to save the rendered template into a variable for future use in an already existing template. In this example, we want to show our own rendered template on forumhome.
  • Problem is: We have no direct way to register variables for already existing templates like FORUMHOME. It's created and rendered in the files, and we don't want to mess there.
  • To help with this, a new method was created for vB_Template class, called preRegister. Using this, we can pass our data to FORUMHOME before it is rendered. Note that the data needs to be saved into an array ($templatevalues['my_insertvar']), a simple variable will throw an error. In the last line the array is preregistered; you need to pass as arguments 1. the name of the existing template and 2. the array that contains the data. Again, this can be done for as many arrays as needed.
  • Of course, the preRegister functionality can be used for any kind of variables or arrays, no matter whether you have saved a rendered template (like in our example) into it or it contains just a simple boolean true/false statement.
To access the data inside the template it was preregistered for use:
HTML Code:
{vb:raw my_insertvar}
Note: it is not {vb:raw templatevalues.my_insertvar}!

Essentially the same as what I put for preRegister would be the following two lines. They could replace the last two lines in the above php codebox:
PHP Code:
$my_insertvar $templater->render();
vB_Template::preRegister('FORUMHOME',array('my_insertvar ' => $my_insertvar)); 
Of course you could add further pairs to that array if you need to preregister more than one variable.
.
.
Bonus track: ...whatever you do, cache your templates!

Now you know how to get your templates on screen - once you succeeded in doing that, make sure to do it in a fast and ressource saving manner: make use of vB's template cache. To see whether your templates are cached or not, activate debug mode by adding $config['Misc']['debug'] = true;to your config.php (don't ever use that on your live site!). Among the debug info is a list of all templates called, and non-cached templates will show up in red.

To cache your templates, add a plugin at hook cache_templates with the following code:
PHP Code:
// for a single template
$cache[] = 'mytemplate'

// for more than one templates in one step
$cache array_merge((array)$cache,array(
    
'mytemplate',
    
'myothertemplate',
    
'mythirdtemplate'
)); 
.
.
Hope this helps!
-cel

----
Addendum - There are now two blog posts on vb.com related to this topic:
http://www.vbulletin.com/forum/entry...in-4-templates
http://www.vbulletin.com/forum/entry...-4-based-files
Reply With Quote
  #252  
Old 08-13-2012, 11:21 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It could be because I had the code wrong - I fixed it in my post above.
Reply With Quote
  #253  
Old 08-13-2012, 11:57 PM
PyroChixRock PyroChixRock is offline
 
Join Date: Jun 2005
Posts: 26
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yay! that was it. I can't thank you enough.
Reply With Quote
  #254  
Old 08-29-2012, 01:06 PM
Jonathan81 Jonathan81 is offline
 
Join Date: May 2007
Posts: 48
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by PyroChixRock View Post
I have this little random banner code I've always used through the plugin system, but I can't seem to get it to work on vb4. Can anyone help?

normally, I call for it below the navbar with this...
Code:
<br>
<div style="text-align: center;">
$randombanner
</div>
and this for example, in the plugin area.
Code:
$path = '/forum/images/adbanners/';
$banners = array(
array( 'src' => 'imagine.jpg',
'href' => 'http://www.talkglass.com/'),
array( 'src' => 'waiting.jpg',
'href' => 'http://www.talkglass.com/),
);


$rnd = rand(0,count($banners)-1); // Pick a random array index.  They start with 0, so you have to -1.
$href = $banners[$rnd]['href'];  // Link HREF
$src = $path.$banners[$rnd]['src']; // Image source
$randombanner = '<a href="'.$href.'"><img border="0" src="'.$src.'" /></a>';
Where should i plug these in now for them to work with the built in ad system. it doesn't work using that.
Do you know how I can make the links open in a new window using the above code?
Reply With Quote
  #255  
Old 08-29-2012, 01:14 PM
cellarius's Avatar
cellarius cellarius is offline
 
Join Date: Aug 2005
Posts: 1,987
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It has nothing at all to do with the topic of this article, but:

Last line:
$randombanner = '<a href="'.$href.'" target="_blank"><img border="0" src="'.$src.'" /></a>';
Reply With Quote
  #256  
Old 08-29-2012, 01:22 PM
Jonathan81 Jonathan81 is offline
 
Join Date: May 2007
Posts: 48
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by cellarius View Post
It has nothing at all to do with the topic of this article, but:

Last line:
$randombanner = '<a href="'.$href.'" target="_blank"><img border="0" src="'.$src.'" /></a>';
Yes, I know, apologies...and thank you
Reply With Quote
  #257  
Old 10-16-2012, 11:15 AM
soulz2003 soulz2003 is offline
 
Join Date: Nov 2009
Posts: 42
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

The thing I am not understanding at this point is. If I am trying to preregister a variable for use with a stock template, in this case header. Where am I putting my code?

Is there a stock location to add this to or am I having to jump from adding a simple variable used on sites since vb 3.x into learning the basics of plugin writing? GLOBALS.permissions.pmquota isn't working for me in a new situation so I am trying to learn how to register permissions with the header template.

I believe the code is going to look like this?
Code:
$permissions = $vbulletin->userinfo['permissions'];
vB_Template::preRegister('header',array('permissions' => $permissions));
If so or even once correct where is this going? I mean were talking about a stock item for a stock template not a 3rd party plugin so I am confused.

Also is the above enough or do I need to add more like:
Code:
$permissions['pmquota'] = vb_number_format($vbulletin->userinfo['permissions']['pmquota']);
Reply With Quote
  #258  
Old 10-16-2012, 08:03 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I answered in your other thread, but I'll answer more generally here: for the header, navbar, and footer templates I would recommend the hook parse_templates, since that's always executed just before those templates are rendered.

But the variable you want to use has to be available at that hook, and the timing of the call to the parse_templates hook can change. In the case of $permissions, that is set just after the global_start hook is called, so if some plugin using the global_start hook renders a template, parse_templates will be called but $permissions won't have been set yet so preRegistering it to a template won't work. (That's also why GLOBALS.permissions.pmquota stopped working - using preRegister() instead won't make any difference). But as I mentioned in the other thread, $permission is just a copy of $vbulletin->userinfo['permissions'], so if you use {vb:raw bbuserinfo.permissions.pmquota} in the template, that may work without any preRegistering.
Reply With Quote
  #259  
Old 10-17-2012, 02:17 AM
TheSupportForum TheSupportForum is offline
 
Join Date: Jan 2007
Posts: 1,158
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

is this possible

PHP Code:
$array array($vbulletin->options['list1']); or array($vbulletin->options['list2']); 
i need to be able to use and array for 2 or more options, how can this be done
Reply With Quote
  #260  
Old 10-21-2012, 09:22 PM
BirdOPrey5's Avatar
BirdOPrey5 BirdOPrey5 is offline
Senior Member
 
Join Date: Jun 2008
Location: New York
Posts: 10,610
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

As you wrote it, it is not going to work, you can't just put an "or" in the middle of any code.

I'm not really sure what your goal is or I'd give you an idea where to go... Maybe..

PHP Code:
$array array(); //New array
$array[0] = $vbulletin->options['list1'];
if (
$vbulletin->options['list2']) // If list2 exists
  
$array[] = $vbulletin->options['list2']; 
That creates new array...

Assuming list1 always exists array[0] gets its value

Then If list2 exists the next element in array (array[1] in this case) gets the value of list2
Reply With Quote
  #261  
Old 12-26-2012, 12:57 PM
acast acast is offline
 
Join Date: Aug 2008
Posts: 179
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Hi, i am trying to learn how to adjust the plugins for v3 to v4.

Can anybody guide me and tell me what it's wrong?

Code working in 3.6.6.

Code:
<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'hangman');
$globaltemplates = array(
         'hangman'
);
// pre-cache templates used by specific actions
$actiontemplates = array();


//vB Hangman 2.0 by Dr. Erwin Loh (Admin at vBulletin.org)
//Enjoy this hack!

require_once('./global.php');


$hangmanwords=&$vbulletin->options['hangmanwords'];
$hangmanmax=&$vbulletin->options['hangmanmax'];
$hangmanguests=&$vbulletin->options['hangmanguests'];



if ($hangmanguests==0) {
if (!$vbulletin->userinfo['userid']) {
print_no_permission();
 }
}
$vbulletin->input->clean_array_gpc('r', array(
	'letters' => TYPE_STR,
	'n' => TYPE_UINT
));
$letters = &$vbulletin->GPC['letters'];
$n = &$vbulletin->GPC['n'];
$additional_letters = " -.,;!?%&0123456789";	
$max=$hangmanmax;					
$hangmanwords = strtoupper($hangmanwords);
$words = explode(",",$hangmanwords);
$alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$all_letters=$letters.$additional_letters;
$wrong = 0;
srand((double)microtime()*1000000); 
if (!isset($n)) {
$n = rand(1,count($words)-1); 
}
$word_line="";
$word = $words[$n];
$done = 1;
for ($x=0; $x < strlen($word); $x++)
{
  if (strstr($all_letters, $word[$x]))
  {
    if ($word[$x]==" ") $word_line.="&nbsp; "; else $word_line.=$word[$x];
  } 
  else 
{ 
$word_line.="_<font size=1>&nbsp;</font>"; $done = 0; }
}
if (!$done)
{
  for ($c=0; $c<26; $c++)
  {
    if (strstr($letters, $alpha[$c]))
    {
      if (strstr($words[$n], $alpha[$c])) {
$links .= "\n<B>$alpha[$c]</B> "; 
}
      else 
{ 
$links .= "\n<FONT color=\"red\">$alpha[$c] </font>"; $wrong++; 
}
    }
    else
    { 
$links .= "\n<A HREF=\"$PHP_SELF?letters=$alpha[$c]$letters&n=$n\">$alpha[$c]</A> "; }
  }
  $nwrong=$wrong;
  if ($wrong >= $max)
  {
$n = rand (1,count($words)-1);
    if ($n>(count($words)-1)) $n=0;
    $sorry .= "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n<p><BR><FONT color=\"red\"><BIG>SORRY, YOU ARE HANGED!!!</BIG></FONT><BR><BR>";
    if (strstr($word, " ")) $term="phrase"; else $term="word";
    $play .= "The $term was \"<B>$word</B>\"<BR><BR>\n<A HREF=$PHP_SELF?n=$n>Play again.</A>\n\n";
  }
  else
  {
    $guess .= " &nbsp; Number of Wrong Guesses Left: <B>".($max-$wrong)."</B><BR>\n<H1><font size=5>\n$word_line</font></H1>\n<P><BR>Choose a letter:<BR><BR>\n$links\n";
  }
}
else
{
$n = rand (1,count($words)-1);
  if ($n>(count($words)-1)) $n=0;
  $win .= "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n<P><BR><BR><B>Congratulations $bbuserinfo[username]!!! &nbsp;You have won!!!</B><BR><BR><BR>\n<A HREF=$PHP_SELF?n=$n>Play again</A>\n\n";
}
  $navbits = construct_navbits(array('' => $vbphrase['vb_hangman']));
eval('$navbar = "' . fetch_template('navbar') . '";');
eval('print_output("' . fetch_template(hangman) . '");');
?>
My modified code:
Code:
<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
ini_set("display_errors", 1);
// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'hangman');
// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();
// get special data templates from the datastore
$specialtemplates = array();
$globaltemplates = array(
         'hangman'
);
// pre-cache templates used by specific actions
$actiontemplates = array();


//vB Hangman 2.0 by Dr. Erwin Loh (Admin at vBulletin.org)
//Enjoy this hack!

require_once('./global.php');


$hangmanwords=&$vbulletin->options['hangmanwords'];
$hangmanmax=&$vbulletin->options['hangmanmax'];
$hangmanguests=&$vbulletin->options['hangmanguests'];



if ($hangmanguests==0) {
if (!$vbulletin->userinfo['userid']) {
print_no_permission();
 }
}
$vbulletin->input->clean_array_gpc('r', array(
	'letters' => TYPE_STR,
	'n' => TYPE_UINT
));
$letters = &$vbulletin->GPC['letters'];
$n = &$vbulletin->GPC['n'];
$additional_letters = " -.,;!?%&0123456789";	
$max=$hangmanmax;					
$hangmanwords = strtoupper($hangmanwords);
$words = explode(",",$hangmanwords);
$alpha = "ABCDEFGHIJKLMN?OPQRSTUVWXYZ";
$all_letters=$letters.$additional_letters;
$wrong = 0;
srand((double)microtime()*1000000); 
if (!isset($n)) {
$n = rand(1,count($words)-1); 
}
$word_line="";
$word = $words[$n];
$done = 1;
for ($x=0; $x < strlen($word); $x++)
{
  if (strstr($all_letters, $word[$x]))
  {
    if ($word[$x]==" ") $word_line.="&nbsp; "; else $word_line.=$word[$x];
  } 
  else 
{ 
$word_line.="_<font size=1>&nbsp;</font>"; $done = 0; }
}
if (!$done)
{
  for ($c=0; $c<26; $c++)
  {
    if (strstr($letters, $alpha[$c]))
    {
      if (strstr($words[$n], $alpha[$c])) {
$links .= "\n<B>$alpha[$c]</B> "; 
}
      else 
{ 
$links .= "\n<FONT color=\"red\">$alpha[$c] </font>"; $wrong++; 
}
    }
    else
    { 
$links .= "\n<A HREF=\"$PHP_SELF?letters=$alpha[$c]$letters&n=$n\">$alpha[$c]</A> "; }
  }
  $nwrong=$wrong;
  if ($wrong >= $max)
  {
$n = rand (1,count($words)-1);
    if ($n>(count($words)-1)) $n=0;
    $sorry .= "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n<p><BR><FONT color=\"red\"><BIG>SORRY, YOU ARE HANGED!!!</BIG></FONT><BR><BR>";
    if (strstr($word, " ")) $term="phrase"; else $term="word";
    $play .= "The $term was \"<B>$word</B>\"<BR><BR>\n<A HREF=$PHP_SELF?n=$n>Play again.</A>\n\n";
  }
  else
  {
    $guess .= " &nbsp; Number of Wrong Guesses Left: <B>".($max-$wrong)."</B><BR>\n<H1><font size=5>\n$word_line</font></H1>\n<P><BR>Choose a letter:<BR><BR>\n$links\n";
  }
}
else
{
$n = rand (1,count($words)-1);
  if ($n>(count($words)-1)) $n=0;
  $win .= "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n<P><BR><BR><B>Congratulations $bbuserinfo[username]!!! &nbsp;You have won!!!</B><BR><BR><BR>\n<A HREF=$PHP_SELF?n=$n>Play again</A>\n\n";
}
$navbits = construct_navbits(array('' => $vbphrase['vb_hangman']));
$navbar = render_navbar_template($navbits);
// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'hangman';
// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######
$templater = vB_Template::create('hangman');
$templater->register_page_templates();
$templater->register('hangmanwords', $hangmanwords);
$templater->register('hangmanmax', $hangmanmax);
$templater->register('hangmanguests', $hangmanguests);
$templater->register('letters', $letters);
$templater->register('n', $n);
$templater->register('additional_letters', $additional_letters);
$templater->register('words', $words);
$templater->register('alpha', $alpha);
$templater->register('all_letters', $all_letters);
$templater->register('wrong', $wrong);
$templater->register('word', $word);
$templater->register('done', $done);
$templater->register('word_line', $word_line);
$templater->register('c', $c);
$templater->register('links', $links);
$templater->register('max', $max);
$templater->register('x', $x);
$templater->register('sorry', $sorry);
$templater->register('play', $play);
$templater->register('win', $win);
$templater->register('term', $term);
$templater->register('guess', $guess);
$templater->register('nwrong', $nwrong);
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
print_output($templater->render());
?>
It doesn't work, and i don't know why. I tried with several plugins but no one works. Thanks for your help.
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 05:07 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.12429 seconds
  • Memory Usage 2,414KB
  • Queries Executed 26 (?)
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
  • (6)bbcode_code
  • (3)bbcode_html
  • (12)bbcode_php
  • (2)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_article
  • (1)navbar
  • (4)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (4)pagenav_pagelink
  • (1)pagenav_pagelinkrel
  • (11)post_thanks_box
  • (17)post_thanks_box_bit
  • (11)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit
  • (11)post_thanks_postbit_info
  • (10)postbit
  • (11)postbit_onlinestatus
  • (11)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
  • fetch_musername
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • post_thanks_function_fetch_thanks_bit_start
  • post_thanks_function_show_thanks_date_start
  • post_thanks_function_show_thanks_date_end
  • post_thanks_function_fetch_thanks_bit_end
  • post_thanks_function_fetch_post_thanks_template_start
  • post_thanks_function_fetch_post_thanks_template_end
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete