ERLEDIGT
NEIN
NEIN
ANTWORTEN
21
21
ZUGRIFFE
725
725
EMPFEHLEN
-
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.HTML-Code:<html> <head> <title>HALLO!</title> </head> <body> Zuletzt geändert am {lastchange}! {content} </body> </html>
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?HTML-Code:<a href="www.deine-domain.de?content=cont_news.php" class="impressum">News</a>
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.PHP-Code:<?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 );
?>
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
-
Ein mir aufgefallener Fehler ist, dass die $insert-Variable nur innerhalb der Aufrufe der Methoden setvalue() und inserts() existiert.
Markus Wulftange
-
Also wenn du nicht ausweichen willst auf andere Templates, wie wäre es mit meinem Tutorial?
Okay, eventuell ist es noch nicht freigeschaltet, daher mal mein Vorschlag:
Du erstellst eine variables.php, ich benutze immer die Struktur:
root/languages/german/main.php
root/templates/standard/index.tplPHP-Code:$lang['hallo'] = 'Hallo';
root/index.phpPHP-Code:<?php echo $lang['hallo']; ?>
Und schon kannste indem du jedesmal dies hier benutzt <?php echo $lang['hallo']; ?> eine Variabel einsetzen.PHP-Code:include('languages/german/main.php');
include('templates/standard/index.tpl');

Soweit habe ich das verstanden, oder suchst du noch etwas anderes?
-
@Radiate: Ich verstehe, was du meinst, sehe allerdings den Sinn dahinter nicht. Ich wollte mein Design schon complett vom Programmcode trennen. Kannst mir ja mal den Link zu deinem Tutorial geben.
@Gumbo: Soll das heiße, dass ich diese Variable global machen muss? Oder wie muss ich das ändern, damit es stimmt?
Danke für eure schnelle Antwort!
MfG, Andy
-
Also soweit ich das sehe, kann man unmöglich den Code vom Design trennen!
Das ist einfach undenkbar.
Der Grund dürfte klar sein, weil du variabeln einsetzen willst um Daten aus einer Datenbank einzusehen, daher weiß ich gerade nicht ob mein Tutorial über diesen Link angezeigt wird, wenn ja dann ist es hier:
http://www.tutorials.de/forum/tutori...variablen.html
Also meine Variante benötigt keine Template-Engine, lediglich gute übersicht der Verzeichnisse es seidenn du ballerst alles in ein Verzeichnis.
Gruß
-
Nein das heißt es nicht unbedingt. Es reicht sie in der Klasseninstanz global verfügbar zu haben. Eine eigenes Klassenattribut reicht dafür also aus.
Markus Wulftange
-
Also auf das Tutorial darf ich schonmal nicht zugreifen. Da habe ich keine Rechte. Und warum sollte das nicht gehen? Mann erstellt eine reine Html- oder besser noch XHTML-Seite, die das Grundlegende Design beinhaltet. An all jene Stellen, wo nun allerdings php-code eingefügt werden soll, setzt man, wie von mir beschrieben Platzhalter.
Ein anderes Script greift sich diese Html oder XHtml datei und sucht nach Platzhaltern. Wenn sie diese Gefunden hat ersetzt es sie automatisch speichert das ganze in einer Variable und gibt es aus.
Datenbank? Wer? Wie? WO? WAS? Grund? Hab ich doch nichts von hgesagt und selbst wenn dann leuchtet mir dein Grund nicht ein.
Also so?
MfG, AndyPHP-Code:<?php
class template {
private $t;
private $insert;
.......
}
?>Geändert von Avedo (31.05.07 um 18:44 Uhr)
-
Öhm, sry.

Datenbank war natürlich ein Weg, im Normalfall nimmt man Variabeln oder Einträge aus einer File namens *.php.
Aber auch hier müssen deine Sogenannten Platzhalter in den Design Code rein, sprich, sie werden ersetzt durch deinen in irgendeiner Datei festgelegten Werte.
So, nun ist hier meine Theory aber richtig, statt solche Platzhalter kannste doch auch dieses hier benutzen, ist halt nur etwas länger als {WERT} , meine -> <?php echo $var['WERT']; ?>.
Verstehst du nun was ich meine?
-
Variablen sind auch nichts anderes als Platzhalter für andere Werte, nämlich für die Variablenwerte.
Markus Wulftange
-
Ja das wusste ich, doch um solche Platzhalter zu benutzen benötigt man doch meines Wissens nach eine Engine, also eine Template-Engine, oder nicht?
Und ich habe mir diese Technik von phpBB abgeschaut, die verwenden genau das wie ich es benutze.
Also nicht falsch verstehen, ich benutze deren Technik!
-
Ich wollte es nun leider aber mit einer Template Engine lösen, und habe mir dazu ja auch eine kleine eigene Template Klasse gebastelt.
Trotz error_reporting(E_ALL); erhalte ich keine Fehlermeldungen. Meine Links sehen allerdings so:
statt so:Code :1
http://www.puk.de/sorsmc/test/%3Cserver%3E?content=cont_news.php
aus.Code :1
http://www.puk.de/sorsmc/test/index?content=cont_news.php
Und keiner der Platzhalter wird ersetzt. Wo liegen meine Fehler?
MfG, Andy
-
Also so wie ich das sehe machst du das ganze Online, gehe ich richtig der Annahme?
Wenn das so ist, dann musste die Links nicht mit dem genauen URL und der Linknamen bezeichnen, du solltest nur darauf achten das du deinen vollständigen ROOTPFAD in der php.ini drin stehen hast was echt hart zu knacken ist, weil du ja wahrscheinlich keinen Zugriff darauf hast.
Also solltest du dies in deiner Klasse definieren, also nicht define() sondern eintragen, etwa so:
/usr/export/www/hosting/espoleon/com/templates/subSilver/
Also das ist bloß ein Beispiel aber da sollten dann deine PFADE drin stehen.
p.s. das fällt mir erstmal dazu ein
-
So die Anmerkung von Cumbo hat mir schon etwas geholfen. Musste die funktion setvalue() wie folgt anpassen, damit fasst alle Platzhalter ersetzt werden.
Das Problem, dass der Platzhalter für den Content niccht ersetzt und das ersetzte angezeigt wird bleibt.PHP-Code:<?php
/* Den einzelnen Platzhaltern ihre Inhalte zuweisen */
public function setvalue( $name , $inhalt ) {
global $insert;
$insert .= "{" . $name . "}" . $inhalt . "{/" . $name . "}";
}
?>
MfG, Andy
-
Irgendwie verstehe ich das nicht.
In dem Beispiel Code von gaaanz oben sieht dein Platzhalter wie folgt aus {lastchange}.
Deine setValue Methode baut die Platzhalter wie folgt auf (am Beispiel von "change" aus deinem Codesnippet): {change} CONTENT {/change}.
Das eigentliche ersetzen erfolgt dann in insert() mit dem preg_match_all. Dort nimmst du alles wieder auseinander, die matches werden dann in loops gegen den Content getauscht. Alles läuft über den $insert, was ein String ist. Hmm, ich finde das alles sehr kompliziert und mit dem preg_match_all, der folgenden foreach Schleife nicht gerade performant.
Weitere Probleme habe ich auch mit der loadContent() Methode. Diese hat als Rückgabewert den Inhalt des Templates (oder was da included wird).
Diese Methode der klasse rufst du wie folgt auf: $t->loadcontent($_GET['content']);
Wohin wird denn da der return $newcont zurückgegeben?
Wäre es nicht wie folgt einfacher:
Dein Template enthält die Platzhalter in der Form {lastchange}, so wie du es bis jetzt auch hast.
Deine SetValue() Methode würde ich umschreiben zu:
Nun wird das Template geladen sagen wir mal in klassenvariable $this->template (als Beispiel, bei dir in der insert() mit file_get_contents)PHP-Code:public function setvalue($tag, $value)
{
// vorher in der klasse noch ein private $platzhalter;
$complete_tag = '{'.$tag.'}';
$this->platzhalter[$complete_tag] = $value;
}
Jetzt werden einfach die Tags ersetzt durch die Values
Beispiel:
Das ganze weicht natürlich stark von deinem Ablauf ab und ist nur eine grobe Idee und ich weiss nicht, ob dies überhaupt eine gute Umsetzung hinsichtlich Geschwindigkeit ist (dieses str_replace konstrukt mit array_keys und _values).PHP-Code:function parsetemplate()
{
echo str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->template);
}
Ansonsten einfach mein Post ignorieren
-
01.06.07 19:43 #15
- Registriert seit
- Feb 2003
- Ort
- Österreich / Feldkirch
- Beiträge
- 135
Ich hab mir jetzt den Code nicht genau angeschaut aber wieso def. du die Platzhalter so kompliziert?
Ich hab das bei mir so gemacht <irgenwelcher html code>[{platzhalter1}]htmlcode...
Die html Datei wird schritt für schritt abgearbeitet.
Jede Zeile überprüfen ob ein Platzhalter vorhanden ist.
Ist kein Platzhalter vorhanden --> Zeile also den reinen eingelesenen html Code ausgeben.
Ansonsten htmlcode + neuen Code z.B.: aus DB + html code ausgeben
Du kannst so auch dyn. code ausführen.
Ein paar Nachteil bei diesem System sind:
Header funktioniert nur bedingt wenn ob_start() vorhanden ist
eingebaute dyn. Seiten können nicht mehr flexibel eingesetzt werden.
Ähnliche Themen
-
Template System...
Von Vectormaster im Forum PHPAntworten: 12Letzter Beitrag: 05.03.09, 12:41 -
Template system?
Von Kalma im Forum PHPAntworten: 1Letzter Beitrag: 11.07.06, 17:48 -
Template System
Von mtk-flo im Forum PHPAntworten: 6Letzter Beitrag: 08.03.06, 14:54 -
Template-System
Von undertaker im Forum PHPAntworten: 8Letzter Beitrag: 11.03.04, 19:49 -
template system
Von js-mueller im Forum PHPAntworten: 4Letzter Beitrag: 06.03.03, 16:49





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren