View Single Post
  #2  
Old 07-01-2011, 05:01 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I'm not sure because I've never done it, but includes/template_curly_defs.php seems to have a bunch of classes, one for each type of curly tag, all derived from class vB_TemplateParser_Curly (which is also in that file), and the classes are used in includes/class_template_parser.php, with the class name built from the tag name. So maybe if you did something like:

Code:
require_once("includes/template_curly_defs.php");

class vB_TemplateParser_CurlyFoo extends vB_TemplateParser_Curly
{
    public static function validate(vB_Node $main_node, vB_TemplateParser $parser)
    {
        // some code            
    }
    public static function compile(vB_Node $main_node, vB_TemplateParser $parser)
    {
        //more code
    }
}

then somehow get that included before the template parser is called. (ETA: actually, I'm not sure if you even need to include the base class before defining a subclass, or include the class def before using it).

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

Got curious so decided to try it - the answer to both the above questions is "yes", you do need those things defined before they're used. So I used this code at hook admin_global:

Code:
require_once("includes/template_curly_defs.php");

class vB_TemplateParser_CurlyFoo extends vB_TemplateParser_Curly
{
    public static function validate(vB_Node $main_node, vB_TemplateParser $parser)
    {
        return array();
    }
    public static function compile(vB_Node $main_node, vB_TemplateParser $parser)
    {
        return "Foo";
    }
}

and then putting {vb:Foo} in a template resulted in Foo being inserted at that point. Of course the validate function should check the arguments and the compile function will probably do something more complicated, but you can look at the existing classes to figure that out.

On a side note, you know what turns out to be a bad idea? Creating a plugin using hook admin_global that has an error in it. I had to go to the database and edit the datastore value before I could get back to the plugin manager. ETA: but now that I think about it, it would have been easier just to temporarily comment out the fetch_hook call.
Reply With Quote
 
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03838 seconds
  • Memory Usage 1,769KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD_SHOWPOST
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (2)bbcode_code
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • reputationlevel
  • showthread
Included Files:
  • ./showpost.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_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showpost_start
  • bbcode_fetch_tags
  • bbcode_create
  • postbit_factory
  • showpost_post
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • showpost_complete