Template-Engine
Eine Template-Engine (von englisch für Vorlage bzw. Schablone und Maschine) ist eine Software, die eine Vorlagen-Datei (englisch Template) verarbeitet und bestimmte Platzhalter darin ähnlich wie bei einem Formular durch jeweils aktuelle Inhalte ersetzt. Die Bezeichnungen Template-Klasse (deutsch umgangssprachlich „Vorlagenklasse“, aber sachlich korrekt: „Klassenvorlage“) und Template-System werden oft als Synonym für eine Template-Engine verwendet.
Klassen-Templates in der C++-Programmierung sind dagegen nicht mit Template-Engines vergleichbar, weil sie eine vom Datentyp unabhängige Programmierung ermöglichen und ganze Klassen generieren können. 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.
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 Template-Variablen genannt. Wenn aus dem Dokument dann mehrere Serienbriefe erzeugt werden, steht anstatt der Template-Variablen name ein realer Name wie „Erika Mustermann“ im fertigen Serienbrief.
Das Dokument braucht nur einmal geschrieben und formatiert zu 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, braucht das Template nicht verändert zu werden, und umgekehrt.
- Das Template kann wiederverwendet werden.
Abgrenzung
Template-Engines werden häufig von Programmierern eingesetzt, um im Kontext von Webanwendungen 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 Model View Controller notwendig.
Vorteile
- Programm-Code (PHP, Python, Ruby, Perl, JavaScript) 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 zur Laufzeit Zusatzaufwand (engl. "overhead").
- Template-Engines müssen im Gebrauch erlernt werden. Neben der neuen Syntax sind auch oft grundlegende Kenntnisse der objektorientierten Programmierung Voraussetzung.
- Template-Engines sind auf eine textuelle Ausgabe beschränkt.
Sprachabhängige Template-Engines
Template-Engines sind sehr verbreitet. 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.
Template-Engines für PHP
PHP selbst ist bereits so entworfen, dass man programmiersprachliche Konstrukte mit der textuellen Ausgabe über Platzhalter bzw. gekennzeichnete Bereiche mischen kann.
<syntaxhighlight lang="php">
<?php echo $body_text; ?>
<?php foreach($test_array as $key => $value) : ?>
Schlüssel: <?php echo $key; ?> - Wert: <?php echo $value; ?>
<?php endforeach; ?> </syntaxhighlight>
Der Vorteil liegt in der einfachen Verwendung. Es braucht keine zusätzliche Bibliothek installiert zu werden, auch ist diese Vorgehensweise für PHP-erfahrene Entwickler am leichtesten zu verstehen und folgt dem Prinzip der geringsten Überraschung. Die Verwendung einer gesonderten Template-Engine für PHP ist daher nicht erforderlich. Dennoch bietet die Verwendung einer Template-Engine für PHP, neben der besseren Übersicht, einige Vorzüge, beispielsweise können einfache, anpassbare Templates für Fehlermeldungen und ähnliche, wiederkehrende Strukturen erstellt werden. Einige populäre Template-Engines sind:
- Smarty<ref>Smarty extern</ref>
- Twig<ref><templatestyles src="Webarchiv/styles.css" />Twig ( des Vorlage:IconExternal vom 9. Juli 2017 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- Fluid (als Teil von TYPO3 Flow)<ref>(<templatestyles src="Webarchiv/styles.css" />extern ( des Vorlage:IconExternal vom 31. Januar 2009 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.)</ref>
- vlibTemplate<ref><templatestyles src="Webarchiv/styles.css" />vLIB ( des Vorlage:IconExternal vom 21. Januar 2005 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.: <templatestyles src="Webarchiv/styles.css" />vlibTemplate ( des Vorlage:IconExternal vom 19. Juni 2006 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis., <templatestyles src="Webarchiv/styles.css" />vlibDate ( des Vorlage:IconExternal vom 17. Juli 2006 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. und <templatestyles src="Webarchiv/styles.css" />vlibMimeMail ( des Vorlage:IconExternal vom 17. Juli 2006 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. (<templatestyles src="Webarchiv/styles.css" />englisch ( des Vorlage:IconExternal vom 21. Januar 2005 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis., deutsch)</ref>
- TinyButStrong<ref>TinyButStrong</ref>
- Contemplate<ref><templatestyles src="Webarchiv/styles.css" />Contemplate ( des Vorlage:IconExternal vom 22. November 2005 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- ETS (Easy Template System)<ref>ETS (Easy Template System)</ref>
- t24 - PHP template parser<ref>t24 - PHP template parser</ref>
- HTML_Template_IT: HTML Integrated Templates, PEAR-PackageuBook Template<ref>HTML_Template_IT: HTML Integrated Templates, PEAR-Package</ref>
- uBook Template<ref>uBook Template</ref>
- KTemplate<ref><templatestyles src="Webarchiv/styles.css" />KTemplate ( des Vorlage:IconExternal vom 14. Mai 2008 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- Hyperkit PHP/XML Template-Engine<ref><templatestyles src="Webarchiv/styles.css" />Hyperkit PHP/XML Template-Engine ( des Vorlage:IconExternal vom 24. Januar 2012 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- Beilpuz<ref>Beilpuz</ref>
- Separate<ref>Separate</ref>
- Blade (als Teil von Laravel)<ref>Blade Templates - Laravel - The PHP Framework For Web Artisans. Abgerufen am 1. Juni 2019.</ref>
Beispiel
Um eine Template-Engine zu verwenden, benötigt man die Template-Datei (in der die auszugebenden Daten enthalten sind) sowie das Script, welches das Template lädt und die Platzhalter mit Werten füllt.
Das Template könnte so aussehen: <syntaxhighlight lang="html"> <body>
Hallo, {name}!
</body> </syntaxhighlight>
Und so könnte eine Wertzuweisung vom Script aus aussehen: <syntaxhighlight lang="php"> $template->assign('name', 'Erika Mustermann'); </syntaxhighlight>
Das Ergebnis: <syntaxhighlight lang="html"> <body>
Hallo, Erika Mustermann!
</body> </syntaxhighlight>
Template-Engines für Perl
- Template Toolkit<ref>Template Toolkit</ref>
- Contemplate<ref><templatestyles src="Webarchiv/styles.css" />Contemplate ( des Vorlage:IconExternal vom 22. November 2005 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref> (auch ASP)
- Embperl<ref>Embperl</ref>
- Mason<ref>Mason</ref>
- HTML Template<ref>HTML Template</ref>
- Text Template<ref>Text Template</ref>
- HTML CTPP2<ref>HTML CTPP2</ref>
Template-Engines für Python
Es gibt viele Template-Engines unter Python. Beispiele sind Django oder TurboGears. Eine gute Übersicht (mit URI und Code-Beispielen) findet man im deutschen PythonWiki<ref>deutschen PythonWiki (Seite nicht mehr abrufbar, festgestellt im Mai 2019. Suche im Internet Archive )Vorlage:Toter Link/archivebot</ref>. Eine umfangreichere Liste, dafür weniger erklärt, findet man im englischen Wiki zu Python<ref>englischen Wiki zu Python</ref>. Weitere sind Cheetah, SimpleTAL, pyTemple, pyratemp<ref>pyratemp</ref> und einige Python Template-Engines<ref>Vergleich und Benchmarks: Python Template-Engines</ref>, Spytee, Nevow, Kid, Genshi, Jinja und HTMLTemplate.
Anwendungsbeispiel
<syntaxhighlight lang="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', 'Straße' : 'Bahnhofstraße 69', 'Ort' : '12345 Foobarhausen' }
- Ersetzungen vornehmen
ersetzen = template.substitute(ersetzungen)
- Vorgang in Datei schreiben
outfile = open('ausgabe.txt', 'w') outfile.write(ersetzen) outfile.close() </syntaxhighlight>
vorlage.txt: <syntaxhighlight lang="text"> Name: ${Name} Straße: ${Straße} Ort: ${Ort} </syntaxhighlight> ausgabe.txt: <syntaxhighlight lang="text"> Name: Hans Meier Straße: Bahnhofstr. 69 Ort: 12345 Foobarhausen </syntaxhighlight>
Template-Engines für C++ und C
Für C++ und C gibt es verschiedene Template-Engines, wie
- ClearSilver<ref>ClearSilver</ref> Die Template-Engine von Orkut und Yahoo Groups (setzen einen eigenen Branch ein).
- Grantlee Template System<ref><templatestyles src="Webarchiv/styles.css" />Grantlee Template System ( des Vorlage:IconExternal vom 30. November 2020 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- Google CTemplate<ref>Projektübersicht zu Google CTemplate bei Google Code</ref>
Template-Engines für Java
Einige Template-Engines für Java<ref>Java-Source.net - Open Source Template Engines in Java</ref> sind java-basierte, quelloffene Template-Engines.
- StringTemplate Template-Engine von Terence Parr, Basis für sein ANTLR, portiert auf C#, Objective-C und JavaScript
- FreeMarker – Java-basierte Template-Engine<ref>Freemarker website</ref>
- Apache Velocity – Java-basierte Template-Engine
- Thymeleaf - Java-basierte Template-Engine<ref>Thymeleaf</ref>
Template-Engines für JavaScript
Im Gegensatz zu den vorherigen Lösungen können Templates vom Web-Browser verarbeitet werden. Der Server liefert nur die Daten z. B. als JSON, oder XML String. Der Rest übernimmt JavaScript im Browser.
- AngularJS Clientseitiges JavaScript-Webframework von Google
Weitere Informationen zu Template-Engines
Einige weitere Template-Engines sind Java-basiert:
- Hamlets – Java-basierte Template-Engine
- action4JAVA<ref><templatestyles src="Webarchiv/styles.css" />action4JAVA ( des Vorlage:IconExternal vom 28. Februar 2013 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref> - Java-basiertes Framework mit Template-Kern.
- jade4j – Java-basierte, freie Implementierung der Jade Template-Engine<ref>jade4j Bezugsquelle</ref>
- Xpand – Java-basierte Template-Engine für die Codegenerierung<ref>oAW website</ref>
- ASP<ref><templatestyles src="Webarchiv/styles.css" />Contemplate (englisch) ( des Vorlage:IconExternal vom 22. November 2005 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- CTPP, Cross-platform Template-Engine für C++, C, PERL und PHP<ref>CTPP</ref>
- GvTags Template-Engine für Groovy<ref>GvTags Template-Engine für Groovy</ref>
- jQote2 - jQuery JavaScript Templating Engine<ref><templatestyles src="Webarchiv/styles.css" />jQote2 ( des Vorlage:IconExternal vom 9. April 2010 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</ref>
- FilesFromCSV - .NET basiert - erzeugt pro CSV Datensatz ein Dokument<ref>FilesFromCSV</ref>
- Handlebars – JavaScript-basierte semantische Template-Engine<ref>Handlebars.js: Minimal Templating on Steroids</ref>, wird u. a. in Ghost verwendet
- AWS Templates Parser – Ada-basierte Template-Engine<ref>AWS Templates Parser: A template engine</ref>
Literatur
- Karsten Wendland: Der Template-Zyklus. Web-Templates im Spannungsfeld von schöpferischem Gestalten und einschränkender Zumutung. Aachen 2006, ISBN 3-8322-5285-1.
Einzelnachweise
<references responsive />
- Seiten mit Skriptfehlern
- Wikipedia:Qualitätssicherung Informatik
- Wikipedia:Defekte Weblinks/Ungeprüfte Archivlinks 2023-01
- Wikipedia:Defekte Weblinks/Ungeprüfte Archivlinks 2019-05
- Wikipedia:Weblink offline IABot
- Wikipedia:Defekte Weblinks/Ungeprüfte Botmarkierungen 2019-05
- Wikipedia:Defekte Weblinks/Ungeprüfte Archivlinks 2024-05
- Templatesprache
