Guten Morgen,
in diesem Tutorial zeig ich euch, wie man sich selber eine sehr einfache Template Engine basteln kann. Aber warum eine eigene Template Engine implementieren, wenn es doch genügend davon gibt!?
Tja, eine eigene Engine hat viele Vorteile, sie kann schnell, flexibel, leicht erweiterbar, usw. sein. Nehmen wir z.B. Smarty, bei Smarty muss man mit Tags arbeiten, welche danach ersetzt werden, sprich das Template muss geparset werden was bei großen Templates einfach Zeit kostet. Klar gibt es Caching, damit das ganze schneller wird, aber wieso sollte man alles so umständlich mit Tags machen, wenn doch PHP selbst als Template Sprache entwickelt wurde.
Deshalb zeig ich euch wie man schnell eine einfache Template Engine, die ihren Zweck erfüllt, implementiert.
Die Klasse nennen wir Template:
Als nächstes brauchen wir ein Array, indem wir die ganzen Daten speichern.
Dann brauchen wir noch eine Variable, in der wir die Instanz vom FrontController speichern.
So, nun kommen wir zu den einzelnen Methoden der Klasse.
Im Konstruktor holen wir uns einfach die Instanz des FrontControllers. Mit der assign()-Methode werden die Daten ans Template geschickt, sie dient zum Registrieren von Variablen, auf die wir später im Template zugreifen.
Jetzt kommen wir zur wichtigsten Methode dieser Klasse, nämlich der display()-Methode. Dieser Methode, wird der Name des Templates übergeben welches angezeigt werden soll.
Das wars dann auch schon mit der display-Methode. Man könnte natürlich jetzt noch hergehen, und die Fehlermeldung als eigenständiges Template erstellen.
Kommen wir zu den letzten beiden Methoden der Klasse.
Ok, jetzt zeig ich euch wie man diese Template Engine einsetzt.
Main.tpl.php
In diesem Template wird zuerst der Header (stellt eine eigene Action dar) includiert, danach kommen die normalen ausgaben, und zuletzt wird der Footer (stellt auch eine eigene Action dar) includiert.
So weit so gut, jetzt brauchen wir aber noch die Action zum Template.
Und das wars dann auch schon, wie Ihr seht ist es nicht sonderlich schwer eine einfache aber denoch effektive Template Engine zu implementieren. Man kann natürlich jetzt noch diverse veränderungen sprich verbesserungen vornehmen, so könnte man z.B. mit den Methoden __set() und __get() arbeiten, welche einem das Leben nochmal erleichtern.
Im Anhang findet Ihr alle benötigten Dateien.
in diesem Tutorial zeig ich euch, wie man sich selber eine sehr einfache Template Engine basteln kann. Aber warum eine eigene Template Engine implementieren, wenn es doch genügend davon gibt!?
Tja, eine eigene Engine hat viele Vorteile, sie kann schnell, flexibel, leicht erweiterbar, usw. sein. Nehmen wir z.B. Smarty, bei Smarty muss man mit Tags arbeiten, welche danach ersetzt werden, sprich das Template muss geparset werden was bei großen Templates einfach Zeit kostet. Klar gibt es Caching, damit das ganze schneller wird, aber wieso sollte man alles so umständlich mit Tags machen, wenn doch PHP selbst als Template Sprache entwickelt wurde.
Deshalb zeig ich euch wie man schnell eine einfache Template Engine, die ihren Zweck erfüllt, implementiert.
Die Klasse nennen wir Template:
PHP:
<?php
class Template {
Als nächstes brauchen wir ein Array, indem wir die ganzen Daten speichern.
PHP:
private $vars = array();
Dann brauchen wir noch eine Variable, in der wir die Instanz vom FrontController speichern.
PHP:
private $controller = null;
So, nun kommen wir zu den einzelnen Methoden der Klasse.
PHP:
public function __construct() {
$this->controller = FrontController::getInstance();
}
public function assign($name, $value) {
$this->vars[$name] = $value;
}
Im Konstruktor holen wir uns einfach die Instanz des FrontControllers. Mit der assign()-Methode werden die Daten ans Template geschickt, sie dient zum Registrieren von Variablen, auf die wir später im Template zugreifen.
Jetzt kommen wir zur wichtigsten Methode dieser Klasse, nämlich der display()-Methode. Dieser Methode, wird der Name des Templates übergeben welches angezeigt werden soll.
PHP:
public function display($template) {
//Der Name des Templates ist so aufgebaut, moduleName.TemplateName
//Der FrontController splittet uns das ganze auf
$action = FrontController::getActionName($template);
$module = FrontController::getModuleName($template);
$strTemplate = './modules/' . $module . '/templates/' . $action.'.tpl.php';
// Hier wird geschaut, ob es das Template überhaupt gibt.
// Falls es das Template nicht gibt, wird eine Fehlermeldung generiert.
if ((! file_exists($strTemplate)) || ! is_readable($strTemplate)) {
$tmpError = "<div style=\"text-align: center; background-color: #E0E0E0; display: block; color: #000000; width: 100%; height: 400px;\" >\n";
$tmpError.= "\t<div style=\"padding-top: 180px; font-size: 14px; font-weight: bold;\">\n";
$tmpError.= "\tDas Template " . $action . ".tpl.php konnte nicht angezeigt werden!\n";
$tmpError.= "\t</div>\n";
$tmpError.= "</div>\n";
}
// Fall kein Fehler aufgetreten ist, wird das Template angezeigt. Ansonsten
// wird die Fehlermeldung ausgegeben.
if (is_null($tmpError)) {
include($strTemplate);
} else {
echo $tmpError;
}
return;
}
Das wars dann auch schon mit der display-Methode. Man könnte natürlich jetzt noch hergehen, und die Fehlermeldung als eigenständiges Template erstellen.
Kommen wir zu den letzten beiden Methoden der Klasse.
PHP:
// Mit dieser Methode, kann man andere Actions aus dem Template heraus
// includieren. Man könnte so z.B. den Header und Footer in eingenes Template
// auslagern.
public function includeAction($completeName) {
$this->controller->includeAction($completeName);
}
// Mit dieser Methode holen wir uns die vorher registrierten Variablen.
// Wird eine Variable nicht gefunden, so wird Null zurück gegeben.
public function get($name) {
if (! isset($this->vars[$name])) {
return null;
}
return $this->vars[$name];
}
}
?>
Ok, jetzt zeig ich euch wie man diese Template Engine einsetzt.
Main.tpl.php
PHP:
<?php
$this->includeAction('main.IncMainHeader');
?>
<h1>Dies ist unser erstes Template!</h1>
<p>
Hier wird dann ein Text angezeigt!
<br />
<?php
//Hier holen wir uns eine Variable, die wir in der Action registriert haben.
echo $this->get('text');
?>
</p>
<?php
$this->includeAction('main.IncMainFooter');
?>
In diesem Template wird zuerst der Header (stellt eine eigene Action dar) includiert, danach kommen die normalen ausgaben, und zuletzt wird der Footer (stellt auch eine eigene Action dar) includiert.
So weit so gut, jetzt brauchen wir aber noch die Action zum Template.
PHP:
<?php
class Main extends Action {
public function __toString() {
return 'Die Main Action';
}
public function run() {
// Hier instanzieren wir die Template Engine
$tpl = new Template();
// Der Text den wir ausgeben wollen.
$text = 'Dies ist ein Text der dem Template übergeben wurde!';
// Jetzt registrieren wir die Variable im Template
$tpl->assign('text', $text);
// Und zu guter letzt zeigen wir das Template an.
$tpl->display('main.Main');
}
}
?>
Und das wars dann auch schon, wie Ihr seht ist es nicht sonderlich schwer eine einfache aber denoch effektive Template Engine zu implementieren. Man kann natürlich jetzt noch diverse veränderungen sprich verbesserungen vornehmen, so könnte man z.B. mit den Methoden __set() und __get() arbeiten, welche einem das Leben nochmal erleichtern.
Im Anhang findet Ihr alle benötigten Dateien.