Coraz częściej spotykam się z kodem pisanym na szybko przez ludzi mających nikłe pojęcie o swoim podstawowym narzędziu pracy - języku PHP. Kawałki kodu wyglądają tak:

while($row = mysql_fetch_array($result))
{
	print "<tr><td>" . $row['imie'] .
	"</td><td>" . $row['nazwisko'] .
	"</td><td>" . date("d.m.Y", $row['data_urodzenia']) .
	"</td></tr>\n";
}

Kod paskudny i na ogół wyświetlanie wyników zajmuje przynajmniej 3/4 pliku, który odpowiada za ich pobieranie z bazy. Znacznie wygodniej byłoby oddzielić widok od kontrolera i pozwolić temu pierwszemu troszczyć się o formatowanie danych (date(...);), a temu drugiemu zająć się tylko wydobywaniem niezbędnych danych.

Tutaj pojawiają się szablony. Równie kiepskim pomysłem, jak wypluwanie kodu HTML bezpośrednio przez kontroler, jest pisanie własnego silnika szablonowego. Znacznie lepiej stosować powszechnie uznane narzędzia, jak Smarty - system inteligentnych szablonów.

Powyższy przykład przepisany za pomocą Smarty składałby się z dwóch plików. Pierwszy plik, z kontrolerem wyglądałby tak:

$smarty = & new Smarty();
$dataset = array();

while($row = mysql_fetch_assoc($result))
{
	array_push($dataset, $row);
}

$smarty->assign('dataset', $dataset);
$smarty->display('data-template.html');

Drugi zaś, zawierający sam szablon:

<table>
{section name="row" loop=$dataset}
	<tr>
		<td>{$dataset[row].imie}</td>
		<td>{$dataset[row].nazwisko}</td>
		<td>{$dataset[row].data_urodzenia|
		date_format:"%d.%m.%Y"}</td>
	</tr>
{/section}
</table>

Największa zaleta tego podejścia - czytelność i uniezależnienie silnika strony od jej wyglądu.

Druga zaleta - reużywalność raz wykonanych szablonów, załóżmy bowiem, że strona zawiera formularz, który należy wypełnić i który jest następnie walidowany po stronie serwera pod kątem poprawności pól. Co jeśli pola nie są wypełnione poprawnie? Niektóre serwisy wyświetlają błąd i przycisk wstecz - niezbyt elegancka metoda, biorąc pod uwagę, że IE skrupulatnie czyści pola formularza przy wracaniu do strony z historii. Można jednak przygotować jeden formularz:

<form action="/" method="post">
	<fieldset>
		<legend>Dane osobowe</legend>
		<p>Imię:
		<input type="text" name="imie"
		value="{$smarty.post.imie}"></p>
		<p>Nazwisko:
		<input type="text" name="nazwisko"
		value="{$smarty.post.nazwisko}"></p>
		<p>Email:
		<input type="text" name="email"
		value="{$smarty.post.email}"></p>
	</fieldset>
</form>

Następnie wywołać go dwukrotnie - raz przy konieczności jego wypełnienia, drugi raz w funkcji sprawdzającej jego poprawność, jeśli zaistnieje taka potrzeba. Pola pozostaną wypełnione, a użytkownik ograniczy się do poprawienia tylko tych danych, które wprowadzone zostały błędnie.

Trzecia zaleta - system taki pozwala na jednoczesną pracę programistów i webmasterów, szablony można rozwijać równolegle z kodem, co znacznie przyspiesza rozwój serwisu, a czas realizacji jest często kluczowym kryterium przy negocjacjach z klientami.