vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vBulletin 2.x Full Releases (https://vborg.vbsupport.ru/forumdisplay.php?f=4)
-   -   Embed PHP in Templates (https://vborg.vbsupport.ru/showthread.php?t=52775)

filburt1 05-10-2003 10:00 PM

Embed PHP in Templates
 
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:

Code:

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

Quote:

Today at 05:29 AM N9ne said this in Post #6
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 ;) )

[high]* grog6 cliks install too :)
[/high]
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:
PHP Code:

        if (substr_count($template,'?'.'>')>=or substr_count($template,'php?'.'>')>=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:

Code:

<?
$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:
Code:

...
<?
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:
[code]<? 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...
Quote:

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

Quote:

05-14-03 at 06:09 PM cirisme said this in Post #23
It doesn't work. :(

PHP code goes through (somewhat) unparsed. I can say:
[code]<? 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

Quote:

05-17-03 at 08:31 AM filburt1 said this in Post #25
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

Quote:

05-12-03 at 02:04 AM filburt1 said this in Post #15
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

PHP Code:

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,'?'.'>')>=or substr_count($template,'php?'.'>')>=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:

Quote:

<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:

Quote:

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:
Code:

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

bryanzera 05-21-2003 11:39 PM

Still doesn't seem to work right. this code:

Quote:

<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:

Quote:

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!!


All times are GMT. The time now is 11:50 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01736 seconds
  • Memory Usage 1,862KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (6)bbcode_code_printable
  • (2)bbcode_php_printable
  • (9)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (1)pagenav_pagelink
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (40)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.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
  • printthread_start
  • pagenav_page
  • pagenav_complete
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete