patTemplate Einführung
Anzeige Hier werben
Installation
Für die Installation braucht man patTemplate und patError diese können unter pear.php-tools.net heruntergeladen werden. Diese 2 Archive werden in den ./includes Ordner entpackt. Jetzt müssen nur noch die Templates und die Logik erstellt werden.
Die Bibliothek wird am einfachsten anhand einiger Beispielen erklärt.
Hallo Welt mit erster Variable
1 2 3 4 5 6 7 8 9 10 11 12 13 | <patTemplate:tmpl name="main">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hallo Welt</title>
</head>
<body>
<p>Hallo Welt. Heute ist der {DATUM}.</p>
</body>
</html>
</patTemplate:tmpl>
|
{DATUM} ist die Variable die mit folgendem PHP-Code durch einen Text ersetzt wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php
// patTemplate Dateien einfuegen
include('./includes/patTemplate.php');
include('./includes/patErrorManager.php');
// patTemplate-Klasse initialisieren und ein Objekt erzeugen.
$tmpl = new patTemplate();
// Hauptverzeichnis der Templates.
$tmpl->setBasedir('templates');
//Haupttemplate laden.
$tmpl->readTemplatesFromFile('main.tmpl');
$datum = date("d.m.Y", time());
// Variable ersetzen.
$tmpl->addVar('main', 'DATUM', $datum);
// Template Parsen.
$tmpl->displayParsedTemplate("main");
?>
|
Jetzt sollte 'Hallo Welt. Heute ist der 23.08.2007' als Ausgabe erscheinen. Das Datum ist das heutige Datum.
Hallo Welt erweitert
Wir erweitern das Beispiel mit einer Fehlermeldung, wenn eine Variable übergeben wird. Mit diesem Codeschnippsel können einzelne Elemente einer Webseite ein-/ausgeschaltet werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <patTemplate:tmpl name="main">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hallo Welt</title>
</head>
<body>
<patTemplate:tmpl name="warning" visibility="hidden">
<p class="warning">Bitte keine Variablen übergeben!</p>
</patTemplate:tmpl>
<p>Hallo Welt. Heute ist der {DATUM}.</p>
</body>
</html>
</patTemplate:tmpl>
|
Das 'warning'-Template wird nur bei Bedarf angezeigt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //...
// Haupttemplate laden.
$tmpl->readTemplatesFromFile('main.tmpl');
if (count($_GET) > 0) {
// Warning Template anzeigen.
$tmpl->setAttribute('warning', 'visibility', 'visible');
}
$datum = date("d.m.Y", time());
// Variable ersetzen.
$tmpl->addVar('main', 'DATUM', $datum);
$tmpl->displayParsedTemplate("main");
?>
|
Statt das Warning Template direkt in das main.tmpl zu schreiben kann man es auch in eine neue Datei schreiben und mit folgendem Befehl in das Template einfügen:
1 | <patTemplate:tmpl visibility="hidden" name="warning" src="./warning.tmpl" />
|
Das Template wird als hidden eingefügt. Damit es angezeigt werden kann muss es zuerst noch sichtbar gemacht werden. Natürlich kann das Element auch ohne dem Attribut visibility eingefügt werden, dann wird es Standardmässig angezeigt.
Die warning.tmpl sieht dann folgendermassen aus. Man könnte noch die <patTemplate>-Tags hinzufügen, in diesem Fall ist dies aber nicht nötig und macht nebenbei den Code auch schlanker.
1 | <p class="warning">Bitte keine Variablen übergeben!</p>
|
Einfache Homepage mit patTemplates
Damit eine einfache Homepage mit einer switch-case Struktur erstellt werden kann, fehlt noch die Funktion je nach Unterseite verschiedene Templates zu laden. Dies geschieht folgendermassen:
1 | <patTemplate:tmpl name="content" autoload="off" src="" />
|
Dies wird an der Stelle eingefügt wo die Unterseite geladen werden soll. Das src Attribut wird je nach Bedarf gesetzt und lädt dann dieses Template.
1 2 | $tmpl->setAttribute('content', 'src', './news.tmpl');
$tmpl->loadTemplate('content');
|
Mit diesen 2 Befehlen wird die
news.tmpl geladen. Die news.tmpl könnte dann zum Beispiel folgendermassen aussehen:
1
2
3
4
5
6
7 | <patTemplate:tmpl name="news">
<h2>News</h2>
<patTemplate:tmpl name="newselement">
<h3>{TITEL}</h3>
<p class="news">{NEWS}</p>
</patTemplate:tmpl>
</patTemplate:tmpl>
|
Jetzt kann die Newsseite mit PHP erzeugt werden. Das Template erstellt das Grundgerüst mit mehreren Newseinträgen. Falls die News und die Titel zu den News in zwei getrennten Arrays gespeichert sind, so könnte die Logik etwa so aussehen.
1
2
3
4
5
6
7 | for ($i = 0; $i < $anzahlNewsEintraege; $i++) {
// Variablen werden gesetzt.
$tmpl->addVar("newselement", "TITEL", $news_titel[$i]);
$tmpl->addVar("newselement", "NEWS", $news_text[$i]);
// Ein Newselement wird geparsed und angefügt ('a')
$tmpl->parseTemplate("newselement", "a");
}
|
Natürlich wird man, wenn man eine etwas grössere Seite hat die Werte aus einer Datenbank holen.
Mit diesen wenigen Template - Elemente können schon recht komplexe Seiten erstellt werden. Der Vorteil in den Template liegt darin, dass man das Design der Seite sehr rasch auswechseln kann. Der PHP-Code muss dabei nicht verändert werden.



Sinnvoll ?
Nach meiner Meinung sind Templatesysteme ziemlich unsinnig. Ob ein Designer nun die Grundzüge der PHP-Syntax oder eine extra Template-Syntax erlernt ist ziemlich egal.
Man kann also auf das umständliche Auswählen, Einarbeiten, Einbinden und Hochladen eines Templatesystems guten Gewissens verzichten und verliert dabei nicht unnötig an Performance.
Deshalb statt {Variable} einfach <?= $variable ?> verwenden. Zu Absicherung der Ausgabe kann der Programmierer z.B. htmlspecialchars() oder htmlentities() verwenden.
Verschachtelte Ausgaben
Hallöchen,
aufgrund dieser Beschreibung, habe ich angefangen, mit diesem Templatesystem zu arbeiten.
Nun bin ich an einen Punkt angekommen, wo ich nicht mehr weiter komme.
Ist es möglich, verschachtelte Ausgaben zu machen?
Beispiel:
Ich hole die Navigation aus der Datenbank:
Navi 1
- Unternavi 1.1
--- Unternavi 1.1.1
Navi 2
- Unternavi 2
u.s.w.