Ik lees zo de discussie in dit topic en ervaar een algehele neiging naar het niet gebruiken van een template framework. Het staat mij natuurlijk vrij om het daarmee niet eens te zijn. Voordat ik mijn argumentatie en voorbeelden op tafel gooi wil ik eerst zeggen dat het mijn persoonlijk mening is en dat ik volledig op de hoogte ben van de wellus-nietus discussie omtrend dit onderwerp
Ik ben werkzaam bij een bedrijf dat grote en kleine PHP projecten doet. Soms 2 weken werk, maar het kan ook wel eens 8 maanden duren. Omdat we een multi-disciplinaire software development afdeling zijn, doe ik meer dan PHP alleen. Een van onze best practices is het werken volgens het MVC model. Dit model zoals velen weten scheidt de business logica van de weergave en je datasource. Om een 3-tier benadering te krijgen in onze PHP projecten hebben we strategisch gekozen voor smarty (
http://smarty.php.net). Na tientallen projecten met smarty als template framework ben ik overtuigd van de helderheid en snelheid in gebruik. Mijn ervaring is dat zowel piepkleine als megagrote projecten baat hebben bij het volgen van dit framework om code van de weergave te scheiden. Door de beperkte maar zeer krachtige set aan placeholders kan voorgrondlogica erg makkelijk aangebracht worden, terwijl de echte business logica in de PHP blijft.
Een praktijkvoorbeeldje hoe in smarty een dynamische tabel opgebouwd wordt: (gesimplificeerd)
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <table width="100%" cellpadding="0" cellspacing="0" class="normal">
<tr>
{* DISPLAY HEADER *}
<th class="left" width="55%"0%">Name</th>
<th class="left" width="35%">Approver(s)</th>
<th class="left" width="5%"%">Edit</th>
<th class="both" width="5%">Remove</th>
</tr>
{foreach name=level item=column from=$level_data}
<tr class="sep">
<td>{$column.organization}</td>
<td>{$column.approvers}</td>
<td><a href="name.php?id={$column.id}&mode=edit"></a></td>
<td><a href="name.php?level={$current_level}&delete_level={$column.id}&mode=delete"</a></td>
</tr>
{foreachelse}
<tr>
<td colspan="4">There are no sublevels for the current level</td>
</tr>
{/foreach}
</table> |
Dit is de code om de benodigde tabel data op te halen: (ezSQL framework btw)
PHP:
1
2
| $level_data = $db->get_row("SELECT * FROM levels WHERE id={$level_id}", ARRAY_A);
$smarty->assign('level_data', $level_data); |
In bovenstaand voorbeeld is het genoeg om in PHP met een simpele smarty assign de variabele $level_data te vullen met een associative array. De uitzonderingssituatie indien de array leeg mocht zijn is ook erg makkelijk te bewerkstelligen.
Het grote pluspunt van bovenstaande constructie is dat met een beetje oefening en handigheid, deze even snel te maken is dan een "reguliere" constructie. Het is echter in mijn ogen veel beter leesbaar en dus ook beter onderhoudbaar.
De reden dat ik smarty als template engine gebruik is omdat het uiterst krachtig is en toch simpel is opgezet. Ik ben er nog niks in tegengekomen dat ik niet makkelijk voor elkaar kreeg. De meerwaarde is juist om op een hele simpele manier bepaalde repeterende stukken code op te lossen. Voorbeeldje is de set van HTML form elementen. Met een placeholder kan ik gemakkelijk van een PHP array een dropdown combo, radio of checkboxes maken.
HTML:
1
2
3
| <select name=user>
{html_options values=$id output=$names selected="5"}
</select> |
Zal worden gerendered als:
HTML:
1
2
3
4
5
6
7
| <select name=user>
<option label="bob" value="1">bob</option>
<option label="jim" value="2">jim</option>
<option label="joe" value="3">joe</option>
<option label="jerry" value="4">jerry</option>
<option label="fred" value="5" selected="selected">fred</option>
</select> |
Er zijn maar weinig template engines die dit in huis hebben. Als je er eenmaal mee gewend bent is de kans groot dat je niks anders meer wilt
Smarty heeft ook de eigenschap dat het alle onbekende tags rechtsreeks doorgeeft aan de HTML, zodat je bij afwijkende HTML nog steeds consistent gebruik kunt maken van smarty.
Met templates in templates kun je heel makkelijk modulaire stukken maken als headers en footers, zonder daar in je PHP code rekening mee te houden.
Check ook de crash course van smarty:
http://smarty.php.net/crashcourse.php
Die legt de basis functionaliteit op een heldere manier uit en laat snel zien wat de meerwaarde is van dit framework.