Smarty, un template engine per PHP – parte 3

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

Link