Mit dieser Klasse lassen sich Templates laden und Platzhalter durch vorgegebene Werte ersetzen.
Moin,
ich habe mich durchaus gewundert, dass neben den tollen Codeschnipseln keine Template Klasse vorhanden ist.
Da ich sowieso bisher noch keine Codeschnipsel gepostet habe, wird es nun Zeit. Ich präsentiere eine meiner Klassen aus meinem Framework, die Template Klasse.
Im Prinzip ist an ihr nichts besonders, aber dafür unkompliziert. Hier ist schonmal das ganze Skript:
<?php
/*
* Simple Template Klasse
*
* Has been written by Dennis S.
* (c) 2010 bcreator.de
*/
//
// Template Properties: important functions for creating Templates
//
interface TProperties
{
/*
* @function replace(string find, string replace)
* @example replace("string_to_find", "to_replace")
*/
public function replace($find,$replace);
/*
* @function addFile(string File)
* @example addFile("Path/Filename.ext")
*/
public function addFile($File);
/*
* @function init()
* @description it returns the complete source
*/
public function init();
}
class Template implements TProperties
{
/*
* NOTICE: You can change here your schemes for replacing content
* WARNING: DO NOT CHANGE OR REMOVE THE [FILE_NAME] OR [REPLACE_DATA]
*/
const FILE_INCLUDE = '{include:[FILE_NAME]}'; // TMP - Include scheme -> {include:file.ext}
const TO_REPLACE_DATA = '{[REPLACE_DATA]}'; // Replace - scheme -> {replace}
/*
* Variable for the whole source
*/
protected $Source;
/*
* contruct class
*/
public function __construct($File)
{
// Check if file exists
if(file_exists($File))
{
$this -> Source = file_get_contents($File);
return true;
}
else
{
return false;
}
}
/*
* replace function
*/
public function replace($find,$replace)
{
$scheme = str_replace('[REPLACE_DATA]',$find,self::TO_REPLACE_DATA);
$this -> Source = str_replace($scheme,$replace,$this -> Source);
}
/*
* addFile function
*/
public function addFile($File)
{
if(file_exists($File))
{
$scheme = str_replace('[FILE_NAME]',$File,self::FILE_INCLUDE);
$this -> Source = str_replace($scheme,file_get_contents($File),$this -> Source);
return true;
}
else
{
return false;
}
}
/*
* init function
*/
public function init()
{
if($this -> Source !== null)
return $this -> Source;
}
}
?>
Bei den Kommentaren ist eigentlich schon alles erklärt, wie man die einzelnen Funktionen der Klasse bedient. Ein Beispiel werde ich aber trotzdem schreiben.
Als erstes müssen wir die Klasse "öffnen":
PHP
1:
2:
3:
4:
5:
<?php
...
$tpl = new Template('(Pfad)/BasisTemplate.ext');
...
?>
Zweiter Schritt wäre dann die einzelnen Funktionen zu verwenden, ich werde beide vorstellen:
PHP
1:
2:
3:
$tpl -> replace('title','Meine Seite'); // {title} wird zu Meine Seite
$tpl -> addFile('Test/Datei.tpl'); // {include:Test/Datei.tpl} wird durch den Content der Datei Test/Datei.tpl ersetzt
Letzter Schritt wäre dann nur noch zu Debuggen, also das Ergebnis auszugeben:
PHP
1:
2:
$tpl -> init();
Ihr könnt gerne Fragen an mich stellen,
Schöne Grüße
Dennis S.
PHP Design Patterns ist sehr empfehlenswert für fortgeschrittene PHP Programmierer.
Post wurde schon 2x editiert, das letzte mal am 06.06.2010 um 10:44 von Andavos
Das ganze hat einen kleinen Schönheitsfehler. Das einbinden einer weiteren Template Datei muß ja dann 2 mal angeben werden was doch etwas umständlich ist.
Wenn es schon in der Templatedatei selbst angeben wird welche Datei geladen werden soll dann sollte es nicht mehr notwendig sein dies nochmal in der Php Steuerungsdatei anzugeben.
Zu Erinnerung:
In der Templatedatei nennen wir sie BasisTemplate.ext selbst steht irgendwo mitten drin {include:Test/Datei.tpl}
Nun wird der Teil solange ignoriert bis von der Steuerungsdatei der addFile Befehl ausgeführt wird. Dies sollte aber nicht so sein den alle Information welche Datei geladen werden sollen sind bereits ja geben.
Daher sollte der Ersetztvorgang automatisch ablaufen. Ausnahme sind Platzhalter wo voher noch nicht bekannt ist welche Datei geladen werden soll.
PS.
Das ausgeben von Datenbank Inhalten fehlt in der Template Klasse auch noch.
Mfg Splasch
Post wurde schon 2x editiert, das letzte mal am 05.06.2010 um 22:41 von splasch
Orginal von splasch
Das ganze hat einen kleinen Schönheitsfehler. Das einbinden einer weiteren Template Datei muß ja dann 2 mal angeben werden was doch etwas umständlich ist.
Das ist kein Fehler, sondern Geschmackssache. Es ist völlig egal, ob die Dateiinhalte automatisch eingefügt werden.
Zitat:
Zu Erinnerung:
In der Templatedatei nennen wir sie BasisTemplate.ext selbst steht irgendwo mitten drin {include:Test/Datei.tpl}
Nun wird der Teil solange ignoriert bis von der Steuerungsdatei der addFile Befehl ausgeführt wird. Dies sollte aber nicht so sein den alle Information welche Datei geladen werden sollen sind bereits ja geben
Wieso ist es schlimm, wenn der Teil ignoriert wird?
Zitat:
Das ausgeben von Datenbank Inhalten fehlt in der Template Klasse auch noch.
Das ist unsinnig und gehört garantiert nicht zu einer standard-Template Klasse. Wenn du Datenbankinhalte ausgeben möchtest, verwende eine MySQL Klasse und kombiniere sie mit der Template Klasse.
Schöne Grüße,
Dennis S.
PHP Design Patterns ist sehr empfehlenswert für fortgeschrittene PHP Programmierer.
Post wurde schon 1x editiert, das letzte mal am 05.06.2010 um 23:15 von bcreator.de
Redunaz ist keine Geschmacksache sonderen weißt auf einen schlechten Programmierstil hin.
Zitat:
Das ist unsinnig und gehört garantiert nicht zu einer standard-Template Klasse. Wenn du Datenbankinhalte ausgeben möchtest, verwende eine MySQL Klasse und kombiniere sie mit der Template Klasse.
Du vergisst dabei die Html Formatierung bei der Ausgabe der Datensätze.
Beispiel du hast mehre Datensätze die in Tabelarischer Form ausgeben werden sollen.
<table>
// Datensatz 1
<tr>
<td>Datensatz-Spalte1</td>
<td>Datensatz-Spalte2</td>
<td>Datensatz-Spalte3</td>
</tr>
// Datensatz 2
<tr>
<td>Datensatz-Spalte1</td>
<td>Datensatz-Spalte2</td>
<td>Datensatz-Spalte3</td>
</tr>
// Datensatz 3
<tr>
<td>Datensatz-Spalte1</td>
<td>Datensatz-Spalte2</td>
<td>Datensatz-Spalte3</td>
</tr>
// und so weiter
</table>
Wie sieht da nun deine Template datei mit den Platzhaltern aus.Wenn du es kombinierst so wie du es gesagt hast werst du gezwungen die Html bfehle in die Steuerung datei zu schreiben.
Somit hättes du dann aber keine Template trennung mehr.
Mfg Splasch
Post wurde schon 3x editiert, das letzte mal am 05.06.2010 um 23:26 von splasch
Man kann genauso gut und elegant mehrmals diese Klasse verwenden.
Gib uns doch bitte ein Beispiel zu der oben genanten Template struktur(Tabelarische Ausgabe). Wie du bei der Datenbank Ausgabe die Klasse mehrmals nutz.Bei jeden Datensatz 1 mal oder wie ist das zu verstehen?
//
// Definiere $tpl, $mysql
//
$tpl = new Template('Template/layout.tpl');
$mysql = new mysql('server','username','******','database');
try
{
if(!$mysql -> isConnection())
throw new Exception('Fehler, konnte keine Verbindung zum MySQL Server herstellen!');
} catch(Exception $e) { print $e -> getMessage(); }
$tpl -> replace('page.title','Meine Homepage');
//
// Beginning of Content
//
$tpl -> addFile('Template/content.tpl');
$mysql_datas = '<table>';
$mysql -> query("SELECT * FROM vehicles WHERE kind='car'");
Nun hast du doch wieder Html befehle in deiner Steuerungsdatei. Und das schon bei einen sehr einfachen Html aufbau.
Ps.
Wie weit die übersichtlichkeit dabei bewahrt bleibt ist nee andere sache wenn man für jeden kleinen Teil eine neue Template Datei erstellen muß. Die Lösung mag zwar funktionieren ist aber umständlich.
Mfg Splasch
Post wurde schon 4x editiert, das letzte mal am 06.06.2010 um 00:32 von splasch
Orginal von splasch
Nun hast du doch wieder Html befehle in deiner Steuerungsdatei.
Wie weit der Speicher überladen wird sei mal dahingestellt.
(Und pro Datensatz 1 Template Objekt)
Mfg Splasch
Gut, den HTML Befehl kann ich ja rauslassen und wieder meine Template Klasse verwenden, ist ja kein Ding.
Der Speicher wird bei 3 Datensätzen wohl kaum überladen. Und wenn ich meinetwegen Tausend Datensätze hätte, würde es so oder so lange laden. Hier gibt es nun nichts mehr zu meckern.
Ich gehe schlafen, ich habe keine Lust mehr über so einen Kinderkram zu diskutieren.
Wiedersehen,
Dennis S.
PHP Design Patterns ist sehr empfehlenswert für fortgeschrittene PHP Programmierer.
Post wurde schon 1x editiert, das letzte mal am 06.06.2010 um 00:30 von bcreator.de
Gute nacht. Da das gleiche Objekt immer wieder überschrieben wird sollte das mit dem Speicher kein Problem werden da er dadurch auch wieder gelöscht wird.
Hab ich vorhin übersehen. Ist ja auch schon Spät.
Aber mal schön auch andere Lösungsansetze zu sehen. Die meist verwendeten Sachen sollte man am besten immer gleich mit als Beispiel angeben.