1unitedpower: Projektvorstellung: Teein/Html eine Virtual DOM basierte Templating Engine für PHP 7.1

Beitrag lesen

problematische Seite

Erzähl mal, was der Use Case ist, oder die Motivation dahinter, diese Engine zu schreiben. Im Moment sehe ich erstmal nur HTML, bei dem sozusagen die Zeichen <>=" durch ()-Klammern ausgetauscht wurden.

Richtig, die Nähe zu HTML ist beabsichtigt. Kurz gesagt hat Teein/Html ein Pendant für jedes HTML-Element und -Attribut. Interessant ist, was Teein/Html darüber hinaus anzubieten hat: Anstelle eines Elements oder Attributs kann man jeden belibeigen PHP-Ausdruck angeben, der ein Element oder Attribut produziert. Das ermöglicht es Daten von deren Präsentation zu trennen und gemeinsames Markup wiederzuverwenden.

In HTML mischt man Daten und deren (semantische) Präsentation. Das kann u.U. langatmig werden:

<table>
    <tr>
        <td>Lorem</td>
        <td>ipsum</td>
        <td>dolor</td>
    </tr>
    <tr>
        <td>sit</td>
        <td>amet</td>
        <td>consetetur</td>
    </tr>
    <tr>
        <td>sadipscing</td>
        <td>elitr</td>
        <td>sed</td>
    </tr>
</table>

Teein/Html ermöglich es Gemeinsamkeiten herausfaktoriesieren und in wiederverwendbare View-Helper auslagern, z.B.:

function viewTable(array $table) : Element
{
    return table()(...array_map('viewRow', $data));
}

function viewRow(array $row) : Element
{
    return tr()(...array_map('viewColumn', $row));
}

function viewColumn(string $column) : Element
{
    return td()(text($column));
}

Mit diesen Helfern, kann ich dann das vorherige HTML-Beispiel prägnanter und leserlicher ausdrücken:

$table = viewTable([
    ['Lorem', 'ipsum', 'dolor'],
    ['sit', 'amet', 'consetetur'],
    ['sadipscing', 'elitr', 'sed']
]);

Die Trennung von Daten und Präsentation macht sich natürlich besonders dann bemerkbar, wenn die Daten zum Zeitpunkt der Entwicklung nicht bekannt sind sondern später dynamisch geladen werden (zum Beispiel aus einer Datenbank). In so einer Situation kann ich gar kein statisches HTML schreiben. Ich kann aber schonmal die Schablone festlegen und die Vorschrift, wie dynamische Inhalte später darin eingefügt werden. Klassische Templating-Engines verwenden dafür Platzhalter und oft noch Zusatzkonstrukte für Verzweigungen und Schleifen. Das bedeutet, dass da zusätzliche Komplexitäts-Schichten eingeführt werden: Zu HTML und PHP kommt nun auch noch eine wie auch immer geartete Templating-Sprache. Teein/Html führt dagegen keine neue Sprache ein, sondern bedient sich an dem, was PHP bereits zu bieten hat. Immerhin hat PHP schon Ausdrücke für Platzhaler (Variablen), Verzweigungen (Ternärer-Operator) und Schleifen (array_map, array_reduce).