PHP in Templates / Complex Templates
Author Message
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
1
2
3
4
5
6
7
8
9
{$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
(This post was last modified: 06-26-2023 10:42 PM by ZiNgA BuRgA.)
Find all posts by this user
Quote this message in a reply
Download: phptpl-2.3.7z (2.62 KB)
Plugin Version: 2.3
Last Updated: 06-26-2023, 10:42 PM

Downloads: 14,861
MyBB Compatibility: 1.2.x, 1.4.x, 1.6.x, 1.8.x
Plugin License: GPLv3
Uploader: ZiNgA BuRgA
ZiNgA BuRgA Offline
Fag
*******
Posts: 3,357
Joined: Jan 2008
Post: #101
RE: PHP in Templates / Complex Templates
Funnily enough, your code is vulnerable to MySQL injection attacks (even though the warning was never designed to detect that).
Always escape variables before they go into a query.

Apart from that, the code isn't even valid, so no surprise that it won't work.

Maybe you want this:

PHP Code:
$balance = mysql_fetch_array(mysql_query("SELECT `balance` FROM iconomy WHERE `username` = '".mysql_real_escape_string($mybb->user['fid4'])."'"));
echo $balance[0];


My Blog
01-09-2012 08:53 PM
Find all posts by this user Quote this message in a reply
newbie Offline
Junior Member
**
Posts: 1
Joined: Jan 2012
Post: #102
RE: PHP in Templates / Complex Templates
Hi,
after activating the plugin I get these emails:

Code:
Cannot modify header information - headers already sent by (output started at /home/xxx/domains/xxx.xxx/public_html/forum/global.php(503) : eval()'d code(1) : eval()'d code:1)


How can I fix it?

01-21-2012 03:20 AM
Find all posts by this user Quote this message in a reply
ZiNgA BuRgA Offline
Fag
*******
Posts: 3,357
Joined: Jan 2008
Post: #103
RE: PHP in Templates / Complex Templates
Revert your headerinclude, gobutton, htmldoctype and header templates.

My Blog
01-21-2012 08:14 AM
Find all posts by this user Quote this message in a reply
Dannymh Offline
Junior Member
**
Posts: 2
Joined: Mar 2012
Post: #104
RE: PHP in Templates / Complex Templates
I am getting

Code:
Parse error: syntax error, unexpected T_STRING in /home/silvert/public_html/forum/global.php(503) : eval()'d code(1) : eval()'d code on line 1


When this is used with the mybbGM template, any idea what may be causing this?

Cheers
Dan

03-07-2012 12:19 PM
Find all posts by this user Quote this message in a reply
ZiNgA BuRgA Offline
Fag
*******
Posts: 3,357
Joined: Jan 2008
Post: #105
RE: PHP in Templates / Complex Templates
* looks into crystal ball *
Hmm, not really.
Maybe, if there's a <?xml in the template, try getting rid of the tag.

My Blog
03-07-2012 03:14 PM
Find all posts by this user Quote this message in a reply
Earl Grey Offline
Junior Member
**
Posts: 12
Joined: Nov 2011
Post: #106
RE: PHP in Templates / Complex Templates
(11-25-2011 11:33 PM)Earl Grey Wrote:  
(11-25-2011 03:45 PM)ZiNgA BuRgA Wrote:  Nesting?

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<if $forum['fid'] == 1 then>
 ID 1
<else>
  <if $forum['fid'] == 2 then>
   ID 2
  <else>
    <if $forum['fid'] == 3 then>
     ID 3
    <else>
     something else
    </if>
  </if>
</if>

Or reduce the clutter with elseif's

Code:
1
2
3
4
5
6
7
8
9
<if $forum['fid'] == 1 then>
 ID 1
<elseif $forum['fid'] == 2 then>
 ID 2
<elseif $forum['fid'] == 3 then>
 ID 3
<else>
 no, I'm not going to put any more IDs
</if>


Perfect! Thanks so much Smile

Hey, it's me again! I'm working on this project again and I was wondering if there was a way I could use one code for more than one forum? Like:

Code:
1
2
3
4
5
6
7
8
9
<if $forum['fid'] == 1 then>
 ID 1
<elseif $forum['fid'] == 2, 3, 4, 5, 6, 7, 8 then>
 ID 2
<elseif $forum['fid'] == 9 then>
 ID 3
<else>
 no, I'm not going to put any more IDs
</if>


I'm not very good at PHP so don't know how to do this, any tips would be much appreciated <3[/code]

04-10-2012 09:52 AM
Find all posts by this user Quote this message in a reply
ZiNgA BuRgA Offline
Fag
*******
Posts: 3,357
Joined: Jan 2008
Post: #107
RE: PHP in Templates / Complex Templates

Code:
<if in_array($forum['fid'], array(1,2,4,7)) then>


My Blog
04-10-2012 11:42 AM
Find all posts by this user Quote this message in a reply
Earl Grey Offline
Junior Member
**
Posts: 12
Joined: Nov 2011
Post: #108
RE: PHP in Templates / Complex Templates
Excellent, thanks <3
04-10-2012 09:48 PM
Find all posts by this user Quote this message in a reply
lutherking Offline
Junior Member
**
Posts: 1
Joined: Apr 2012
Post: #109
RE: PHP in Templates / Complex Templates
thanks for your plugin ...

I need to put an image with a link next to a forum ...
In forumbit_depth2_forum with the code <if ..... then>, how can I intercept the forum id 14 ? (or by forum name)
04-12-2012 07:07 AM
Find all posts by this user Quote this message in a reply
ZiNgA BuRgA Offline
Fag
*******
Posts: 3,357
Joined: Jan 2008
Post: #110
RE: PHP in Templates / Complex Templates
Look at how forum information variables are in the template and use that as a basis.
They'll be an array and look something like {$forum['...']} or maybe {$foruminfo['...']} or something similar.  Use "fid" as the key in the array.
Don't forget to remove the braces when being used in an if statement.

My Blog
04-12-2012 07:30 AM
Find all posts by this user Quote this message in a reply


Forum Jump: