Zum Inhalt springen

TinyButStrong: Templates ohne eigene Sprache

Der Ansatz, HTML unverändert zu lassen und nur Felder zu ersetzen: Feldsyntax, Blöcke, Datenbankanbindung und der Umgang mit Office-Dateien über OpenTBS.

Zuletzt geprüft: Gedacht für: Templates, die Designer weiterbearbeiten

Das Wichtigste

  • TBS-Felder stehen in eckigen Klammern und Blöcke in HTML-Kommentaren. Das Template bleibt valides HTML und im Browser darstellbar.
  • Ein Block wird über MergeBlock gefüllt – aus einem Array, einer Datenbankabfrage oder einem beliebigen Iterator.
  • Der Parameter htmlconv steuert das Escaping pro Feld. Global umschalten geht über die Voreinstellung im TBS-Objekt.
  • Mit der Erweiterung OpenTBS füllt dieselbe Syntax auch DOCX-, XLSX- und ODT-Vorlagen – dafür gibt es kaum Alternativen.

TinyButStrong verfolgt einen anderen Ansatz als Smarty oder Twig: Es erfindet keine Sprache, sondern ersetzt Felder in einer ansonsten unveränderten Datei. Das Template bleibt valides HTML – oder eine gültige Word-Datei.

Feldsyntax

<h1>[titel]</h1>
<p>Stand: [datum;frm=dd.mm.yyyy]</p>

Ein Feld beginnt mit dem Namen, danach folgen Parameter, getrennt durch Semikolon. Die wichtigsten:

ParameterWirkung
frm=Formatierung für Zahlen und Datum
htmlconv=escHTML-Escaping
htmlconv=nobewusst kein Escaping
ifempty=Ersatzwert bei leerem Feld
magnet=umgebendes Element mit entfernen, wenn leer
strconv=noZeichenkonvertierung abschalten

magnet ist die Funktion, die man in anderen Engines vermisst:

<p class="hinweis" [hinweis;magnet=p;ifempty=*]>[hinweis]</p>

Ist hinweis leer, verschwindet der ganze Absatz – nicht nur der Inhalt. In Smarty oder Twig bräuchte es dafür eine if-Abfrage um das Element herum.

Blöcke

<!-- Anfang des Blocks -->
<div class="produkt">
  <h2>[b.name;htmlconv=esc]</h2>
  <p>[b.preis;frm='0.00'] Euro</p>
</div>
<!-- Ende -->

Der Blockname wird in PHP zugewiesen:

<?php
require_once 'tbs_class.php';

$TBS = new clsTinyButStrong();
$TBS->LoadTemplate('templates/produkte.html');

$TBS->MergeField('titel', 'Unsere Produkte');
$TBS->MergeBlock('b', [
    ['name' => 'Laufschuh Modell A', 'preis' => 89.90],
    ['name' => 'Laufschuh Modell B', 'preis' => 109.00],
]);

$TBS->Show();

MergeBlock nimmt auch eine Datenbankverbindung entgegen:

$TBS->MergeBlock('b', $pdo, 'SELECT name, preis FROM produkte WHERE aktiv = 1');

Bequem, aber mit Vorsicht zu geniessen: Damit wandert die Abfrage ins Template-Umfeld und die Trennung, die eine Engine erzwingen soll, weicht auf. Für wartbaren Code bleibt die Abfrage im PHP, und TBS bekommt ein fertiges Array.

Bedingte Blöcke

<!-- Block mit Bedingung -->
<span class="badge">[b.label]</span>
<!-- Ende -->

Bedingungen werden über den Parameter when am Block gesetzt, Alternativen über default. Für einfache Fälle reicht magnet, für Verzweigungen gibt es Sektionen:

[onshow;block=div;when [var.status]='offen']
<div class="offen">Bearbeitung läuft</div>
[onshow;block=div;when [var.status]='fertig']
<div class="fertig">Abgeschlossen</div>

Die Syntax ist gewöhnungsbedürftig. Wer viele Verzweigungen im Template braucht, ist mit Twig besser bedient – oder sollte die Entscheidung ins PHP verlagern.

Escaping

TBS escapet nicht automatisch. Pro Feld geht das über htmlconv=esc, global über die Voreinstellung:

$TBS->Protect = true;                    // verhindert PHP-Code im Template
$TBS->SetOption('htmlconv', 'esc');      // Escaping als Standard

Protect ist der zweite wichtige Schalter: Er verhindert, dass zusammengeführte Daten als PHP-Code interpretiert werden. Bei Templates aus vertrauenswürdiger Quelle wirkt das überflüssig – bei Templates, die Redakteure hochladen können, ist es die Grenze zwischen einer Template-Engine und einer Codeausführungslücke.

OpenTBS: Vorlagen für Office-Dateien

Der Bereich, in dem TBS bis heute kaum Konkurrenz hat. Dieselbe Feldsyntax funktioniert in DOCX, XLSX, ODT und PPTX:

$TBS = new clsTinyButStrong();
$TBS->Plugin(TBS_INSTALL, OPENTBS_PLUGIN);
$TBS->LoadTemplate('vorlagen/rechnung.docx', OPENTBS_ALREADY_UTF8);

$TBS->MergeField('kunde', $kunde);
$TBS->MergeBlock('posten', $rechnungsposten);

$TBS->Show(OPENTBS_DOWNLOAD, 'rechnung-' . $nummer . '.docx');

Die Vorlage wird in Word gestaltet, die Felder als normaler Text eingetragen. Für Rechnungen, Verträge und Serienbriefe ist das deutlich pragmatischer, als Dokumente programmatisch aufzubauen.

Ein Detail, das Zeit kostet: Word teilt Text intern auf, sobald zwischendurch die Formatierung wechselt oder die Rechtschreibprüfung eingegriffen hat. Ein Feld wie [kunde.name] kann dann als [kunde. + name] in zwei Textknoten liegen und wird nicht erkannt. Abhilfe: Feld in einem Zug tippen, ohne Formatwechsel, oder den Text vorher in einem einfachen Editor schreiben und einfügen.

Wann TBS die richtige Wahl ist

  • Templates werden von Personen gepflegt, die HTML sehen wollen und keine Template-Sprache lernen.
  • Es gibt einen Freigabeprozess, in dem das Template im Browser begutachtet wird, bevor Daten drin sind.
  • Es sollen Office-Dokumente aus Vorlagen erzeugt werden.

Für ein reines Web-Frontend mit viel Verzweigungslogik ist Twig die bessere Wahl. Für Dokumentgenerierung ist OpenTBS immer noch das direkteste Werkzeug.

Häufige Fragen

Was unterscheidet TBS von Smarty oder Twig?

TBS führt keine eigene Sprache ein. Es ersetzt Felder in einer Datei, die ansonsten unverändert bleibt. Dadurch lässt sich ein Template in einem visuellen HTML-Editor oder in Word öffnen, ohne dass die Steuerelemente stören.

Wie escape ich Ausgaben?

Über den Parameter htmlconv am Feld, etwa mit dem Wert esc. Sinnvoller ist, die Voreinstellung am TBS-Objekt auf Escaping zu stellen und nur dort abzuweichen, wo bewusst HTML ausgegeben werden soll.

Kann TBS direkt aus der Datenbank lesen?

Ja. MergeBlock nimmt neben Arrays auch ein Ergebnis aus PDO oder MySQLi entgegen. Für wartbaren Code ist es trotzdem besser, die Abfrage im PHP zu halten und TBS nur ein fertiges Array zu geben.

Wofür ist OpenTBS gedacht?

Für Dokumentvorlagen. Eine Word- oder Excel-Datei wird mit denselben Feldern versehen und serverseitig befüllt – für Rechnungen, Verträge oder Serienbriefe. Das ist der Bereich, in dem TBS bis heute konkurrenzlos praktisch ist.