vlibTemplate: Aufbau, Syntax und Beispiele
Platzhalter, Schleifen, Bedingungen und Includes der klassischen PHP-Engine – mit Beispielen und Hinweisen zum Betrieb auf aktuellen PHP-Versionen.
Das Wichtigste
- vlibTemplate trennt strikt: im Template ist keine Programmlogik möglich, nur Platzhalter, Schleifen und einfache Bedingungen.
- Steuerelemente stehen in HTML-Kommentaren. Ein Template bleibt dadurch im Browser darstellbar, auch ohne PHP.
- Daten kommen über
setVarfür Einzelwerte undsetLoopfür Listen aus einem Array von Zeilen. - Kein automatisches Escaping. Jede Ausgabe muss beim Setzen escaped werden – das ist der wichtigste Unterschied zu Twig.
vlibTemplate ist eine der klassischen PHP-Template-Engines. Der Ansatz ist bewusst schmal: keine Logik im Template, keine eigene Ausdruckssprache, nur Platzhalter, Schleifen und einfache Bedingungen. Genau das macht sie in Bestandsprojekten pflegeleicht.
Grundprinzip
Das Template ist eine HTML-Datei. Platzhalter stehen in geschweiften Klammern, Steuerelemente in HTML-Kommentaren:
<h1>{SEITENTITEL}</h1>
<!-- BEGIN DYN produkte -->
<div class="produkt">
<h2>{NAME}</h2>
<p>{PREIS} Euro</p>
</div>
<!-- END DYN produkte -->
Weil die Steuerelemente Kommentare sind, bleibt die Datei valides HTML. Sie lässt sich im Browser öffnen und in einem Editor bearbeiten, ohne dass etwas kaputtgeht.
Daten übergeben
<?php
require_once 'vlibTemplate.php';
$tpl = new vlibTemplate('templates/produkte.html');
// Einzelwerte
$tpl->setVar('SEITENTITEL', 'Unsere Produkte');
// Listen: ein Array aus Zeilen, jede Zeile ein assoziatives Array
$tpl->setLoop('produkte', [
['NAME' => 'Laufschuh Modell A', 'PREIS' => '89,90'],
['NAME' => 'Laufschuh Modell B', 'PREIS' => '109,00'],
]);
$tpl->pparse();
setVar setzt einen einzelnen Wert, setLoop füllt einen Block. Die Schlüssel im Zeilen-Array entsprechen den Platzhaltern im Block – Grossschreibung ist Konvention, nicht Pflicht.
pparse() gibt direkt aus, grab() liefert das Ergebnis als String zurück. Letzteres brauchst du, wenn das Ergebnis weiterverarbeitet wird, etwa als HTML-Teil einer Mail.
Bedingungen
<!-- IF rabatt -->
<p class="rabatt">Reduziert</p>
<!-- ELSE -->
<p>Regulärer Preis</p>
<!-- ENDIF -->
Geprüft wird auf “gesetzt und nicht leer” – keine Vergleiche, keine Ausdrücke. Wer im Template {PREIS} > 100 prüfen will, hat die Trennung schon verlassen: Die Entscheidung gehört ins PHP, das Template bekommt ein fertiges Flag.
$zeilen[] = [
'NAME' => $p['name'],
'PREIS' => number_format($p['preis'], 2, ',', '.'),
'RABATT' => $p['preis'] < $p['listenpreis'] ? 1 : 0,
];
Includes
<!-- INCLUDE kopf.html -->
<main>…</main>
<!-- INCLUDE fuss.html -->
Eingebundene Dateien sehen dieselben Variablen wie das Haupttemplate. Für ein gemeinsames Grundgerüst genügt das; eine echte Template-Vererbung mit überschreibbaren Blöcken wie in Twig gibt es nicht.
Escaping: der Punkt, an dem es gefährlich wird
vlibTemplate gibt Werte unverändert aus. Steht in einem Produktnamen ein <script>-Tag, landet es im HTML. Das ist der wichtigste Unterschied zu modernen Engines.
Die verlässliche Lösung ist ein Wrapper, der das Escaping erzwingt:
final class SafeTemplate
{
public function __construct(private vlibTemplate $tpl) {}
public function setVar(string $key, string $value): void
{
$this->tpl->setVar($key, htmlspecialchars($value, ENT_QUOTES, 'UTF-8'));
}
public function setRawVar(string $key, string $html): void
{
// bewusst ungeschützt - nur für vertrauenswürdiges HTML
$this->tpl->setVar($key, $html);
}
public function setLoop(string $name, array $rows): void
{
$this->tpl->setLoop($name, array_map(
fn (array $row) => array_map(
fn ($v) => is_string($v) ? htmlspecialchars($v, ENT_QUOTES, 'UTF-8') : $v,
$row
),
$rows
));
}
}
Damit ist der sichere Weg der Standardweg, und der unsichere braucht einen eigenen Methodennamen, der beim Lesen auffällt.
Betrieb auf aktuellen PHP-Versionen
Der ursprüngliche Code stammt aus der PHP-4-Ära. Typische Bruchstellen beim Upgrade:
| Muster | Problem ab | Ersatz |
|---|---|---|
function vlibTemplate() als Konstruktor | PHP 8.0 | __construct() |
ereg, eregi, split | PHP 7.0 | preg_match, preg_split |
each() | PHP 8.0 | foreach |
| Aufruf undefinierter Array-Schlüssel | PHP 8.0 (Warning) | ?? oder isset |
create_function | PHP 8.0 | Closure |
Vor dem Versionssprung lohnt sich ein Lauf mit voller Fehleranzeige:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Die Meldungen zeigen die Stellen, die brechen werden, bevor sie es produktiv tun. Gepflegte Forks der Bibliothek haben diese Punkte bereits abgeräumt – ein Blick in die jeweilige Commit-Historie sagt mehr als die Versionsnummer.
Wann ein Wechsel sinnvoll ist
Nicht, weil die Engine alt ist. Sondern wenn:
- sie auf der benötigten PHP-Version nicht mehr läuft und kein gepflegter Fork existiert,
- die Templates häufig von mehreren Personen geändert werden und Vererbung fehlt,
- das fehlende automatische Escaping in einem Projekt mit vielen Nutzereingaben zum wiederkehrenden Risiko wird.
Trifft nichts davon zu, ist die günstigste Entscheidung, die Engine zu behalten und den Wrapper oben einzuziehen.
Häufige Fragen
Läuft vlibTemplate noch auf aktuellen PHP-Versionen?
Nicht unverändert. Der ursprüngliche Code stammt aus der PHP-4-Zeit und nutzt Konstruktoren mit Klassennamen sowie Funktionen, die inzwischen entfernt sind. Gepflegte Forks laufen auf PHP 8; vor einem Upgrade gehört ein Testlauf mit aktivierten Deprecation-Meldungen dazu.
Wie escape ich Ausgaben in vlibTemplate?
Beim Setzen, nicht im Template. Die Engine gibt Werte unverändert aus. Ein eigener Wrapper um setVar, der jeden Wert durch htmlspecialchars schickt, ist die verlässlichste Lösung – dann kann kein Aufruf ihn vergessen.
Kann ich verschachtelte Schleifen bauen?
Ja. Eine Zeile im Loop-Array kann selbst wieder ein Array unter einem Schlüssel enthalten, das im Template als eigener Block angesprochen wird. Die Verschachtelungstiefe ist nicht begrenzt, die Lesbarkeit schon.
Was macht der Cache?
vlibTemplate kann das geparste Template zwischenspeichern, sodass das Datei-Parsing nur beim ersten Aufruf anfällt. Bei Änderungen am Template muss der Cache geleert oder die Prüfung auf Änderungsdatum aktiv sein, sonst siehst du die alte Fassung.
Weiterlesen
- Template-Engines im Vergleich
vlibTemplate, Smarty, TinyButStrong und Twig nebeneinander: Syntax, Wartungsstand, Lernkurve und Laufzeitverhalten.
- vlibDate: Datumsberechnungen in PHP
Wofür die Klasse gedacht war, welche Aufgaben heute DateTime und DateInterval übernehmen und wie eine Ablesung aussieht.
- vlibMimeMail: HTML-Mails mit Anhängen
MIME-Aufbau, Text- und HTML-Teil, Anhänge und Kodierung - und was du heute stattdessen einsetzen solltest.
- 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.