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}.