Eval in einer klasse

Wozu jagst du den Inhalt der Templatedatei denn durch eval()?
eval() ist dazu um PHP Code auszuführen, in der Templatedatei ist aber nicht das geringste bisschen PHP enthalten (und es wäre auch unsinnig in dem Template PHP nutzen zu können, da der ganze Sinn (imho) von Templates in der Regel der ist, PHP und (X)HTML voneinander zu trennen).

Lass das eval weg, genau wie das komische Konstrukt in test.php!

Stattdessen kannst du das so machen:

$templateparser = new templateparser("template.html", array("%title%" => "Testseite", "%date%" => date("d.m.Y - H:i"), "%copy%" => "(c) mk"));

Ich würde dir vorschlagen, die Templates einfach per include einzubinden :wink: Und ja, Templates dürfen für mich PHP enthalten, solange es nur zur Ausgabe von Variablen gedacht ist (Arrays dürfen auch per Schleife ausgegeben werden)

[code]<?php
function display($template, &$params = null, $_pf_return=false) {
$tmpl_path = $template.’.php’;
if (!file_exists($tmpl_path) ) return false;
if ($_pf_return==true) ob_start();
@extract($params);
include($tmpl_path);
if ($_pf_return==true) return ob_get_clean();
return true;
}

display(“test”, array(“title” => “Hallo”, “text” => “MeinText”));
?>

[/code]
Ein Template sieht dann z.B: so aus: (test.php)

[code]

<?php echo $title; ?>

<?=$title?>

<?php echo $text; ?>

[/code] Edit: [url=http://www.php.net/manual/de/control-structures.alternative-syntax.php]die alternative Syntax für Kontrollstrukturen[/url] ist dafür sehr gut geeignet, und falls vorhanden auch die Short-Tags <?=$variable?> für <?php echo $variable;?>

Mein Ansatz läuft darauf hinaus, dass du kein PHP-Code in den Template einsetzt, sondern alles vorher berechnest, wie im Beispiel mit der date-Funktion.

Hi,

@balmung
Wieso soll ich kein PHP in Templateklassen zulassen? PHP wird von den Entwicklern selbst auch als Templateengine bezeichnet. Ein Zendmitbegründet meinte sogar, man solle doch Templateklassen weglassen und PHP benutzen :wink:
Deshalb halte ich Templateklassen mit Platzhaltern nicht für schlecht, nur jedes Mal str_replace auszuführen ist irrsinn. Lieber kompiliert mal einmal die Datei, wandelt sie also in PHP um, schreibt sie in cache und fertig. Nachher werden Variablen dann von PHP ersetzt. So kann man auch die Lösung von prograndy für nicht PHP-Programmierer vereinfachen, indem man zum Beispiel {$title} in <?php echo $title; ?> umwandelt. :wink:

In dem Fall ist es auch eine komplett andere Geschichte. Im “reinen” Template ist aber trotzdem kein PHP vorhanden (nur in den Cache Dateien) und den Cache kann man dann am einfachsten mit include oder ähnlichesm einbinden (auf jeden Fall besser als eval() in dem Fall).
Nichtsdestotrotz gibt es in dem ersten Beispiel keine Anzeichen eines Cache oder einer ähnlichen Funktion, deshalb hielt ich die Variante mit eval für unsinn, da ohnehin kein PHP im Template vorhanden ist.


PS: Ich bevorzuge ja XSLT als Template Engine. der XSLTProcessor ist hier auf bplaced installiert, d.h. PHP kann Serverseitig die Templates parsen lassen, oder es auf die Browser auslagern (außer dem IE natürlich).

mfg Balmung