Per chi non lo conoscesse Smarty è uno dei più diffusi e potenti template engine disponibili per PHP.
Uso Smarty da più di 8 anni in qualsiasi progetto PHP debba sviluppare ed ha sempre compiuto il suo dovere alla grande, ma ha anche senza dubbio alcuni piccoli difetti che, seppur non rivelandosi mai bloccanti, rovinano un software altrimenti vicino alla perfezione.
Fin dalle prime versioni di sviluppo sto provando a utilizzare la versione 3 di Smarty che lentamente sta finalmente per raggiungere il suo primo rilascio stabile (è da poco uscita la RC3). Vediamo alcuni aspetti per cui varrà la pena fare l’upgrade di versione.
1. Riscrittura completa con un vero Lexer
Per questa nuova versione gli sviluppatori hanno deciso di riscrivere in maniera quasi completa il motore che effettua l’interpretazione del linguaggio e facendolo hanno implementato un vero e proprio lexer come quelli usati da molti linguaggi di programmazione, che gli garantisce molta più flessibilità internamente. Anche se per gli utilizzatori finali non sembra una novità degna di nota, questa riscrittura consente a smarty di superare molti limiti tecnici che si erano venuti a presentare nel corso degli anni nella versione precedente e sarà quindi interessante seguirne gli sviluppi futuri.
2. Addio tag {literal}/{ldelim}/{rdelim}
Se siete utilizzatori abituali di Smarty conoscerete sicuramente questi tag, che servono a poter utilizzare all’interno dei template le parentesi graffe senza chiamare in causa Smarty.
In smarty 2 se avessimo voluto stampare una funzione javascript all’interno del template di una pagina html avremmo dovuto ricorrere al tag literal o ai tag ldelim e rdelim:
[html]
<h1>In Smarty 2</h1>
<script type="text/javascript">
{literal}
function esempio() {
alert(‘OK’);
}
{/literal}
function esempio2() {ldelim}
alert(‘OK’);
{rdelim}
</script>
[/html]
Come vedete fanno schifo entrambe le versioni, anche se di fatto questo non è mai stato un problema.
In Smarty 3 invece è possibile scrivere semplicemente:
[html]
<h1>In Smarty 3</h1>
<script type="text/javascript">
function esempio() {
alert(‘OK’);
}
</script>
[/html]
Magia? Semplicemente il nuovo parser “capisce” che essendo la parentesi graffa isolata (è seguita da un a-capo, ma anche uno spazio avrebbe avuto lo stesso effetto), non deve essere interpretata come tag smarty.
Sebbene ci potrebbero essere ancora casi in cui questi sgraditi tag possano tornare utili, nella maggior parte dei casi non ci serviranno più.
3. Nuovo {foreach $array as $key=>$value}
Una delle sintassi peggiori di smarty 2 era il suo incomprensibile ciclo {foreach from=$array item=value} o l’alternativa per array con indici numerici {section}.
Finalmente è possibile usare:
[html]
{foreach $array as $key=>$value}
<div>Chiave: {$key}</div>
<div>Valore: {$value}</div>
{/foreach}
[/html]
e per questo voglio dire solo una cosa agli sviluppatori: Grazie!
PS: c’è anche un tag {while CONDIZIONE}{/while}
4. Razionalizzati assegnamenti di variabili
Sapete qual’è un altro tag smarty che non sopporto e che finalmente posso smettere di usare? Il tag {assign}.
Finora se avessi voluto assegnare una variabile in smarty avrei dovuto fare così questa cosa orribile:
[html]
{assign name=var value="Mia variabile"}
[/html]
Ora, sempre grazie al nuovo parser, si può assegnare una variabile semplicemente così:
[html]
{$var="Mia variabile"}
{$x=0}
{$x++}
[/html]
Semplicemente fantastico!
5. Interpretazione variabili in stringhe con virgolette-doppie
Finora abbiamo visto modifiche di sintassi che rendono sicuramente più elegante il codice ma credo che questa novità le batte tutte.
Finalmente utilizzando le stringhe a virgolette doppie è possibile inserire variabili al loro interno e farle interpretare da smarty. Inoltre l’interprete è in grado di analizzare anche espressioni complesse, come calcoli matematici, rendendosi superiore al parser nativo del PHP.
[html]
{include file="blog_post.tpl" title="Post #{$postid}"}
{$x=2}
<div>{"x*3 = {$x*3}"|strtoupper}</div> <!– X*3 = 6 –>
[/html]
6. {if $var is in $array}
Nuovo comodo tag per verificare la presenza di un valore in un array. Meglio della sintassi originale del PHP usando in_array(), anche se a questo punto “is” mi sembra superfluo e avrei accorciato ancora in {if $var in $array} come in altri linguaggi…
7. Ereditarietà dei template
Eccoci alla “killer feature” di Smarty 3.
E’ ora possibile creare dei template che ereditano da altri template, vediamo un esempio pratico del funzionamento:
base.tpl
[html]
<html>
<head>
<title>Prova</title>
</head>
<body>
{block name="body"}
Questo sito è realizzato con smarty 3
{/block}
</body>
</html>
[/html]
homepage.tpl
[html]
{extends file="base.tpl"}
{block name="body"}
<h1>{$smarty.block.parent}</h1>
<div>
E realizzarlo è stato divertente.
</div>
{/block}
[/html]
Ora visualizzando il template “homepage.tpl”, erediteremo la struttura del template “base.tpl”, ma il blocco di nome “body” sarà sostituito dalla nuova versione specializzata, che potrà comunque accedere al contenuto del blocco originale tramite la variabile {$smarty.block.parent}.
I blocchi possono anche essere annidati e sfruttare l’ereditarietà in questo modo può semplificare molto la complessità delle nostre pagine.
Conclusioni
Ci sono molte altre novità in questa nuova versione, ad esempio tutto il codice è ora ad oggetti e ci sono anche nuove funzionalità relative alla sicurezza, ma quelle degne di nota e che ho trovato più appaganti da usare sono sicuramente queste.
Smarty 3 è in sviluppo da quasi 2 anni credo, ma finalmente il momento del rilascio stabile sembra vicino e comunque posso dire da esperienza diretta che le ultime RC sono già molto stabili e garantiscono che non ci saranno più stravolgimenti di codice ma solo bugfix tra un rilascio e l’altro, quindi se voleste potreste iniziare a utilizzarlo già da subito senza pentirvene.