Um Code und Layout zu trennen benötigt man keine Template Engine wie Smarty. Zwei kleine Klasse in PHP und PHP selbst genügen um den Code vom Layout zutrennen...
Wie schon in einem anderen Artikel von mir beschrieben, sind Template Engines meiner Meinung nach überflüssig.
Einige werden sich wahrscheinlich trotzdem nicht davon trennen, entweder aus Bequemlichkeit, oder weil eventuell man gar nicht weiss woher ein angemessener Ersatz zu bekommen ist. Deswegen werde ich euch zeigen, wie man mit nur zwei Klassen sehr gut Code und Layout trennen kann, ohne auf die schwergewichtigen Template Engines zu setzen.
Was wir aufjedenfall benötigen ist eine Klasse, die zum Speichern der Werte verwendet wird. Warum speichern von Werten? Entweder man gibt direkt im Code per print oder echo den Wert einer Variablen aus, oder man speichert ihn und verwendet ihn erst später, in der Ansicht.
Um also das Layout und den Code zu trennen benötigen wir zwei Klassen. Einmal die Model Klasse und einmal die Page Klasse. Die Model ist dafür da, um die verschieden Werte mit ihrem Schlüssel aufzunehmen. Das Pageobjekt wird zum Anzeigen der Seite verwendet.
Model
Vom Prinzip her, ist die Model Klasse, eine einfache Klasse die verschiedene Schlüssel und ihre Werte aufnimmt. Die ganze Klasse steht in Listing 1. Vom Aufbau der Model Klasse ist wie folgt. Es gibt ein Attribut, die private Variable $model, sowie deren Setter und Getter und die Methode Model::assign(). Diese Methode nimmt einen Schlüssel $aryKey und deren Wert $modelValue entgegen und speichert diese in der Membervariablen $model. Eine kleines Bespiel kann in Listing 2 betrachtet werden. Dort wird aus einer Datenbank der Counterstand für eine Webseite geholt und in dem Model Objekt für die spätere Verwendung gespeichert.
Page / (View)
Jetzt fehlt noch die Page Klasse. Der Quellcode für die Page Klasse befindet sich in Listing 3 sehen kann. Dem Konstruktor wird der Name der Templatedatei mitgegeben. Die Methode Page::add fügt die Schlüssel und Werte eines Model hinzu und die Methode Page::display ist für das Anzeigen der Templatedatei zuständig. Das Besondere an der Page::display Methode ist, das alle Variablen sich nicht im globalen Namensraum, sondern im Namensraum der Funktion befindet – was meiner Meinung nach ziemlich Praktisch ist. Wenn nun die Methode ausgeführt wird, werden alle Variablen in das Assoziative Array $TPL „kopiert“ (referenziert, wegen dem & Operator).
So kann man dann bequem im Templatefile auf die Werte zugreifen. Ein kleines Beispiel befindet sich in Listing 4, welches an das Beispiel in Listing 2 angelehnt ist.
Listing 1
Download Code!
class Model {
private $model = array();
public function __construct() {
}
public function setModel($model){
$this->model = $model;
}
public function getModel() {
return $this->model;
}
public function assign($aryKey, $modelValue) {
$this->model[$aryKey] = $modelValue;
}
}
Listing 2
Download Code!
// ... Mysql Verbindung aufbauen und Datenbank auswählen
$result = mysql_query('SELECT counter FROM counter', $con); $counter = 0;
$counter = $row['counter'];
}
$model = new Model();
$model->assign('counter', $counter);
// Mehrere Werte (Array)
$userList = $result;
}
$model->assign('userList', $userList);
Listing 3
Download Code!
class Page {
protected $file = '';
protected
$storage = array();
public function __construct($file) {
if(!is_file($file)) throw
new Exception
(); $this->file = $file;
}
public function add(Model $m) {
foreach($m->getModel() as $key => $val) {
$this->storage[$key] = $val;
}
}
public function display() {
$TPL = &$this->storage;
require_once($this->file);´
}
}
Listing 4
Download Code!
try {
$page = new Page('mainpage.php');
$page->addModel($model);
$page->display();
} catch (Exception $e) {
// Fehlerbehandlung
}
// Die Datei mainpage.php
<!-- Einiges an HTML -->
<div>Es gab insgesamt: <?php $TPL['counter'] ?> Zugriffe auf diese Webseite</div>
<!-- Einiges an HTML -->
<?php if(count($userList)): ?> <h1>Liste der User</h1>
<ul>
<?php foreach ($userList as $user): ?>
<li
><?php
echo $user['name']; ?
></li
> <!-- Kurzschreibweise, nicht zu empfehlen, da auf manchen Servern nicht verfügbar -->
<!-- <li><?= $user['name']; ?></li> -->
<?php endforeach; ?>
</ul>
<?php endif; ?>