Zum Inhalt springen

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.

Zuletzt geprüft: Gedacht für: Smarty-Einstieg und Wartung

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_html in 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:

ModifierWirkung
escapeHTML-Escaping (auch escape:'url', escape:'javascript')
default:"–"Ersatzwert bei leerem Wert
truncate:80:"…"kürzen mit Auslassungszeichen
date_format:"%d.%m.%Y"Datum formatieren
nl2brZeilenumbrüche zu <br>
stripmehrfache 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:

  1. Templates mit vorhandenem |escape escapen doppelt – aus &amp; wird &amp;amp;.
  2. 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.