Smarty: Grundlagen und typische Muster
Zuweisungen, Modifier, Blöcke und Caching in Smarty – und eine ehrliche Einordnung, wo die Engine in heutigen Projekten noch ihren Platz hat.
Das Wichtigste
- Smarty kompiliert Templates nach PHP und legt das Ergebnis ab. Ab dem zweiten Aufruf entfällt der Parse-Aufwand.
- Kompilieren und Cachen sind zwei verschiedene Dinge: das Kompilat ist immer aktiv, das Caching der Ausgabe muss man einschalten.
- Modifier werden mit
|angehängt und lassen sich verketten – für Escaping, Formatierung und Standardwerte. - Escaping ist nicht automatisch.
escape_htmlin der Konfiguration schaltet es global ein und ist bei Bestandsprojekten die wichtigste Einzelmassnahme.
Smarty war über viele Jahre die verbreitetste PHP-Template-Engine und steckt bis heute in zahllosen Shop- und CMS-Installationen. Wer ein solches Projekt übernimmt, kommt an ihr nicht vorbei.
Aufbau
<?php
require_once 'smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->setTemplateDir('templates/');
$smarty->setCompileDir('templates_c/');
$smarty->setCacheDir('cache/');
$smarty->assign('titel', 'Unsere Produkte');
$smarty->assign('produkte', $produkte);
$smarty->display('produkte.tpl');
Vier Verzeichnisse, von denen zwei beschreibbar sein müssen: templates_c für das Kompilat und cache für die zwischengespeicherte Ausgabe. Sie gehören ausserhalb des Dokumentwurzelverzeichnisses oder hinter eine Zugriffssperre – im Kompilat steht dein PHP-Code.
Templatesyntax
<h1>{$titel|escape}</h1>
{foreach $produkte as $p}
<div class="produkt">
<h2>{$p.name|escape}</h2>
<p>{$p.preis|string_format:"%.2f"} Euro</p>
{if $p.rabatt}
<span class="badge">Reduziert</span>
{/if}
</div>
{foreachelse}
<p>Keine Produkte gefunden.</p>
{/foreach}
{foreachelse} greift, wenn das Array leer ist – praktisch, weil sonst eine zusätzliche Prüfung im PHP nötig wäre.
Modifier
Modifier hängen mit | an einen Wert an und lassen sich verketten:
| Modifier | Wirkung |
|---|---|
escape | HTML-Escaping (auch escape:'url', escape:'javascript') |
default:"–" | Ersatzwert bei leerem Wert |
truncate:80:"…" | kürzen mit Auslassungszeichen |
date_format:"%d.%m.%Y" | Datum formatieren |
nl2br | Zeilenumbrüche zu <br> |
strip | mehrfache Leerzeichen zusammenfassen |
{$p.beschreibung|escape|truncate:120:"…"|nl2br}
Die Reihenfolge ist wichtig: erst escapen, dann kürzen. Umgekehrt könnte das Kürzen eine HTML-Entity in der Mitte durchtrennen.
Escaping global einschalten
Smarty escapet standardmässig nicht. Das lässt sich global ändern:
$smarty->escape_html = true;
Bei einem Bestandsprojekt ist das kein Einzeiler. Zwei Effekte treten sofort auf:
- Templates mit vorhandenem
|escapeescapen doppelt – aus&wird&amp;. - Werte, die bewusst HTML enthalten (Redaktionstexte, generierte Tabellen), erscheinen als sichtbarer Quelltext.
Der Weg dorthin führt über einen Durchgang durch alle Templates: |escape entfernen, wo es überflüssig wird, und bewusst ungeschützte Ausgaben mit |smarty:nodefaults oder {$var nofilter} markieren. Aufwand ja – aber danach ist der sichere Weg der Standardweg.
Caching richtig verstehen
Zwei Ebenen, die oft verwechselt werden:
Kompilieren passiert immer. Smarty übersetzt das Template beim ersten Aufruf in PHP-Code und legt ihn in templates_c ab. Das lässt sich nicht abschalten und ist kein Caching der Ausgabe.
Caching der fertigen Ausgabe muss man einschalten:
$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
$smarty->cache_lifetime = 3600;
// personalisierte Seiten brauchen eine eigene Cache-ID
$smarty->display('produkte.tpl', $kategorieId);
Die Cache-ID ist der Punkt, an dem in der Praxis Fehler passieren. Ohne sie bekommt jede Kategorie denselben zwischengespeicherten Inhalt. Bei personalisierten Seiten gehört die Nutzerkennung mit hinein – oder das Caching bleibt für diese Seiten aus.
Für Teile, die nie gecacht werden dürfen:
{nocache}
<p>Angemeldet als {$user.name|escape}</p>
{/nocache}
Wo Smarty heute steht
Fair eingeordnet:
- Für Bestandsprojekte: völlig in Ordnung. Aktuelle Versionen laufen auf aktuellem PHP, die Engine wird gepflegt, und eine Migration nach Twig kostet Wochen ohne fachlichen Gewinn.
- Für Neuprojekte: Twig ist die naheliegendere Wahl. Automatisches Escaping ab Werk, ausgereifte Template-Vererbung, deutlich mehr Editor- und Werkzeugunterstützung, und in Symfony wie Drupal ohnehin vorhanden.
Der eine Fall, in dem Smarty auch heute noch von sich aus überzeugt: ein Team, das die Syntax seit Jahren kennt und Templates täglich anfasst. Vertrautheit ist ein echter Produktivitätsfaktor und wird in Technologievergleichen regelmässig unterschlagen.
Häufige Fragen
Wird Smarty noch entwickelt?
Ja, es gibt weiterhin Releases und Unterstützung für aktuelle PHP-Versionen. Für Neuprojekte greifen die meisten trotzdem zu Twig, weil Ökosystem und Werkzeugunterstützung dort grösser sind.
Was ist der Unterschied zwischen compile_dir und cache_dir?
Im compile_dir liegt das Template als PHP-Code – das passiert immer und ist keine Option. Im cache_dir liegt die fertige Ausgabe, und das muss man mit caching aktiv einschalten. Verwechslungen führen dazu, dass jemand den Cache abschaltet und sich über unveränderte Ladezeiten wundert.
Wie schalte ich automatisches Escaping ein?
Über die Eigenschaft escape_html am Smarty-Objekt. Achtung bei Bestandsprojekten: Templates, die bereits |escape verwenden, escapen dann doppelt, und HTML, das bewusst ausgegeben wird, erscheint als Quelltext. Die Umstellung braucht einen Durchgang durch alle Templates.
Kann ich PHP-Code direkt im Template ausführen?
In alten Versionen ging das über bestimmte Tags. Es ist seit langem entfernt und war nie eine gute Idee – genau die Vermischung, die eine Template-Engine verhindern soll.
Weiterlesen
- Template-Engines im Vergleich
vlibTemplate, Smarty, TinyButStrong und Twig nebeneinander: Syntax, Wartungsstand, Lernkurve und Laufzeitverhalten.
- TinyButStrong: Templates ohne eigene Sprache
Der Ansatz, HTML unverändert zu lassen und nur Felder zu ersetzen: Blöcke, Datenquellen und der Umgang mit Office-Dateien.
- Template-Engines in PHP: Übersicht
Was eine Engine gegenüber purem PHP bringt, welche Ansätze es gibt und wie du für ein Projekt entscheidest.
- vlibTemplate: Aufbau, Syntax und Beispiele
Platzhalter, Schleifen, Bedingungen und Includes der klassischen Engine - inklusive Hinweisen zum Betrieb auf aktuellen PHP-Versionen.