MyBB Hacks

Full Version: PHP in Templates / Complex Templates
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
This is a relatively small plugin, but seems that a number of people wanted such a thing, so... here it is.

This plugin will allow you to use:
  • PHP in templates, using <?php ... ?> tags
  • Shortcut template conditionals, using <if ... then>...<elseif ... then>...<else>...</if>
  • Some shortcut string functions (see below), eg <func htmlspecialchars>...</func>
  • Call another template, using <template ...>, eg <template header>

For those that do not wish to allow arbitrary PHP code execution that this plugin offers, take a look at the Template Conditionals plugin.

Here's an example of some of the functions that this can be used for - for example, you may use this code in your postbit:

HTML Code
{$post['user_details']}

<if $post['fid5'] then>
Your game tag is <func htmlspecialchars_uni>{$post['fid5']}</func>
<elseif $post['fid6'] and $mybb->user['cancp'] then>
This user's lucky number is <func intval>{$post['fid6']}</func>
<else />Some other profile field: {$post['fid7']}</if>

<?php echo "Hi from PHP"; ?>


Some notes:

  • PHP tags must be closed with ?>
  • PHP runs slower than conditionals, so unless you need to use PHP, I recommend the conditionals
  • PHP inside the <?php ... ?> tags must be well formed, ie the following will not work:

    PHP Code:
    <?php if(true) { ?> some stuff <?php } ?>

    I'm thinking about whether to add support for the above, but there are performance reasons for me choosing not to.

  • The template insertion function is really basic - it performs no caching, so you should not call a lot of templates this way (there really isn't any nice way to get around this) however should be fine for small things.  Also, as it is basic, ensure that you don't stuff it up with recursive calls, that is, it's possible to try to get a template to call itself, but that will obviously cause MyBB to stuff up
  • As of v1.5, I've included the ability to perform additional cache checks, and enabled this option by default.  If you wish to disable this feature, it can be done by modifying a define in the .php file, but this is not necessary for most people (see post below this one for more info).
  • As of v2.1, PHP 5.3 or later is required

The functions available, with the shortcut, are:
htmlspecialchars, htmlspecialchars_uni, intval, file_get_contents, floatval, urlencode, rawurlencode, addslashes, stripslashes, trim, crc32, ltrim, rtrim, chop, md5, nl2br, strrev, strtoupper, strtolower, my_strtoupper, my_strtolower, alt_trow, get_friendly_size, filesize, strlen, my_strlen, my_wordwrap, random_str, unicode_chr, bin2hex, str_rot13, str_shuffle, strip_tags, ucfirst, ucwords, basename, dirname, unhtmlentities
Updated this to v1.5.  The change is an additional cache checking mechanism which is enabled by default.  This additional cache check reduces performance, but increases compatibility with other plugins.

I've seen a number of plugins (including ones I've written myself) which modify the template cache to get things done.  This plugin has its own cache for performance reasons, but unfortunately, it's possible for other plugins' modifications not to get through to PHP in Templates' cache system.  This update mitigates the issue by refreshing the PHP in Templates' cache if the underlying template cache is modified (by another plugin).
This does come at a cost of performance, but as this plugin isn't intended for high performance (a plugin will almost always execute faster at implementing something than using this plugin), rather, more of a convenience plugin, I think it justifies the change.
Thank you very much for the update, Yumi. This is an amazing plugin.
I have encountered a problem when pulling data from a language file.

<if $GLOBALS['mybb']->user['usergroup'] == 1 then>{$lang->online_note}<else>{$lang->online_note2}</if>

In the example above, all "asterix" types of code (such as {1} for a number) is shown as it's shown in the language file rather than it's practical counter-part (a number from the database in the case of {1}), but only for the first hook. The hook after <else> converts {1} etc as it should when viewing the page in a browser. I suspect this has something to do with language files already using PHP, but why is then only the hook before <else> affected and not the one after?

Edit: I'm not sure, but could this problem be due to the fact that i simply copied the online_note hook and made a second one just below it in the language file in question? Do i have to do something more than copy and change the name of a hook in a language file in MyBB for it to properly convert asterisk code?

Edit 2: As i feared, this seems to be an issue with MyBB itself. Apparently, you cannot simply copy an entry in a language file and expect the copy to convert asterisks. I found this code in index.php:

$lang->online_note = $lang->sprintf($lang->online_note, my_number_format($onlinecount), $onlinebit, $mybb->settings['wolcutoffmins'], my_number_format($membercount), $memberbit, my_number_format($anoncount), $anonbit, my_number_format($guestcount), $guestbit);
eval("\$whosonline = \"".$templates->get("index_whosonline")."\";");

Copying this code and changing the first part from online_note to online_note2 did however cause another problem. They both convert asterisks properly, but the copy looks exactly like the original; as if you they were using the same text in the language file. I have no idea how to fix this problem or if the author of this plugin does either.
Yes, you'll need to use the $lang->sprintf function to convert the {1}, {2} wildcards.

If you're making a copy, make sure you change both instances correctly, eg:

$lang->online_note2 = $lang->sprintf($lang->online_note2, my_number_format($onlinecount), $onlinebit, $mybb->settings['wolcutoffmins'], my_number_format($membercount), $memberbit, my_number_format($anoncount), $anonbit, my_number_format($guestcount), $guestbit);

I'm assuming you forgot to change the second instance above.  Hope that helps.
Ah, of course. Makes sense that i would miss something like that. Wink Thank you Burga!
very very useful, I have been using this since the beginning of its first release
thanks very much
Thanks for the nice comment Smile
I just got this plugin installed (or so I assume since it doesn't have ANY installation instructions) and I still can't seem to even get an echo statement working from a template. After trying many different conditionals and php statements - it seems the plugin isn't working.

It only comes with one file, I uploaded that to inc/plugins and activated the plugin from Admin CP - but it doesn't seem to be functional.

Any advice?
May I know what actually do you want to do?
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Reference URL's