B
Bgag
Hallo!
Ich habe schon viel über Template-systeme gelesen und mir smarty angeschaut, aber weitergekommen bin ich nur teilweise. Die meisten Tutorials haben mir nicht geholfen und tutorials.de habe ich schon vollkommen auf den Kopf gestellt. NICHTS!
Ich bräuchte folglich eure Hilfe.
Also ein Template-System ermöglicht die Trennung von Webdesign und Programmcode, damit der Webdesigner un der Programmierer getrennt arbeiten können. Wie funktioniert also das ganze?
Man hat zwei Hauptdateien:
1) Die Template Datei: template.tpl (in meinem Beispiel)
2) Die Datei, die den Programmcode in das Template einfügt: index.php (in meinem Beispiel)
So die Template-Datei enthält nun reinen HTML-CODE, in den, an den Stellen wo später der Programmcode stehen soll, Platzhalter eingesetzt sind. Diese können beliebig aussehen. Z.B.: {Platzhalter} oder [Platzhalter] oder #Platzhalter#
Code:
Doch was macht nun meine index.php? Als erstes bekommt sie per link den Namen der Datei übermittelt, die anstelle des Platzhalters {content} eingefügt werden soll.
Code:
Hier soll für den Platzhalter {content} also der Inhalt der Datei cont_news.php eingefügt werden. Des weiteren soll der Platzhalter {lastchange} durch die aktuelle Uhrzeit ersetzt werden. Wie sieht nun das Script dazu aus?
PHP-Code:
So! Wie einigen gleich auffallen wird, führe ich den Inhalt der per Link übergebenen Datei cont_news.php per include() aus, halte jedoch die Ausgabe mit ob_start() zurück und speicher die Rückgabe stattdessen in einer Variable. Diese Variable enthält nun nur noch Design-Code, denn der Programmcode wurde bereits ausgeführt.
Nun kann man das irgendwie auch mit eval() lösen, wobei aber weitere Probleme auftreten. Und zwar gibt es bei eval() auch eine Fehlermeldung, wenn der von eval() bearbeitete String keinen php-code enthält, was in meinem content nicht automatisch der fall sein muss, denn ich kann an Stelle des Platzhalters {content} sowohl php-code als auch einfachen html-code einfügen wollen. Zudem schafft eval() eine große Sicherheitslücke, da jeglicher Code der mit eval() behandelt wird auch ausgeführt wird. So wirdauch der Code ausgeführt, den ein User in ein Gästebuch schreibt, das dann seine Einträge mit Hilfe einer Template -Engine Kreiert.
Ich will also einfach nur das unveränderliche Design vom variablen Content trennen, um für mich die Sache einfacher und übersichtlicher zu halten.
Nun endlich meine Fragen:
Wo liegt mein Fehler in meinen Überlegungen bzw. in meinen Scripten?
Gibt es Verbesserungsvorschläge?
Eine Möglichkeit den Code zu verkürzen.
Ich entschuldige meine langen Ausführungen, aber ich dachte es wäre wichtig, um euch auf den aktuellen Stand meiner Erkenntnis zu bringen. Ich möchte des weiteren an dem Vorhaben dies selbst umzusetzen (natürlich manchmal mit eurer hilfe ;D ) festhalten und nicht auf Smarty / FastTemplate / EasyTemplate und COKG ausweichen.
Ich bedanke mich für euer Verständnis und eure Geduld!
MfG, Andy
Ich habe schon viel über Template-systeme gelesen und mir smarty angeschaut, aber weitergekommen bin ich nur teilweise. Die meisten Tutorials haben mir nicht geholfen und tutorials.de habe ich schon vollkommen auf den Kopf gestellt. NICHTS!
Ich bräuchte folglich eure Hilfe.
Also ein Template-System ermöglicht die Trennung von Webdesign und Programmcode, damit der Webdesigner un der Programmierer getrennt arbeiten können. Wie funktioniert also das ganze?
Man hat zwei Hauptdateien:
1) Die Template Datei: template.tpl (in meinem Beispiel)
2) Die Datei, die den Programmcode in das Template einfügt: index.php (in meinem Beispiel)
So die Template-Datei enthält nun reinen HTML-CODE, in den, an den Stellen wo später der Programmcode stehen soll, Platzhalter eingesetzt sind. Diese können beliebig aussehen. Z.B.: {Platzhalter} oder [Platzhalter] oder #Platzhalter#
Code:
HTML:
<html> <head> <title>HALLO!</title> </head> <body> Zuletzt geändert am {lastchange}! {content} </body> </html>
Doch was macht nun meine index.php? Als erstes bekommt sie per link den Namen der Datei übermittelt, die anstelle des Platzhalters {content} eingefügt werden soll.
Code:
HTML:
<a href="www.deine-domain.de?content=cont_news.php" class="impressum">News</a>
Hier soll für den Platzhalter {content} also der Inhalt der Datei cont_news.php eingefügt werden. Des weiteren soll der Platzhalter {lastchange} durch die aktuelle Uhrzeit ersetzt werden. Wie sieht nun das Script dazu aus?
PHP-Code:
PHP:
<?php
/* Deklarieren von Inhalten, die auf PHP basieren und immer für bestimmte Platzhalter eingesetzt werden müssen */
$lastchange = filemtime(basename($_SERVER['PHP_SELF']));
$last_change = date("d.m.Y H:i", $lastchange);
$copyright = date("Y");
$url = $_SERVER['PHP_SELF'];
/* Die Klasse Template*/
class template {
private $t;
/* Template anlegen */
public function __construct($template) {
$this->t = $template;
}
/* Den Content laden */
public function loadcontent($content) {
ob_start();
include $content;
$newcont = ob_get_contents();
ob_end_clean();
return $newcont;
}
/* Den einzelnen Platzhaltern ihre Inhalte zuweisen */
public function setvalue( $name , $inhalt ) {
$insert .= "{" . $name . "}" . $inhalt . "{/" . $name . "}";
}
/* Platzhalter im Template finden, ersetzen und letztendlich das ganze ausgeben*/
public function inserts($insert) {
$html = file_get_contents( $this->t );
preg_match_all("|{[^}]+}(.*){/[^}]+}|U", $insert, $extract, PREG_PATTERN_ORDER);
for ($i=0;$i<count($extract[0]);$i++) {
$search = substr($extract[0][$i],0,strpos($extract[0][$i],"}")+1);
$replace = $extract[1][$i];
$html = str_replace($search, $replace, $html);
}
echo $html;
}
}
$t = new Template("template.tpl");
$t->loadcontent($_GET['content']);
$t->setvalue( "change" , $last_change );
$t->setvalue( "server" , $url );
$t->setvalue( "copy" , $copyright );
$t->setvalue( "content" , $newcont );
$t->inserts( $insert );
?>
So! Wie einigen gleich auffallen wird, führe ich den Inhalt der per Link übergebenen Datei cont_news.php per include() aus, halte jedoch die Ausgabe mit ob_start() zurück und speicher die Rückgabe stattdessen in einer Variable. Diese Variable enthält nun nur noch Design-Code, denn der Programmcode wurde bereits ausgeführt.
Nun kann man das irgendwie auch mit eval() lösen, wobei aber weitere Probleme auftreten. Und zwar gibt es bei eval() auch eine Fehlermeldung, wenn der von eval() bearbeitete String keinen php-code enthält, was in meinem content nicht automatisch der fall sein muss, denn ich kann an Stelle des Platzhalters {content} sowohl php-code als auch einfachen html-code einfügen wollen. Zudem schafft eval() eine große Sicherheitslücke, da jeglicher Code der mit eval() behandelt wird auch ausgeführt wird. So wirdauch der Code ausgeführt, den ein User in ein Gästebuch schreibt, das dann seine Einträge mit Hilfe einer Template -Engine Kreiert.
Ich will also einfach nur das unveränderliche Design vom variablen Content trennen, um für mich die Sache einfacher und übersichtlicher zu halten.
Nun endlich meine Fragen:
Wo liegt mein Fehler in meinen Überlegungen bzw. in meinen Scripten?
Gibt es Verbesserungsvorschläge?
Eine Möglichkeit den Code zu verkürzen.
Ich entschuldige meine langen Ausführungen, aber ich dachte es wäre wichtig, um euch auf den aktuellen Stand meiner Erkenntnis zu bringen. Ich möchte des weiteren an dem Vorhaben dies selbst umzusetzen (natürlich manchmal mit eurer hilfe ;D ) festhalten und nicht auf Smarty / FastTemplate / EasyTemplate und COKG ausweichen.
Ich bedanke mich für euer Verständnis und eure Geduld!
MfG, Andy