PHP ist eine eingebettete Sprache, d. h. der PHP-Code lässt sich mit HTML-Code mischen.

Dieser Vorteil gegenüber anderen Sprachen ist vielleicht bei kleineren/einfachen Seiten ein Pluspunkt. Sobald es darum geht, die Logik vom Layout zu trennen oder die Ausgabe flexibel zu gestalten, sollte der PHP-Code (der Logikanteil) und der HTML-Code voneinander getrennt werden.

Dafür gibt eine eine Menge an Template Engines, die einem Entwickler die Arbeit beim Trennen von Logik und Layout abnehmen. Viele davon haben ihre eigene Syntax für Platzhalter sowie für Kontrollstrukturen. Wird so ein Template eingebunden, muss der Inhalt zuerst geparst werden. Je nach Komplexität ist dieser Prozess mit mehr oder weniger Zeitaufwand verbunden. Einige Template Engines cachen das geparste Template, um es bei der nächsten Verwendung nicht nochmal parsen zu müssen.

Dabei ist es doch auch möglich, die Templates so aufzubauen, dass Sie weiterhin PHP-Code und HTML-Code beinhalten, natürlich ohne Logik und nur mit einfachen Ausgaben und Kontrollstrukturen.

# 1. Pseudocode für Template Engines mit eigener Syntax für Platzhalter und Kontrollstrukturen
<div>
    [[if({user} == 'John O. Public')]]
        <span>Hi John O. Public, <br />
            you have {amount} open todos.
        </span>
    [[/endif]]
</div>

# 2. Template mit eingebettetem PHP und alternativer Syntax für Kontrollstrukturen
<div>
    <?php if ($user == 'John O. Public') : ?>
        <span>Hi John O. Public, <br />
            you have <?=$amount?> open todos.
        </span>
    <?php endif; ?>
</div>

Wie aus dem oberen Beispiel zu erkennen ist, scheint die 2. Variante auch nicht sehr viel komplizierter zu sein als das Erstere. Um Änderungen an Templates vorzunehmen, sind auch keine tiefergehenden Kenntnisse in PHP nötig, die Basics reichen da vollkommen aus. Manchmal wird damit argumentiert, dass z. B. Designer das Template bearbeiten und daher sei die Syntax des Template-Engines der PHP-Syntax vorzuziehen, da sie vom User keine PHP-Kenntnisse verlangen - Dafür muss man sich aber die Syntax des Template-Engines einarbeiten, das bei manchen Template-Engines doch erheblich zeitaufwändig sein kann.

Im Laufe der Zeit hatte ich mit vielen Varianten von Template Engines zu tun. Was mir aber bisher gefehlt hat, war eine wirklich einfache Template Engine ohne viel Overhead und einfach in der Anwendung.


Klasse mpPhpTemplate

Aus dem Wunsch, eine einfache Template Engine zu Verwenden, ist die Klasse mpPhpTemplate entstanden. Die Aufgabe der Klasse beschränkt sich auf das Verarbeiten des Templates ohne großartiges Parsen und Ersetzungen. Dabei wird das Template wie PHP-Code behandelt, daher ist die Verwendung von PHP-Syntax und HTML-Code möglich.


Verwendung

Um mpPhpTemplate zu verwenden, braucht es im Sourcecode per include_once/require_once eingebunden zu werden. Im folgenden ein Beispiel zum Einsatz:

// template klasse einbinden, ggf. den Pfad anpassen
require_once('class.mpphptemplate.php');

// template konfiguration
$options = array(
    'replace_echo_shortcut' => true, // flag um "<?=" gegen "<?php echo" zu ersetzen
    'silent_mode'           => false // unterdrückung von fehlern
);

// eine template instanz erstellen
$template = new mpPhpTemplate($options);

// einige templatevariablen zuweisen
$template->assign('title', 'A mpPhpTemplate example');
$template->assign('header', 'Table of books');

// etwas komplizierte datenstruktur zuweisen
$books = array(
    0 => array(
        'isbn'   => '978-3939084143',
        'title'  => 'Das Symfony Framework: Enterprise Anwendungen mit PHP',
        'author' => 'Timo Haberkern'
    ),
    1 => array(
        'isbn'   => '978-3836210683',
        'title'  => 'Zend Framework: PHP-Anwendungen mit dem Zend Framework entwickeln',
        'author' => 'Carsten Möhrke'
    ),
    2 => array(
        'isbn'   => '978-3898645355',
        'title'  => 'PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren',
        'author' => 'Christopher Kunz'
    )
);

$template->assign('books', $books);

// ausgabe generieren
echo $template->parse('example1_tpl.php', true);

Das Template 'example1_tpl.php' dazu sieht folgendermaßen aus:

<html>
<head>
    <title><?=$title?></title>
</head>
<body>
<h1><?=$header?></h1>
<table cellpadding="3">
<tr>
    <th>ISBN-13</th><th>Title</th><th>Author</th>
</tr>
<?php foreach ($books as $book) : ?>
<tr>
    <td><?=$book['isbn']?></td><td><?=$book['title']?></td><td><?=$book['author']?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>

Beschreibung der Konfiguration

replace_echo_shortcut (bool):
Schalter um "<?=" gegen "<?php echo" zu ersetzen. PHP Code beginnt normalerweise mit dem öffnenden Tag "<?php" (<?php echo $foo ?>). Diese Schreibweise kann bei einfachen Ausgaben doch etwas umständlich sein. In der php.ini kann man die short_open_tag-Direktive aktivieren, was die Schreibweise auf <? echo $foo ?> verkürzt. Zusätzlich gibt es noch für echo die Kurzschreibweise <?= $foo ?>.

mpPhpTemplate unterstützt die letzte kurze Schreibweise (<?= $foo ?>), auch wenn die Option in der php.ini deaktiviert ist. Wird replace_echo_shortcut auf true gesetzt, werden alle vorkommen von "<?=" gegen "<?php echo" ersetzt.

silent_mode (bool):
Schalter um Fehler zu unterdrücken. Irgendeinen Hacken gibt es immer, auch hier ist es nicht anders. Wird im Template eine Variable verwendet, die per assign() nicht zugewiesen wurde, oder der PHP-Code im Template ist fehlerhaft, wird das von PHP mit einem Fehler/einer Warnung quitiert.
Dies lässt sich mit dem Setzen des Schalters unterdrücken.


History

  • 30.08.2008 (Version 0.1):
    First release