Download Coding Standard

Template Engine nur mit PHP

Code und Design zu trennen ist eine der wichtigsten Aufgaben eines professionellen PHP-Programmierers. Klassen und Funktionen unterstützen Sie darin modular zu programmieren. Wenn Sie jedoch PHP und HTML mischen, behindern Sie sich beim modularen Ansatz und ihre Skripte werden automatisch unübersichtlich. Es ist jedoch nicht nötig auf die Vorteile einer Template Engine zu verzichten. Mit einfachen Mitteln ist man schnell in der Lage PHP und (X)HTML zu trennen. Die meisten folgenden Beispiele sind auch mit vlibTemplate, Smarty und TinyButStrong umgesetzt worden.

Alle Beispiele können online eingesehen und bald auch heruntergeladen werden.

einfaches Beispiel

Die Idee zum folgenden Beispiel wurde von der Datei "basic.php" (vlibTemplate) eins zu eins übernommen. Um PHP und HTML zu trennen braucht man zwei seperate Dateien. Zuerst erklären wir das Template "template.htm":

<!DOCTYPE html PUBLIC (...)> <html> <head> <title><?=$title_text?></title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> </head> <body> <p><?=$body_text?></p> </body> </html>

Wie man sehen kann, enthält die Datei nur reines (X)HTML bis auf die Ausgabe der (Template)Variablen

  • $title_text
  • $body_text

über eine Kurzschreibweise, die von den meisten PHP-Installationen unterstützt wird, aber nicht immer verfügbar ist. Zitat von php.net: "Die Kurzform der Tags ist nur möglich, wenn diese zuvor aktiviert wurde. Dies kann mittels (...) Setzen der Konfigurationsoption short_open_tag in der PHP Konfigurationsdatei, oder durch das Kompilieren von PHP mit der Option --enable-short-tags."

Das PHP-Skript muss die Variablen definieren und das Template "template.htm" inkludieren:

<?php
    
$title_text 'TITLE: This is a basic example ...';
    
$body_text 'BODY: Using a simple PHP Template Engine ...';

    require_once 
'template.htm';
?>

Das PHP-Skript liefert die gesamte Logik. Wenn also eine Verbindung zu einem RDBMS aufgebaut oder ein Verzeichnis ausgelesen werden soll, dann geschieht das im PHP-Skript. Alle Beispiele können auch komplett, also mit PHP-Code und Template, angesehen werden.

IF-Strukturen im Template

Man sollte in den Templates auf Programmierlogik soweit wie möglich verzichten, weil es dem Ansatz einer Template Engine widerspricht, komplexe Schleifen und andere Programmierung ins Template zu legen. IF-Strukturen sind jedoch manchmal unumgänglich, weil anhand einer Variable entschieden werden soll, ob ein bestimmter Bereich ausgegeben wird oder nicht.

<body> <?php if ('admin' == $row['status']): ?> <p>admin</p> <?php elseif ('supermod' == $row['status']): ?> <p>super moderator</p> <?php else: ?> <p>member</p> <?php endif; ?> </body>

Sollte $row['status'] nicht gesetzt sein, so wird "member" ausgegeben. Die anderen beiden Fälle berücksichtigen den Status "admin" und "supermod".

Diese Schreibweise findet man bei php.net im Kapitel 12: Kontroll-Strukturen und sie wird auch für Blöcke (Tabellen, Aufzählungslisten, etc.) mit foreach eingesetzt. Der Vorteil dieser Schreibweise sind die fehlenden Klammern. Start und Ende der IF-Struktur sind klar definiert und man muss sich um die Klammersetzung nicht kümmern.

Blöcke: Tabellen, Aufzählungslisten, etc.

Blöcke (in vlibTemplate "loop" genannt) werden in den meisten Template Engines gleich behandelt. Zuerst wird ein Array erstellt, der alle Datensätze enthält, dann werden diese Datensätze ausgegeben.

<?php
    $title_text 
'TITLE: This example contains two blocks';
    $block = array('Claus''Kelvin''Skrol''Daniel''Micheal');

    require_once 'two_blocks.htm';
?>

Man sollte den Array so aufbauen, dass man ihn while oder foreach ausgeben kann, um das Template frei von komplexer Logik zu halten.

<body> <ul> <?php foreach ($block as $value): ?> <li><?=$value?></li> <?php endforeach; ?> </ul> <table width="100%" border="1"> <?php foreach ($block as $value): ?> <td><?=$value?></td> <?php endforeach; ?> </table> </body>

Wie man sieht wird der Array $block mit foreach in einer Aufzählungsliste und in einer Tabelle ausgegeben.

Datenbankausgaben

Datenbankausgaben gehören zur täglichen Arbeit jedes PHP-Programmierers. Ob man das jetzt mit den Standardbefehlen von PHP macht oder über ein ADOdb (Datenbank-Abstraktions-Layer), sei mal dahin gestellt. Wie die Tabelle aufgebaut werden muss und welche PHP-Befehle wir benötigen, wird in den folgenden Beispielen erklärt:

Es muss also eine Datenbank und die Variable $result vorhanden sein, damit der Array $table_data mit array_push() aufbereitet werden kann.

<?php
(...)
    $table_data = array();
    while (
$row mysql_fetch_assoc($result))
    { 
        array_push(
            $table_data,
            array(

                'name' => $row['name'],
                'city' => $row['city']
            )
        );
    }

(...)
?>

Auch hier sind alle Datensätze in einem einzigen Array gespeichert. Das ist notwendig, damit im Template der foreach nur noch den Array durchlaufen muss.

<body> <table border="1" width="70%">    <caption>MySQL data in a table using FOREACH (Template) and ARRAY_PUSH (PHP)</caption>    <thead>       <tr>          <th>name</th>          <th>city</th>       </tr>    </thead>    <tbody>      <?php foreach ($table_data as $td_row): ?>       <tr>          <td><?=$td_row['name']?></td>          <td><?=$td_row['city']?></td>       </tr>      <?php endforeach; ?>    </tbody> </table> </body>

Obwohl der XHTML-Code komplizierter ist, unterscheidet sich die PHP-Technik im Template nicht von den oben erklärten Blöcken. Mehrere Datensätze werden immer in Blöcken ausgegeben. Manchmal werden Blöcke auch "sections" oder "loops" genannt.