Template mit file_get_contents und if/else im Template

dwex

Erfahrenes Mitglied
Hallo Leute,

ich habe vor einiger Zeit mal einige Skripte geschrieben mit denen ich eine Template-Datei (template.tpl) über file_get_contents() einlese und darin Ersetzungen vornehme und dann das ganze ausgebe. Gleich vorne weg - ich kann aus div. Gründen leider NICHT auf eine Template-Engine (z. B. Smarty) zurückgreifen.

Ein Beispiel:

PHP-Datei:
PHP:
$template = file_get_contents('template.tpl');

$template = str_replace("[NAME]", $name, $template);

echo $template;

Template-Datei:
HTML:
<div>Hallo [NAME]</div>

Das funktioniert ja bestens.

Jetzt würde ich aber gerne eine if/else-Prüfung (ggf. auch ohne else-Teil einbauen (z.B. wie bei Smarty) - also nach dem "Motto":

Template-Datei:
HTML:
{if $var == "foobar"}
<div>Hallo [NAME]</div>
{else}
<div>Sehr geehrter Besucher</div>
{/if}

Und jetzt kommen wir zu meinem Problem:
Ich habe keine Ahnung wie ich das machen soll und je länger ich mir den Kopf darüber zerbreche desto weniger kommt was vernünftiges raus. Und mit RegEx stehe ich ja auch auf Kriegsfuß wie Ihr wisst.

Ich würde mich über eure Hilfe sehr freuen und bedanke mich im voraus dafür.
 
Ich habe diverse Vorschläge, erstmal den hier. Wenn er dir nicht zusagt, kommt was anderes ;-)

Vorschlag 1:

Verwende eval()

Du fütterst den String, der bei file_get_contents() rauskommt, nach dem du alle deine Ersetzungen getätigt hast, an eval(). Das bedeutet, du kannst ganz normal PHP-Tags in deinen Code einbauen und auch PHP-Code im Template verwenden. Bevor du eval() rufst, aktivierst du noch Output-Buffering und nach dem eval() ausgeführt wurde, holst du den Output-Buffer ab und speicherst ihn in einer Variable. Dann kannst du damit machen was du willst. Beispiel:

PHP:
ob_start();
$str = file_get_contents('datei.tpl');
// Jetzt ersetzen, was auch immer du magst...
$str = str_replace(.....);
// Danach eval()
eval($str);
$str = ob_get_clean();

Nachteil: eval() ist evil!
Vorteil: Du musst an deiner bisherigen Implementierung so gut wie nichts ändern und kannst deine Templates prima mit PHP-Code vollfrachten.

EDIT: Der obige Code ist unvollständig, und bedarf einer Prüfung. Näheres im PHP-Manual. Der Beitrag stellt lediglich einen Lösungsvorschlag und keine komplette Lösung dar.
 
Zuletzt bearbeitet:
An eval() hatte ich auch schon gedacht - diese Lösung erschien mir jedoch nicht sehr elegant und wie du schon sagst eval() ist evil.

Kannst du mir mal deinen Vorschlag 2 präsentieren :rolleyes:
 
Das geht ja wie am laufenden Band hier :)

Den Vorschlag muss ich mir mal ansehen - hast du in der zwischen zeit auch noch einen weiteren ;-)
 
Also ich habe jetzt mal mit eval() experimentiert.
Leider bekomme ich einen Fehler:
Code:
Parse error: syntax error, unexpected '<' in /srv/www/htdocs/view.php(340) : eval()'d code on line 1

Wenn denn mein erstes < unerwartet ist - wie soll ich dann überhaupt sowas parsen****?
 
Zuletzt bearbeitet:
Du musst prüfen, ob der String mit <?php anfängt. Ist das nicht der Fall, solltest du <?php ?> vorn an den String anhängen. Aber probier doch mal den Vorschlag mit include(). Ist IMHO etwas eleganter.
 
Wie meinst du das mit include?

Soll ich
PHP:
$template = include(DATEI);

$template = str_replace("[NAME]", $name, $template);

echo $template;
machen :confused:

PS:
Das mit <?php ?> am Anfang der Datei funktioniert auch nicht.
 
Zuletzt bearbeitet:
Zurück