- Templatesystem
-
Eine Template Engine (von engl. Vorlage und Antrieb, Motor) ist eine Software, die eine Datei (das Template) verarbeitet, und bestimmte Platzhalter darin mit jeweils aktuellen Inhalten füllt. Die Bezeichnungen Templateklasse und Templatesystem werden oft als Synonym für eine Template Engine verwendet.
Klassentemplates in der C++-Programmierung sind dagegen nicht mit Template Engines vergleichbar, weil sie eine vom Datentyp unabhängige Programmierung ermöglichen und ganze Klassen enthalten.
In den Templates einer Template Engine sollte kein Programm-Code enthalten sein. Kontrollstrukturen (wie IF) sind allerdings oft in Templates möglich und verbreitet.
Typische Dateitypen, die verarbeitet werden, sind HTML, Text (ASCII oder Unicode), XML oder TeX.
Inhaltsverzeichnis
Konzept
Das Konzept ähnelt den Seriendruckfeldern bei einer Textverarbeitung: In einem Dokument werden Seriendruckfelder (Platzhalter) eingefügt, etwa Name – Straße – Ort. Bei Template Engines werden diese Seriendruckfelder Templatevariablen genannt. Wenn aus dem Dokument dann mehrere Serienbriefe erzeugt werden, steht anstatt der Templatevariablen name ein realer Name wie „Erika Mustermann“ im fertigen Serienbrief.
Das Dokument muss nur einmal geschrieben und formatiert werden. Alle Änderungen wirken sich automatisch auf zukünftig erstellte Serienbriefe aus. Das ist bei Template Engines genauso; weitere Parallelen zu Serienbrief-Vorlagen sind:
- Die Daten kommen aus einer externen Quelle (Datenbank, Tabellenkalkulation, etc.).
- Um die Daten zu ändern, muss das Template nicht verändert werden, und umgekehrt.
- Das Template kann wiederverwendet werden.
Abgrenzung
Template Engines werden häufig von Programmierern eingesetzt, um im Kontext von Web-Applikationen Programm-Code (einer Programmiersprache) vom Design zu trennen. Genauso wird von den Herstellern mancher Template Engines angeführt, Templates und Engines sollen durch die Trennung der Programmierlogik vom Design das Skript von HTML-Code befreien und damit übersichtlicher machen.
Demgegenüber steht der ursprüngliche Gedanke der Template Engines: Sie sollen statischen Text und dynamische Inhalte möglichst effizient miteinander verknüpfen. Oft sind Template Engines deshalb gerade in Programmiersprachen anzutreffen, deren Syntax eine solche Mischung nicht direkt unterstützt (z. B. Java: JSP; VBScript u. a.: ASP).
Für eine echte Trennung der Darstellung von den Datenmodellen und den Logikkomponenten sind Template Engines dagegen ungeeignet und es sind zusätzliche Konzepte wie z. B. Model View Controller notwendig.
Vorteile
- Programm-Code (PHP, Python, Perl, etc.) wird vom Markup (HTML) getrennt
- Designer und Programmierer können gleichzeitig an einem Projekt arbeiten
- WYSIWYG-Editoren können verwendet werden
Nachteile
Template Engines
- erzeugen immer zusätzlichen Overhead.
- müssen im Gebrauch erlernt werden. Oft sind grundlegende Kenntnisse der objektorientierten Programmierung Voraussetzung.
- sind auf eine textuelle Ausgabe beschränkt.
Sprachunabhängige Template-Engines
TAL/ZPT
Für den Web-Anwendungsserver Zope wurden die Zope Page Templates zunächst in Python entwickelt, die jedoch von Anfang an sprachunabhängig ausgelegt waren. Diese verwenden die folgenden Technologien:
- Template Attribute Language (TAL)
- verwendet spezielle Attribute (daher Template Attribute Language, in etwa: Attributbasierte Schablonensprache) mit dem Präfix
tal:
, um Elemente zu füllen oder zu ersetzen, Schleifen zu realisieren oder Bedingungen zu überprüfen. (Stets sprachspezifischer) Programmcode in Verarbeitungsanweisungen, außerhalb der üblichen Elemente, ist nicht nötig (Beispiel) - TAL Expression Syntax (TALES)
- die einzige Komponente, die programmiersprachabhängige Inhalte erlaubt (nicht aber erfordert); beschreibt die Syntax der Attributwerte: eine Python-Implementierung wird sehr wahrscheinlich (aber nicht notwendigerweise) Python-Ausdrücke erlauben. Für die allermeisten Anwendungen reicht es, sprachunabhängige Pfadausdrücke zu verwenden (Beispiele)
- Macro Expansion TAL (METAL)
- Erlaubt die Wiederverwendung von Code in anderen Templates; ebenfalls eine Template Attribute Language, Präfix:
metal:
- i18n TAL
- Mittels des i18n-Namensraums (also des Attribut-Präfix
i18n:
) und GNU gettext lassen sich sprachabhängige Ausgaben erzeugen.
Es können HTML-Dokumente und XML aller Spielarten incl. XHTML generiert werden; bei korrekter Deklarierung der Namensräume sind die XML-Templates validierbar und lassen sich mit allen modernen Designwerkzeugen bearbeiten. Auch bei HTML-Templates wird Wohlgeformtheit (gemäß den HTML-Regeln) garantiert; andernfalls würden sie sich nicht übersetzen lassen. Templates können leicht mit echt aussehenden Dummy-Inhalten ausgestattet werden, um dem Designer einen realistischen Eindruck zu geben; dieser darf sogar eigene Dummydaten hinzufügen, die vom Programmierer dann auf einfache Weise ausgeblendet werden können.
Es existieren Implementierungen für Python, Java, Perl, PHP und XSL (Transformation von TAL in ein XSLT-Template); eine (möglicherweise unvollständige) Liste findet sich hier.
XSL/XSLT
Kann alles, ist aber überaus komplex.
- XSL
- Extensible Stylesheet Language
- XSLT
- XSL Transformation, eine turing-vollständige Programmiersprache zur Transformation von XML-Dokumenten
Sprachabhängige Template-Engines
Die Masse von Template Engines ist enorm. Eigenentwicklungen sind an der Tagesordnung. XSLT ist für alle Template Engines eine Konkurrenz. Bei PHP ist Smarty weit verbreitet, hat aber die Eigenentwicklungen und andere Template Engines nicht vom Markt verdrängt.
PHP Template Engines
PHP selbst ist bereits so entworfen, dass man programmiersprachliche Konstrukte mit der textuellen Ausgabe über Platzhalter bzw. gekennzeichnete Bereiche mischen kann. Die Verwendung einer gesonderten Template Engine für PHP ist deswegen eigentlich nicht erforderlich. Dennoch existieren gerade für PHP eine sehr große Zahl von Engines:
- Smarty (extern)
- Beilpuz
- vLIB: vlibTemplate, vlibDate und vlibMimeMail (englisch, deutsch)
- patTemplate
- TinyButStrong
- Contemplate
- ETS (Easy Template System)
- t24 - PHP template parser
- HTML_Template_IT: HTML Integrated Templates, PEAR-Package
- KTemplate
- Template Engine nur mit PHP (deutsch)
- Beyond The Template Engine (englisch)
Die Webseiten Template Engine nur mit PHP und Beyond The Template Engine zeigen die Möglichkeit HTML und PHP (weitestgehend) zu trennen, ohne eine Template Engine zu verwenden. Im Template werden nur Variablen und Blöcke ausgegeben. Die sonstige Logik wird nicht im Template programmiert.
<h1><?=$body_text?></h1> <? foreach($test_array as $key => $value): ?> <p>Schlüssel: <?=$key?> -- Wert: <?=$value?></p> <? endforeach; ?>
Der Vorteil liegt in der einfachen Verwendung. Es muss nichts installiert werden und man braucht sich nicht in ein neues System einzuarbeiten.
Das Template-Skript von harchut.de folgt diesem Ansatz, trennt jedoch die Variablen zwischen Steuerung und Anzeige (funktioniert ab PHP Version 3).
Die Klasse Savant benutzt ähnlichen Code.
Kurzes Beispiel (Quellcode)
Um eine Template Engine zu verwenden, muss man zwei Dateien erstellen
- template.htm
- script.* (z. B. script.php, script.pl, script.asp, etc.)
die auch in verschiedenen Verzeichnissen abgespeichert werden können.
Das Template könnte so aussehen:
<body> <p>{NAME}</p> </body>
Und so könnte dann der PHP-Code aussehen:
$template->assign('NAME', 'Erika Mustermann');
Das Ergebnis:
<body> <p>Erika Mustermann</p> </body>
Nicht jede Template Engine benutzt Methoden wie "assign". Namen wie "setvar" oder "merge" sind ebenso möglich. Detaillierte Beispiele kann man unter vlibTemplate und Smarty (siehe Weblinks) ansehen.
Anwendungsbeispiel in Python
# coding: utf-8 # Modul Template muss importiert werden from string import Template # Vorlage zum Lesen öffnen, Inhalt übergeben und Datei schließen vorlage = open('vorlage.txt', 'r') vorl_inhalt = vorlage.read() vorlage.close() # Den Inhalt als Template behandeln template = Template(vorl_inhalt) # Ersetzungen nach folgendem Schema festlegen ersetzungen = { 'Name' : 'Hans Meier', 'Strasse' : 'Bahnhofstr. 69', 'Ort' : '12345 Foobarhausen' } # Ersetzungen vornehmen ersetzen = template.substitute(ersetzungen) # Vorgang in Datei schreiben outfile = open('ausgabe.txt', 'w') outfile.write(ersetzen) outfile.close()
vorlage.txt:
Name: ${Name} Strasse: ${Strasse} Ort: ${Ort}
ausgabe.txt:
Name: Hans Meier Strasse: Bahnhofstr. 69 Ort: 12345 Foobarhausen
Beispiele und Tutorials (PHP)
- Template Engine nur mit PHP: Einfaches Beispiel
- Smarty: Einfaches Beispiel
- vlibTemplate: Einfaches Beispiel
- TinyButStrong: Einfaches Beispiel
- Savant: Quick example
- vlibTemplate, vlibDate: Tutorial und Beispiele
- Smarty: Einführung und Beispiele
- TinyButStrong: Einführung und Beispiele
- Template-Klasse mit API-Doc und Tutorial
- Beispiel des Parsvorganges mit der Deihro TemplateEngine
- Beispiele mit ModeliXe, phpBB2, Smarty, TinyButStrong und VTemplate (Französisch)
- Beilpuz template examples (Englisch)
Perl Template Engines
Python Template Engines
- Cheetah
- SimpleTAL
- pyTemple
- pyratemp und Vergleich und Benchmarks einiger Python Template Engines
- Spytee
- Nevow
- Kid
- Genshi
- Jinja
- HTMLTemplate
Es gibt sehr viele Templating Engines unter Python, auch größere Systeme, die über deren Fähigkeiten weit hinausgehen. Beispiele sind Django oder TurboGears. Eine gute Übersicht (mit URI und Code-Beispielen) findet man im deutschen PythonWiki. Eine umfangreichere Liste, dafür weniger erklärt findet man im englischen Wiki zu Python.
C/C++Template Engines
Sonstiges
- Hamlets – Java-basierte Template Engine
- Apache Velocity – Java-basierte Template Engine
- Freemarker – Java-basierte Template Engine (Freemarker website)
- Xpand – Java-basierte Template Engine für die Codegenerierung (oAW website)
- ASP: Contemplate (englisch)
- CTPP, Crossplatform C/C++/PERL and PHP Template engine
- GvTags Template engine für Groovy
Literatur
- Karsten Wendland: Der Template-Zyklus. Web-Templates im Spannungsfeld von schöpferischem Gestalten und einschränkender Zumutung, Aachen: 2006, ISBN 3-83225-285-1
Wikimedia Foundation.