Hallo,
nunja die Meinung zu Templates ist sehr unterschiedlich. Bevor ich persönlich anfangen würde einen Template Parser zu schreiben (was in der Regel ganz gut mit
Preg-Replace funktioniert), würde ich mir persönlich lieber überlegen ob dies überhaupt notwendig ist. Schließlich wurde PHP konzipiert um mit einer Skriptsyntax auf C-Befehle zugreifen zu können (=> PHP ist eigentlich eine Templatesprache).
Klar, PHP-Funktionenen ist in jedem Fall ein wenig mehr arbeit... wenn man jedoch eine halbwegs klare Objektstruktur schafft, sind PHP-Templates deutlich schneller als jedes vergleichbare Parser-System.
Ich mittlerweile benutzte nur noch PHP-Templates, auch wenn einige Designer damit Probleme haben - höchstens hier würde ich vielleicht dazu neigen administrativ zu auf ein Parser basierendes Template-System zurückzugreifen - wobei ich versuche immer davon zu überzeugen, das es nicht ratvoll sein kann eine eigene Templatesprache zu lernen - schließlich ist reiner PHP-Code auch nicht komplizierter als die wirklich peverse und eigenwillige Syntax von so manchen Templatesystem.
Nunja, ich poste Dir einfach mal mein Template-Script - Es ist PHP5 aber relativ einfach gehalten
PHP:
<?
// file: template.class.inc
// written on 2005-10-09 by okuehn (irresponder.com)
class Template {
public $file = "";
private $variables = Array();
function __construct() {
return;
}
function __get($name) {
if (isset($this->variables[$name]))
return $this->variables[$name];
return false;
}
function __set($name, $value) {
if (!isset($this->variables[$name])) {
$this->variables[$name] = $value;
return true;
}
return false;
}
function display($file_path) {
if (is_file($file_path))
return $this->bufferFile($file_path);
return false;
}
function bufferFile($file) {
$result = "";
// referenz zu template-objekt herstellen
$_ = $this;
if (is_file($file)) {
ob_start();
include $file_path;
$result = ob_get_contents();
ob_end_clean();
return $result;
} else die ("Template '$file' not found!");
}
}
/*
Beispiel zur Verwendung (angepasst an angebenes Beispiel)
*/
$t = new Template();
$t->hw = 'Neuer Wert: Variable wird durch die Objekt-Funktion im $variables-Array der entsprechenden Instanz erzeugt ;).';
$t->document_title = 'Template-Test';
$t->css_file = './css/style.css';
$some_valid_mysql_query_result = mysql_query('SELECT * FROM `test`;');
$sql = Array();
while ($tmp = mysql_fetch_array($some_valid_mysql_query_result)) {
$sql[] = $tmp;
}
$t->sql = $sql;
// erstelle root-konstante
define(__ROOT__, dirname(__FILE__));
// ausgabe template file
echo $t->display(__ROOT__.'/test.tpl');
// ende
?>
/*** file: test.tpl ***/
<html>
<head>
<title><?php echo $_->document_title; ?></title>
<style type=text/css>
<?php echo file_get_contents($_->css_file); ?>
</style>
</head>
<body>
<table>
<tr>
<?php
// $key enthält in diesem Fall den Schlüssel des aktuellen Array-Indizies (0, 1 usw. ^= Rows)
foreach ($_->sql as $key => $value) { ?>
<td><?php echo $value['variable1']; ?></td>
<td><?php echo $value['variable2']; ?></td>
<td><?php echo $value['variable3']; ?></td>
<?php } ?>
</tr>
</table>
</body>
</html>
Das einzige Problem das ich mit PHP-Templates sehe ist das keinerlei Einschränkung der Funktionalität möglich ist, d.h. alle PHP-Funktionen können ausgeführt werden. Das kann aber auch mitunter recht hilfreich sein, gerade wenn man Objektorientiert arbeitet. Siehe Singleton-Pattern etc.
Wie mir meine Erfahrung bisher zeigte war nie verkehrt einfach gänzlich auf Template-Parser (was ja letzenendes Erleichterung verschaffen soll, den Projektcode aber eigentlich nur tierisch aufbläht) zu verzichten, die Inhalte die der Benutzer letzenendes verfasst benötigen in den wenigstens Fällen ein Template bzw. PHP-Code - Textile z. B. ist ein hervorragendes Mittel inhaltlichen Kontext zu formatieren.
Ok, ich denke ich könnte noch stundenlang weiterschreiben - Wie gesagt die Meinungen sind zahlreich und weitgreifen - mir reicht mein System vollkommen aus. Eine strikte Trennung zw. Template-Anwendungslogik und Benutzerinhalten ist allerdings grundsätzlich empfehlenswert, auch wenn ich vielleicht ein wenig vom Thema abschweife
Gruß