PHP/Smarty

Wikibooks, manuali e libri di testo liberi.
< PHP
Indice del libro

Nella realizzazione di siti web di grosse dimensioni talvolta il lavoro del "web master" viene diviso tra più figure, che sono solitamente il web designer (che si occupa prevalentemente di HTML e fogli di stile) e il programmatore vero e proprio (che codifica la struttura interna del sito in PHP). In questi casi può nascere l'esigenza di separare tutto ciò che riguarda l'interfaccia grafica e quello che invece riguarda la programmazione della struttura interna del sito.

Per fare questo ci vengono in aiuto i cosiddetti template engine, ovvero strumenti sviluppati appositamente per separare la programmazione dalla realizzazione grafica del sito, tramite l'utilizzo di particolari file chiamati template. In questo modulo analizzeremo in particolare uno dei template engine più diffusi, Smarty.

Installazione e configurazione[modifica]

L'installazione di Smarty è piuttosto semplice. Innanzitutto bisogna scaricare dal sito di Smarty i sorgenti, all'indirizzo http://www.smarty.net/download.php.

Installazione su Linux[modifica]

Per prima cosa installiamo sul nostro disco rigido i file necessari:

  1. Decomprimere l'archivio .tar.gz o .zip che avete appena scaricato in una cartella dei temporanea
  2. Creare una cartella dove contenere i sorgenti di Smarty, preferibilmente esterna alla root del vostro server (in questo modo i file non saranno accessibili dalla rete). Ad esempio può essere posizionata tra i file delle librerie di PHP (/usr/local/lib/php/Smarty)
  3. Copiare, nella cartella appena creata, il contenuto della sottocartella Smarty-[versione]/libs/ che avete estratto prima.

Ora è necessario impostare alcune cartelle nel web server. Nella nostra root del web server (ad esempio /var/www/) creiamo una cartella smarty e quattro sottocartelle smarty/templates, smarty/config, smarty/templates_c e smarty/cache. Assegnate alle ultime due cartelle cache e templates_c i permessi di scrittura in modo che possano essere scritte dal web server:

$> chmod 775 smarty/cache
$> chmod 775 smarty/templates_c

Ora tutto è pronto per utilizzare Smarty nel vostro PHP:

//carica la classe Smarty
require_once('/usr/local/lib/php/Smarty/Smarty.class.php');

$smarty = new Smarty();

//imposta le variabili d'ambiente
$smarty->template_dir = '/var/www/smarty/templates';
$smarty->config_dir = '/var/www/smarty/config';
$smarty->compile_dir = '/var/www/smarty/templates_c';
$smarty->cache_dir = '/var/www/smarty/cache';

Installazione su Windows[modifica]

Per prima cosa, estraiamo i file in una cartella, preferibilmente esterna alla root del web server, ad esempio C:\Smarty-[versione], e rinominamo la cartella in C:\smarty che avrà una struttura simile a questa:

  • cache
  • demo
  • libs
  • misc
  • templates_c
  • unit_test
  • altri file...

I file che ci interessano sono nella cartella libs. Apriamo il file di configurazione di php (php.ini), situato solitamente nella cartella di installazione di PHP, e aggiungete questa riga:

include_path = ".;c:\smarty\libs" 

In questo modo sarà possibile richiamare i file delle librerie di Smarty ogni volta che si vuole.

Ora è necessario impostare alcune cartelle sul vostro web server: create nella www root una cartella smarty e quattro sottocartelle smarty/templates, smarty/config, smarty/templates_c e smarty/cache. Assegnate alle ultime due cartelle cache e templates_c i permessi di scrittura in modo che possano essere scritte dal web server.

Ora è tutto pronto per utilizzare Smarty:

//carica la classe Smarty
require_once('Smarty.class.php');

$smarty = new Smarty();

//imposta le variabili d'ambiente
$smarty->template_dir = 'c:/inetpub/wwwroot/smarty/templates';
$smarty->config_dir = 'c:/inetpub/wwwroot/smarty/configs';
$smarty->compile_dir = 'c:/inetpub/wwwroot/templates_c';
$smarty->cache_dir = 'c:/inetpub/wwwroot/cache';

Se non avete la possibilità di impostare il php.ini (ad esempio perché avete uno spazio web su un server condiviso) copiate la cartella libs di Smarty sul vostro spazio web, create le cartelle necessare e poi inserite nel vostro codice php (supponendo che il file sia posto nella root):

//carica la classe Smarty
require_once('smarty/libs/Smarty.class.php');

Iniziamo ad usare Smarty[modifica]

Una delle caratteristiche più "comode" di Smarty è sicuramente la possibilità di creare un unico file HTML, chiamato template, che verrà utilizzato per definire la struttura di tutte le pagine della nostra applicazione web. Siccome il caricamento della libreria di Smarty e la configurazione delle variabili d'ambiente sono un'operazione sempre uguale, è possibile impostare un file di configurazione (chiamato ad esempio global.php) che contenga il codice visto precedentemente nei paragrafi sull'installazione.

Un semplice esempio[modifica]

La logica di Smarty si basa in linea di massima su due file, un template e una pagina PHP. La pagina del template, con estensione tpl, contiene il codice HTML della struttura della pagina con l'aggiunta del codice specifico per Smarty, mentre la pagina PHP conterrà il richiamo a Smarty, la normale elaborazione PHP (ad esempio le richieste al database) e il richiamo nuovamente al template Smarty con il passaggio dei valori necessari al rendering.

Ecco un esempio di un semplice template:

{* questo è un commento Smarty. Non comparirà nella pagina HTML *}
<!-- i commenti HTML saranno invece visibili normalmente -->
<html>
<head>
<title>{$titolo}</title>
</head>
<body>
{$contenuto}
</body>

Salviamo il file nella cartella /smarty/templates sul nostro web server con il nome "prova.tpl". Ad esso associamo il nostro file PHP in questo modo:

//inserisce il file di configurazione di Smarty creato da noi
require_once('global.php');

$smarty->assign('titolo', "Pagina di prova creata con Smarty");
$smarty->assign('contenuto', "Questa è una bellissima pagina");

$smarty->display('prova.tpl');

Salviamo il file sul server con il nome di prova_smarty.php.

Se è stato impostato tutto correttamente, caricando la nostra pagina prova_smarty.php otterremo una semplice pagina HTML con titolo "Pagina di prova creata con Smarty" e con una sola frase "Questa è una bellissima pagina".

Cos'è successo? Nel template abbiamo posto alcuni tag particolari ({$titolo} e {$contenuto}). Nel linguaggio dei template di Smarty queste diciture indicano delle variabili che devono essere riempite con dei valori dal codice PHP. Nel codice PHP, infatti, abbiamo usato il metodo assign dell'oggetto Smarty per assegnare alle variabili titolo e contenuto i rispettivi valori.

Variabili[modifica]

Lo scopo delle variabili è principalmente quello di passare dei valori dal codice PHP al template Smarty, tramite il metodo assign:

$smarty->assign('titolo', 'Prodotti') //valorizza la variabile "titolo"

Potete assegnare alle variabili qualsiasi valore PHP, dalle stringhe ai numeri, compresi gli oggetti e gli array:

$smarty->assign('prodotti', array(
    array (
        "ID" => "1"
        "nome" => "Televisore"
        "prezzo" => "200"
    )
    array (
        "ID" => "2"
        "nome" => "Lettore CD"
        "prezzo" => "50"
    )
)
); //valorizza la variabile "prodotti" multidimensionale

Nel nostro template Smarty potremmo scrivere:

{$prodotti[1].nome} {*stampa "Televisore"*}
{$prodotti[2].ID} {*stampa "2"*}

Per accedere agli oggetti, invece, sarà sufficiente usare la sintassi $variabile->proprietà nel codice Smarty.

Alle variabili è possibile applicare i normali operatori aritmetici di PHP:

{$prezzo/100*(100-$sconto)} {* applica lo sconto al prezzo *}

La variabile $smarty[modifica]

La variabile speciale $smarty permette di accedere a particolari valori:

  • alle variabili superglobali di PHP get, post, cookies, server, environment e session
 {$smarty.get.id} <!--mostra il valore di $_GET['id']-->
  • alla data corrente usando $smarty.now (restituisce un timestamp da formattare)
  • alle costanti PHP usando $smarty.NOME_COSTANTE
  • al nome del template in uso, con $smarty.template

Modificatori[modifica]

I modificatori consentono di intercettare il valore di una variabile da stampare e lo restituiscono opportunatamente modificato; per usarli basta inserirli dopo il nome della variabile separati da un pipe (|) e separando gli argomenti con :.

Alcuni dei modificatori più comuni sono, ad esempio:

  • default: serve per indicare un valore di default nel caso la variabile sia vuota.
{$nome|default:Mario Rossi} <!-- se $nome è vuoto, verrà stampato "Mario Rossi -->
  • lower e upper restituisce il valore della variabile rispettivamente tutto minuscolo e tutto maiuscolo; ad esempio, se la variabile $nome contiene "Mario Rossi":
{$nome|lower} <!-- restituisce "mario rossi" -->
{$nome} <!-- restituisce "Mario Rossi" -->
{$nome|upper} <!-- restituisce "MARIO ROSSI" -->
  • truncate: tronca la parola al carattere indicato come primo argomento, concatenando alla fine la stringa indicata come secondo argomento:
{$nome|truncate:7:...} {* restituisce "mario r..." *}

Funzioni[modifica]

Smarty mette inoltre a disposizione alcune funzioni per lavorare sui dati: vedremo le due più importanti, la funzione if e la funzione foreach.

if[modifica]

La funzione if di Smarty è molto simile al costrutto if di PHP:

{if condizione}
    ...codice HTML se condizione è vera....
{else}
    ...codice HTML se condizione è falsa...
{/if}

Gli operatori logici e di confronto sono gli stessi disponibili in PHP:

 {if $prezzo > 300} <!-- applico uno sconto del 5% -->
     <p>Prezzo totale: {$prezzo/100*95} &euro;</p>
 {elseif $prezzo > 100} <!-- applico uno sconto del 10% -->
     <p>Prezzo totale: {$prezzo/100*90} &euro;</p>
 {else} <!-- applico uno sconto del 120% -->
     <p>Prezzo totale: {$prezzo/100*80} &euro;</p>

<!-- se il cliente ha più di 18 anni e ha più di 10 acquisti mostro il link -->
 {if $eta > 18 and $acquisti > 10}
     <p>Scopri la nostra offerta! <a href="/registrati">Registrati ora!</a>
 {/if}

<!-- se il cliente abita in Italia sconto del 5% sulle spedizioni -->
 {if $nazione eq "it" }
     <p>Per i residenti in Italia sconto 5% sulla spedizione!</p>

foreach[modifica]

La funzione foreach permette di iterare sugli elementi di una variabile valorizzata con un array da PHP. La sua sintassi è:

{foreach from=$array item=elemento}
    ...codice...
{foreachelse}
    ...questo codice viene eseguito se $array è vuoto...
{/foreach}

dove $array è la variabile Smarty contenente un array e elemento il nome della variabile che conterrà ad ogni iterazione il valore di un elemento dell'array.

Con gli array associativi si usa la stessa sintassi, con l'aggiunta del parametro key che specifica il nome della variabile a cui assegnare la chiave.

Scrivere:

{foreach from=$array item=valore key=chiave}

è come scrivere in PHP:

foreach ( $array as $chiave => $valore )

Facciamo un esempio. Valorizziamo una variabile Smarty da PHP:

$smarty->assign ( 'abba',
    array( 
        array ( "nome" => "Björn", "cognome" => "Ulvaeus" ),
        array ( "nome" => "Benny", "cognome" => "Andersson" ),
        array ( "nome" => "Agnetha", "cognome" => "Fältskog",
        array ( "nome" => "Anni-Frid", "cognome" => "Lyngstad" )
    )
);

Nel file Smarty potremo scrivere:

<p>Ecco i quattro componenti degli ABBA:</p>
<ul>
{foreach from=$abba item=abba_componente}
    <li>{$abba_componente.nome} {$abba_componente.cognome}</li>
{/foreach}
</ul>

È possibile assegnare un nome alle istruzioni foreach, usando il parametro name; sarà quindi possibile accedere alla variabile Smarty $smarty.foreach.nomeforeach, che contiene le proprietà relative al ciclo foreach, come ad esempio:

  • iteration: restituisce il numero dell'iterazione corrente (alla prima esecuzione del ciclo conterrà 1, poi 2 e così via)
  • first e last: restituiscono true se il ciclo è rispettivamente alla prima e all'ultima iterazione

Collegamenti esterni[modifica]