In diesem Post möchte ich aufzeigen, wie man HTML komplett vom PHP-Code löst, ohne dafür eine Template-Engine zu verwenden. Aber erst mal werfen wir einen Blick auf die Vor- und Nachteile:
Template-Engine:
- + ermöglicht (meist) das Caching der Ausgabe und kann so den Server deutlich entlasten
- + klare Trennung von PHP-Code und Markup
- - bei erstmaliger Verwendung einer Template-Engine ist meist eine lange Einarbeitungszeit vonnöten
- - zusätzlich Syntax
PHP-Only:
- + ebenfalls klare Trennung von PHP-Code und Markup
- + schnelle Einarbeitung, da die PHP-Syntax verwendet werden kann
- - Caching-System müsste selbst gescriptet werden
Im Grunde muss man also selbst abwägen, ob sich das Einarbeiten in einer Template-Engine für das Projekt lohnt oder, ob man nicht den einfacheren und schnelleren Weg wählt.
Als Test- und Demonstrationsobjekt für folgende Template-Eninge / PHP Vergleiche habe ich Smarty gewählt. Und ich fange auch gleich an. (aus dem Smarty Crashkurs http://www.smarty.net/crashcourse.php)
PHP-Code:
include('Smarty.class.php');
// create object
$smarty = new Smarty;
// assign an array of data
$smarty->assign('name', array('bob','jim','joe','jerry','fred'));
// assign an associative array of data
$smarty->assign('users', array(
array('name' => 'bob', 'phone' => '555-3425'),
array('name' => 'jim', 'phone' => '555-4364'),
array('name' => 'joe', 'phone' => '555-3422'),
array('name' => 'jerry', 'phone' => '555-4973'),
array('name' => 'fred', 'phone' => '555-3235')
));
// display it
$smarty->display('index.tpl');
Entsprechende “index.tpl”-Datei:
<table>
{section name=mysec loop=$name}
{strip}
<tr>
<td>{$name[mysec]}</td>
</tr>
{/strip}
{/section}
</table>
<table>
{section name=mysec loop=$users}
{strip}
<tr>
<td>{$users[mysec].name}</td>
<td>{$users[mysec].phone}</td>
</tr>
{/strip}
{/section}
</table>
Wie man sieht muss erst die Smarty-Klasse inkludiert werden, ein Smarty-Objekt erzeugt werden und Variablen / Arrays müssen Smarty auch erst bekannt gemacht werden. In der Template-Datei werden dann, mit Smartyeigener Syntax, Schleifen erstellt und die Variablen angezeigt.
Wie das wesentlich einfacher geht, zeige ich jetzt:
// array of data
$name = array('bob','jim','joe','jerry','fred');
// associative array of data
$users = array(
array('name' => 'bob', 'phone' => '555-3425'),
array('name' => 'jim', 'phone' => '555-4364'),
array('name' => 'joe', 'phone' => '555-3422'),
array('name' => 'jerry', 'phone' => '555-4973'),
array('name' => 'fred', 'phone' => '555-3235')
);
// display it
require_once('index.html');
Die index.html:
<table>
<?foreach($name as $n):?>
<tr>
<td><?=$n?></td>
</tr>
<?endforeach?>
</table>
<table>
<?foreach($users as $user):?>
<tr>
<td><?=$user[name]?></td>
<td><?=$user[phone]?></td>
</tr>
<?endforeach?>
</table>
Wie man sieht, wird des Markup ebenfalls sauber vom Code getrennt, und das ohne die Zuhilfenahme von einer Template-Engine. Das eigentliche Script brauch nicht speziell angepasst werden, und wir können wie gewohnt weiterarbeiten. In der HTML-Datei (die am Ende der PHP Datei via require_once() inkludiert wird) haben wir nun auch nur noch HTML und -via PHP-Shorttags eingebettetes- PHP.
Für diejenigen, die noch etwas weiter ins Detail gehen möchte, empfehle ich folgenden Artikel : http://php-coding-standard.de/php_template_engine.php