PHP: variabelen vervangen door code
De meeste templates engines die je op het Internet vindt, maken gebruik van de fopen en/of de file_get_contents functie. Dit werkt in principe hartstikke goed, behalve als je in je template zelf ook variabelen gebruikt, b.v. <title><?php echo $GLOBALS["applicatienaam"]; ?></title>. Deze functies lezen namelijk het bestand in als tekst en interpreteren derhalve geen “dynamische tags”. Het bovenstaande ECHO statement wordt daarom letterlijk geinterpreteerd i.p.v. geparsed.
Ik zocht een template engine die gebruik maakt van een dynamisch template EN waarbij ik zowel HTML/tekst als PHP code kan vervangen. Aangezien ik dat niet kon vinden (misschien niet lang genoeg gezocht), heb ik besloten er zelf een te maken. Onderstaande code is erg simpel en derhalve een “work in progress”…
index.php
<?php
//aanroepen van de functie-include
require_once (”function.template.php”);
//vullen van tijdelijke variabele, waarbij PHP code escaped moet worden!!
$pcontent = “<b>hier begint php: </b>”;
$pcontent .= “<?php”;
$pcontent .= ” echo \”cees\”;”;
$pcontent .= ” ?>”;
//aanroepen van de functie met pagetemplate.php als template file
generateOutput(”page.template.php”,array(”pagecontent” => $pcontent));
?>
page.template.php
<html>
<title><?php echo "Dynamische titel (uit database OF globals-var etc.)"; ?></title>
<body>
hieronder gaan we de variabele "pagecontent" vervangen....
<?php echo $pagecontent; ?>
</body></html>
function.template.php
<?php
function templateEval($content)
{
ob_start();
$content = str_replace('<'.'?php','<'.'?',$content);
eval('?'.'>'.trim($content).'<'.'?');
$content = ob_get_contents();
ob_end_clean();
return $content;
}
function generateOutput($file,$data=array())
{
foreach ($data as $key => $value)
{
$$key = templateEval($value);
}
include($file);
}
?>
Ik heb de code bewust even non-objectgeorienteerd gemaakt, maar een en ander is natuurlijk makkelijk in classes in te delen. Ik ga ervan uit dat alle built-in PHP functies goed geinterpreteerd worden door de templateEval-functie, maar denk eraan: dit is een eerste, ruwe versie….
Geen posts
geen opmerkingen...