Continuiamo la nostra introduzione a Smarty, un potente template engine per PHP, analizzando alcuni esempi utilizzabili nei progetti di tutti i giorni.
Iterazioni
Una delle funzionalità più usate nei template, soprattutto nell’ambito delle applicazioni web, è l’iterazione (detta anche loop). Si utilizza ad esempio per formattazione di elenchi di vario tipo o tabelle, su dati provenienti da database o creati da codice. Vediamo un esempio.
Creiamo la solita paginetta di prova e inseriamo questo codice:
<?php define('SMARTY_DIR', '[DIRECTORY DI INSTALLAZIONE DI SMARTY]/libs/'); require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); class User { public $id; public $username; public $firstName; public $lastName; public $birthDate; function __construct($in_id, $in_username, $in_firstName, $in_lastName, $in_birthDate) { $this->id = $in_id; $this->username = $in_username; $this->firstName = $in_firstName; $this->lastName = $in_lastName; $this->birthDate = $in_birthDate; } } $users = array( new User(1, 'pincopallo', 'Pinco', 'Pallino', new DateTime('2000-01-01')), new User(2, 'pippo', 'Pippo', 'Goofy', new DateTime('1932-04-20')), new User(3, 'pluto', 'Pluto', 'Pup', new DateTime('1930-08-24')), new User(4, 'paperino', 'Paolino', 'Paperino', new DateTime('1934-09-16')), new User(5, 'gargamella', 'Gargamella', 'Scorcerer', new DateTime('1959-01-01')) ); $smarty->assign('users', $users); $smarty->display('default.html'); ?>
Elementi importanti:
- abbiamo creato la classe User per memorizzare dei dati sugli utenti, includendo un costruttore;
- al template inviamo un array contenente un elenco di oggetti di tipo User.
Vorremmo far notare un piccolo trucco che abbiamo utilizzato: a differenza degli esempi nella documentazione ufficiale (e degli articoli precedenti), dove viene utilizzata l’estensione “.tpl”, qui usiamo l’estensione “.html”; dal punto di vista tecnico non cambia nulla, ma avremo il vantaggio di poter utilizzare le feature di auto-completamento di alcuni editor come JEdit o Emacs.
Salviamo dunque il nostro template in templates/default.html:
<html> <head> <title>Example</title> </head> <body> <p>Elenco utenti</p> <table border="1"> <thead> <tr> <th>ID</th> <th>Username</th> <th>Nome</th> <th>Cognome</th> <th>Data di nascita</th> </tr> </thead> <tbody> {foreach $users as $user} <tr> <td>{$user->id}</td> <td>{$user->username}</td> <td>{$user->firstName}</td> <td>{$user->lastName}</td> <td>{$user->birthDate->format('d/m/Y')}</td> </tr> {/foreach} </tbody> </table> </body> </html>
Il tag {foreachelse} ci permette di mostrare un pezzo di codice alternativo nel caso l’array sia vuoto. Per verificarlo è sufficiente modificare la dichiarazione dell’array users nella pagina PHP, eliminando tutti i dati di prova:
$users = array();
e aggiungere la sezione {foreachelse} al corpo della tabella nel template default.html:
{foreach $users as $user} <tr> <td>{$user->id}</td> <td>{$user->username}</td> <td>{$user->firstName}</td> <td>{$user->lastName}</td> <td>{$user->birthDate->format('d/m/Y')}</td> </tr> {foreachelse} <tr> <td colspan="5">Nessun utente trovato</td> </tr> {/foreach}
Uso dei tag logici: {if} ed {else}
Un altro modo per mostrare contenuti alternativi è verificare direttamente le dimensioni dell’array, utilizzando i tag logici {if} ed {else}. Creiamo un secondo template, templates/default2.html:
<html> <head> <title>Example</title> </head> <body> <p>Elenco utenti</p> {if count($users) > 0} <table border="1"> <thead> <tr> <th>ID</th> <th>Username</th> <th>Nome</th> <th>Cognome</th> <th>Data di nascita</th> </tr> </thead> <tbody> {foreach $users as $user} <tr> <td>{$user->id}</td> <td>{$user->username}</td> <td>{$user->firstName}</td> <td>{$user->lastName}</td> <td>{$user->birthDate->format('d/m/Y')}</td> </tr> {/foreach} </tbody> </table> {else} <p>Nessun utente trovato</p> {/if} </body> </html>
In questo esempio se l’array users è vuoto la tabella non viene nemmeno creata, una soluzione forse più elegante rispetto all’esempio con il tag {foreachelse}.