PDA

View Full Version : Embed PHP in Templates


filburt1
05-10-2003, 10:00 PM
This hack lets you embed PHP code in templates. Simply add your code between a <? (not a <?php) and ?> tag and it will be eval'ed. All variables will be referenced in the global scope.

If you're using my Usergroup Tags in Templates hack then you're going to have an extraordinarily difficult time installing this hack. However the clever hacker can tell what has changed in this version.

You can somewhat use this to do conditionals in templates. Theoretically, this will work:


template...
<? $myvar = ($condition ? $truevalue : $falsevalue); ?>$myvar
...more template...

Just make sure that the variable to the left of the = and the variable right after the ?> match. Note that the entire <? and ?> tag itself will be stripped from the final template.

This hack also enhances the comments delimiting templates (if that option is turned on) to include the character count and PHP block count of the specified template.

filburt1
05-10-2003, 11:59 PM
Admin CP:

filburt1
05-11-2003, 12:00 AM
The result:

Koutaru
05-11-2003, 12:49 AM
I'm definately going to use this when I get back :) Thanks for the hack filburt!

Link14716
05-11-2003, 02:04 AM
Wow, this leaves all the template conditional hacks in the dust. I might even install this one!

Great job, filburt!

N9ne
05-11-2003, 08:29 AM
Very nice filby! Is this efficient?

Trigunflame
05-11-2003, 08:34 AM
I dont think effecient is the way to put it, its only as effecient as the code u put between the tags....if u just put <? ?> or <? // ?> its not gonna slow anything down a bit...

Dean C
05-11-2003, 12:41 PM
What are the limitations on the use of PHP ?

- miSt

N9ne
05-11-2003, 01:39 PM
Mist, as far as I know, I don't think there are any, as the example that Filburt gives with the if condition statement looks like proper PHP so by the looks of that, a lot can be done.

Danielo
05-11-2003, 03:31 PM
Thank you very much... i try to use this script

Dean C
05-11-2003, 03:39 PM
N9ne - its called a ternary operator i believe ;)

I'm very interested to see how this develops as IMO i think we'll see a lot of PHP errors popping up now on vBulletin.org due to poor PHP coding in the templates :)

- miSt

filburt1
05-11-2003, 04:45 PM
Today at 05:29 AM N9ne said this in Post #6 (https://vborg.vbsupport.ru/showthread.php?postid=393587#post393587)
Very nice filby! Is this efficient?

Theoretically it is only limited by the speed of the preg functions.

mx3
05-11-2003, 04:54 PM
awesome! will install! i've been wanting this for awhile now!

all-the-vb
05-11-2003, 07:45 PM
nice work


:) All-the-vb click install

filburt1
05-11-2003, 09:04 PM
Pseudo-code of what it does:

1. Find every occurance of <? and ?> (and what's inbetween them)
2. For each occurance, make every variable within in the global scope, and then eval what's in the occurance
3. Remove the original occurances from the template.

grog6
05-11-2003, 09:29 PM
And so, no need to modify PHP files to create new hack (even if I'll continue to modify the php files for my new hack, but this can be usefull for some modifications ;) )

* grog6 cliks install too :)
Thx for it Filburt

Chris M
05-12-2003, 08:40 AM
Very nice filby;):)

Satna

mossyuk
05-12-2003, 09:09 AM
Very nice, thanks! :bunny: :banana:

Slynderdale
05-13-2003, 09:45 AM
nice hack, I fixed it slightly though to suit my needs:

if (substr_count($template,'?'.'>')>=1 or substr_count($template,'php?'.'>')>=1 or substr_count($template,'</php>')>=1) {
while (preg_match("/(\<\?php|\<\?|\<php\>)(\r\n)*(.*)(\r\n)*(php\?"."\>|\?"."\>|\<\/php\>)/siU", $template, $matches)) {
if ($parse_phpcode) {
preg_match_all("/\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/", $matches[3], $varnames);
$varnames = implode(", ", $varnames[0]);
if (!empty($varnames)) {
@eval("global $varnames;");
}
$eval_result = @eval(stripslashes($matches[3]));
} else $eval_result = "";
$template = str_replace($matches[0], $eval_result, $template);
}
}


You can now use:
<? ?>
<?php php?>
<php></php>

and any combinations of them, such as:
<?php ?>

and so on.

Also now if you use return(stuff here); in the php script, it returns the data straight to the template itself. Like:
<?
$stuff = "stuff";
return $stuff;
?>

would return the $stuff varible right into the template for you.

kaotic
05-13-2003, 11:20 AM
Odd... the following code doesn't seem to work:

<?
$default = "home";
if($page == ""){$page = $default;}elseif(isset($page)){$page = $page;}
?>
<?
include ("$page.html");
?>

What have I done wrong?

filburt1
05-13-2003, 01:18 PM
For one thing, break it up with some whitespace so it's readable...

Try this:

...
<?
if (empty($page)) $page = "default";
include("$page.html");
?>

Also include and require may cause unpredictable results; you'll probably need to play with the output buffering settings and that'll destroy gzip.

zajako
05-14-2003, 04:12 AM
>.< It made me go cross eyed :]
But quite usefull, if you want to have templates be more useful

cirisme
05-14-2003, 09:09 PM
It doesn't work. :(

PHP code goes through (somewhat) unparsed. I can say:
<? if ($post[usergroupid] != 5) {
$var = "..."
}
?>

And it would show up as...

[code]<? if (6 != 5) {
$var = "..."
}

With the 6 being the correct usergroup id. :ermm:

Wildthinks
05-17-2003, 01:08 PM
I'm to stupid...

That what i get after insert the code. .... in functions...

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(463) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(550) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(571) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(571) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(571) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(571) : eval()'d code on line 1

Parse error: parse error in /homepages/22/d65974721/htdocs/vb/index.php(571) : eval()'d code on line 1

Any hints for me?

filburt1
05-17-2003, 01:31 PM
05-14-03 at 06:09 PM cirisme said this in Post #23 (https://vborg.vbsupport.ru/showthread.php?postid=395191#post395191)
It doesn't work. :(

PHP code goes through (somewhat) unparsed. I can say:
<? if ($post[usergroupid] != 5) {
$var = "..."
}
?>

And it would show up as...

[code]<? if (6 != 5) {
$var = "..."
}

With the 6 being the correct usergroup id. :ermm:

Are you sure you installed it correctly? In what template are you using that code?

Katana Myronson
05-18-2003, 03:47 AM
FILBURT I LOVE YOU!!!

*cliks install*

(Yes i know i spelt click wrong i spelt it that way on purpose ;))

mossyuk
05-19-2003, 02:18 PM
Im getting the page full of Parse error's as well. Running 2.2.7 if thats making any differance?

cirisme
05-19-2003, 04:37 PM
05-17-03 at 08:31 AM filburt1 said this in Post #25 (https://vborg.vbsupport.ru/showthread.php?postid=396156#post396156)
Are you sure you installed it correctly? In what template are you using that code?

Yes, I triple checked it and it doesn't work. :( That was in postbit, but I've tried it in the header as well.

gmarik
05-21-2003, 02:00 PM
05-12-03 at 02:04 AM filburt1 said this in Post #15 (https://vborg.vbsupport.ru/showthread.php?postid=393905#post393905)
Pseudo-code of what it does:

1. Find every occurance of <? and ?> (and what's inbetween them)
2. For each occurance, make every variable within in the global scope, and then eval what's in the occurance
3. Remove the original occurances from the template.


What do you mean by point 2?
No php working for me. The require function just hangs on the IE browser. Can you fix that, fil?

filburt1
05-21-2003, 03:15 PM
What is the exact code you're using?

gmarik
05-21-2003, 06:01 PM
function gettemplate($templatename, $escapecontents = true,
$gethtmlcomments = true, $parsephp = true)
{
// gets a template from the db or from the local cache
global $templatecache, $DB_site, $templatesetid, $addtemplatename;

$templatesetid = intval($templatesetid);
if (isset($templatecache[$templatename]))
{
$toreturn = $templatecache[$templatename];
}
else
{
$template = $DB_site->query_first("SELECT template FROM template
WHERE title = \"" . addslashes($templatename) . "\"
AND (templatesetid = -1 OR templatesetid = $templatesetid)
ORDER BY templatesetid DESC LIMIT 1");
$toreturn = $template['template'];
$templatecache[$templatename] = $toreturn;
}

if (substr_count($template,'?'.'>')>=1 or substr_count($template,'php?'.'>')>=1 or substr_count($template,'</php>')>=1) {
while (preg_match("/(\<\?php|\<\?|\<php\> )(\r\n)*(.*)(\r\n)*(php\?"."\>|\?"."\>|\<\/php\> )/siU", $template, $matches)) {
if ($parsephp) {
preg_match_all("/\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/", $matches[3], $varnames);
$varnames = implode(", ", $varnames[0]);
if (!empty($varnames)) {
@eval("global $varnames;");
}
$eval_result = @eval(stripslashes($matches[3]));
} else $eval_result = "";
$template = str_replace($matches[0], $eval_result, $template);
}
}

if ($parsephp) // is this needed still?
{
// regex is mangled to avoid breaking stupid ides
$count = preg_match_all("/<\?(.*)\?" . ">/siU", $toreturn, $matches);
foreach ($matches[1] as $match)
{
// put vars in the global scope
preg_match_all("/\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/",
$match, $varnames);
$varnames = implode(", ", $varnames[0]);
if (!empty($varnames)) eval("global $varnames;");
eval($match);
}

str_replace($matches[0], "", $toreturn);
}

if ($escapecontents)
{
$toreturn = addslashes($toreturn);
$toreturn = str_replace("\'", "'", $toreturn);
}

if ($gethtmlcomments and $addtemplatename)
{
$charcount = strlen($templatecache[$templatename]) .
" chars originally";
$phpcount = ($parsephp ? ", $count embedded PHP tags" : "");

return "<!-- begin template \"$templatename\" ($charcount$phpcount) " .
"-->\n$toreturn\n<!-- END TEMPLATE: $templatename -->";
}
return $toreturn;

filburt1
05-21-2003, 07:34 PM
The template, not the PHP in gettemplate...

filburt1
05-21-2003, 07:34 PM
You're also not using my original hack, so I support it even less...

bryanzera
05-21-2003, 11:18 PM
I'm not getting this to work either. Such is my code:

<a href='http://www.pollstar.com/member/index.cgi?Premium=1&From=http://forums.pollstar.com<? return getenv('REQUEST_URI') ?>'>Log in to Pollstar Premium now!</a>

what I get is this in my link field:

http://www.pollstar.com/member/index.cgi?Premium=1&From=http://forums.pollstar.com<? return getenv(

Is the getenv out of this hack's scope?

filburt1
05-21-2003, 11:20 PM
This hack doesn't work this way. All it does is blindly execute the code in the tags and a return statement will confuse the hell out of it.

Instead use:

...<? $something = getenv("REQUEST_URI"); ?>$something...

bryanzera
05-21-2003, 11:39 PM
Still doesn't seem to work right. this code:

<a href='http://www.pollstar.com/member/index.cgi?Premium=1&From=http://forums.pollstar.com <? $something = getenv("REQUEST_URI"); ?>$something'>Log in to Pollstar Premium now!</a>

gives this url:

http://www.pollstar.com/member/index.cgi?Premium=1&From=http://forums.pollstar.com <? = getenv("REQUEST_URI"); ?>

filburt1
05-21-2003, 11:40 PM
Make sure you're using my original hack and not the one you quoted.

gmarik
05-22-2003, 04:01 AM
Filburt. Doent know why,
but your origianl hack does not works in ant way.
Our ou should write a manual, how to use it.

I need to write freely php code in every template, can I do it?

GameZilla
05-30-2003, 03:36 PM
anyawy so that i can include files
cause when do it just displays on top no matter where i put the code

gmarik
05-30-2003, 06:53 PM
GameZilla,
All you need is all I need.
I don't care how - it must work as an ordinary php file!!

DraX
06-14-2003, 09:49 AM
The problem with file inclusion is that this is completely contrary to the way in which vBulletin handles it's output buffering.

It doesn't generate line after line, it generates the entire page, and then sends that to the browser once it's compiled it.

For includes to work properly, anything (echos, output, etc.) would have to be stored as variables within the include, which are then echoed by the template itself.

gmarik
06-14-2003, 10:28 AM
DraX - and what is the solution? Any code ideas?

Rob - PROMISE
06-19-2003, 07:29 AM
Hello, sorry if this has been answered, I have read through and can't find anyhting relating to my problem.

I have installed the hack, I then dropped '<? ?>' (without the quotes) into the header of one of our templates. When I view the page it's not parsing the php, I can see the php tags in the source.

I then tried dropping an include in the same place but I then just get a blank page. I read that there are issues with using includes in the templates and I can live without using them although it would be very useful if I could.

Can you shead any light, let me know if you need any more details.

Thanks for your help people :)

gmarik
06-19-2003, 08:43 AM
You're not the only one.
I can't get php working in my 2.3 templates too.
Any solutions in v3? Anybody, Fil, xenon?!

Veg
06-26-2003, 10:54 AM
Can you retrive information from the database with this hack?

gmarik
06-26-2003, 12:15 PM
Theoreticaly it operates template DB. Theoreticaly.

Importhookup
07-07-2003, 11:45 AM
Great hack!

I am so glad that I found this hack, but the problem is that I'm having trouble installing it. I did exactly what is written in the file, the simple replacement of the code but this is what I get on the top of myVBindex.php.

Warning: Failed opening 'randomride.php' for inclusion (include_path='.:/usr/local/lib/php') in /home/importhookup/public_html/forums/admin/functions.php(1095) : eval()'d code on line 1

Parse error: parse error, unexpected T_INCLUDE in /home/importhookup/public_html/forums/admin/functions.php(1095) : eval()'d code on line 1

Parse error: parse error, unexpected T_INCLUDE in /home/importhookup/public_html/forums/admin/functions.php(1095) : eval()'d code on line 1

Can someone help me with this? Thanks!

ChurchMedia
08-05-2003, 04:26 AM
If I use include statements, it works but always puts the include file at the top of the page. Any way around this?

Thanks for the cool hack!

Link14716
09-08-2003, 08:18 PM
Not working... at least not in the postbit.

Code used:
<?
if (!empty($post[field7])) {
$postfollower = "<br><br>";
$postfollower = $postfollower."".bbcodeparse2($post[field7],0,1,1,1);
}
if (!empty($post[field5])) {
$posttextcolor = "color='".$post[field5]."'";
}
if (!empty($post[field6])) {
$postfontface = "face='".$post[field6]."'";
}
if (!empty($postfontface) || !empty($posttextcolor)) {
?>
<font $postfontface $posttextcolor>
<? } ?>
$post[message]
<? if (!empty($postfontface) || !empty($posttextcolor)) { ?>
</font>
<? } ?>
$postfollower

View Source gives me this, of course on the page the code didn't work:
<?
if (!empty(Official Code +++++)) {
= "<br><br>";
= ."".bbcodeparse2(Official Code +++++,0,1,1,1);
}
if (!empty(blue)) {
= "color='".blue."'";
}
if (!empty(WingDings)) {
= "face='".WingDings."'";
}
if (!empty() || !empty()) {
?>
<font >
<? } ?>
I've nailed the store, arcade, increased the arcade's number of games to 41, installed quick reply, and installed zajako's RPG hack. I'm done for tonight.
<? if (!empty() || !empty()) { ?>
</font>
<? } ?>

gmarik
09-09-2003, 03:06 PM
Is it working in v3?

Tae-Hwan
09-27-2003, 07:32 PM
filburt, in your opinion does this render logician's conditionals hack obsolete? i'm fluent in php. i liked logician's conditionals a lot except that it was kinda slow..

drives fast
09-29-2003, 01:12 AM
I have tried many combinations and haven't figured out this one yet

if someone would be so kind

this is what I had figured out in the vb3 conditionals:
<if condition="$post[usergroupid]==11"><font color="#ffcc00" face="verdana, arial, helvetica" size="1"><b>Site Supporter</b></font> <img src="/forum/eimages/supporter.gif" width="11" height="11" border="0" /></if>

how can that be modified to work within the <? ?> in the earlier vbulletin version that I have installed this hack in?

I have tried several things but only get parse errors displayed above the header

stuff like:
<?
if (condition = $post[usergroupid]==11) {
$var = "<font color=\"#ffcc00\" face=\"verdana, arial, helvetica\" size=\"1\"><b>Site Supporter</b></font> <img src=\"/forum/eimages/supporter.gif\" width=\"11\" height=\"11\" border=\"0\" />"
}
?>
and:
<?
if ($post[usergroupid] != 11) {
$var = "<smallfontcolor='#ffcc00'><b>Site Supporter</b></smallfont> <img src='/forum/eimages/supporter.gif' width='11' height='11' border='0' />"
}
?>

I know it is just because I don't know the language to use

thanks a bunch for any help

drives fast
10-02-2003, 04:18 AM
once again...I couldn't get bit by a dog even with a steak hanging around my neck

Tae-Hwan
10-17-2003, 08:10 PM
once again...I couldn't get bit by a dog even with a steak hanging around my neck

hehe, i never heard that one before...

well, i don't have any experience in vbulletin 3, but if i'm understanding the code correctly, it should look something like this in php:


<?
if ($post[usergroupid]==11) {
echo "<font color=\"#ffcc00\" face=\"verdana, arial, helvetica\" size=\"1\"><b>Site Supporter</b></font><img src=\"/forum/eimages/supporter.gif\" width=\"11\" height=\"11\" border=\"0\">";
}
?>

drives fast
10-18-2003, 01:20 AM
thank you...I will give that a try.

it looks like it will work though....I forgot about the "echo"

gmarik
10-19-2003, 03:06 PM
We all forget some times about the quotes or the echo ...

stephenv
11-13-2003, 08:19 PM
I read through some of the other messages AFTER modifying/fixing the original script, I would have added the <?php ?> <php> </php> stuff but I can't be arsed. On a deadline for other stuff.

That said, attached is an updated version that uses output buffering (in case you want to echo text) and also fixes the str_replace that didn't do squat :)



Mail me at stephen AT natnet DOT com if you want to say thanks or have questions, today was my first day on the board and I probably won't be back (fixed for a client who wanted to use phpAdsNew).

NuclioN
12-08-2003, 09:04 AM
Very usefull! I hope this will possible in vb3 soon. :)

spittingangels
01-14-2004, 01:35 AM
I read through some of the other messages AFTER modifying/fixing the original script, I would have added the <?php ?> <php> </php> stuff but I can't be arsed. On a deadline for other stuff.

That said, attached is an updated version that uses output buffering (in case you want to echo text) and also fixes the str_replace that didn't do squat :)

Mail me at stephen AT natnet DOT com if you want to say thanks or have questions, today was my first day on the board and I probably won't be back (fixed for a client who wanted to use phpAdsNew).


With these modifications, the hack works like a charm for what I needed it to do, which was to pull a php file into the header template via include(). the original hack would pull the file into the page but only at the top of the page and not where it was supposed to display.

For everyone else that had a similar problem, try this version. My thanks to both authors that worked on this.