# PHP/Smarty

PHP
Copertina Tutti i moduli · Sviluppo
    CopertinaPHP/Copertina
* IntroduzionePHP/Introduzione
** StoriaPHP/Introduzione/Storia
** Come funzionaPHP/Introduzione/Come funziona
* Installazione e configurazionePHP/Installazione e configurazione
** InstallazionePHP/Installazione
*** LinuxPHP/Installazione/Linux
*** WindowsPHP/Installazione/Windows
*** Mac OS XPHP/Installazione/Mac OS X
** ConfigurazionePHP/Configurazione
* ProgrammazionePHP/Programmazione
** CommentiPHP/Programmazione/Commenti
** VariabiliPHP/Programmazione/Variabili
** OperatoriPHP/Programmazione/Operatori
** ArrayPHP/Programmazione/Array
** CondizioniPHP/Programmazione/Condizioni
** CicliPHP/Programmazione/Cicli
** Funzioni di basePHP/Programmazione/Funzioni di base
** Funzioni personalizzatePHP/Programmazione/Funzioni personalizzate
** Variabili globaliPHP/Programmazione/Variabili globali
*** $GLOBALSPHP/Programmazione/Variabili globali/$GLOBALS
*** $_GETPHP/Programmazione/Variabili globali/$_GET
*** $_POSTPHP/Programmazione/Variabili globali/$_POST
*** $_SESSIONPHP/Programmazione/Variabili globali/$_SESSION
*** $_COOKIEPHP/Programmazione/Variabili globali/$_COOKIE
*** $_SERVERPHP/Programmazione/Variabili globali/$_SERVER
** FilePHP/Programmazione/File
** ImmaginiPHP/Programmazione/Immagini
** Espressioni regolariPHP/Programmazione/Regexp
** Programmazione orientata agli oggettiPHP/Programmazione/OOP
* Programmazione avanzata con le classi PEARPHP/PEAR
* PHP e i databasePHP/Database
** Funzioni PHP per l'accesso ai database
*** Funzioni MySQLPHP/Programmazione/MySQL
**** Accesso al databasePHP/Programmazione/MySQL/Accesso al database
**** QueryPHP/Programmazione/MySQL/Query
**** Risultati di una queryPHP/Programmazione/MySQL/Risultati di una query
**** Liberare memoria dai risultati di una queryPHP/Programmazione/MySQL/Liberare memoria dai risultati di una query
**** Chiudi connessione al dbPHP/Programmazione/MySQL/Chiudi connessione al db
*** Funzioni PostgreSQLPHP/PostgreSQL
**** Accesso al database
**** Query
**** Risultati di una query
*** Funzioni Sqlite
**** Accesso al database
**** Query
**** Risultati di una query
** Database e object oriented
*** Abstraction Layers
**** PDO - Php Data Objects
**** PEAR::MDB2
**** Creole
*** Object Relational Mapping (ORM)
**** PEAR:DB_DataObject
**** PEAR:DB_Table
**** Propel
* PHP Design PatternPHP/PHP Design Pattern
* SmartyPHP/Smarty
* Sicurezza delle applicazioni web
* PHP CLI: Command Line InterpreterPHP/Cli
* PHP GTK2: applicazioni desktop in PHPPHP/Gtk
* Crediti
Modifica il sommario
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

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

Per prima cosa installiamo sul nostro disco rigido i file necessari:
* Decomprimere l'archivio .tar.gz o .zip che avete appena scaricato in una cartella dei temporanea
* 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)
* 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:
Ora tutto è pronto per utilizzare Smarty nel vostro PHP:

### Installazione su Windows

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:
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:
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):

## Iniziamo ad usare Smarty

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

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:
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:
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

Lo scopo delle variabili è principalmente quello di passare dei valori dal codice PHP al template Smarty, tramite il metodo assign:
Potete assegnare alle variabili qualsiasi valore PHP, dalle stringhe ai numeri, compresi gli oggetti e gli array:
Nel nostro template Smarty potremmo scrivere:
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:

### La variabile $smarty

La variabile speciale $smarty permette di accedere a particolari valori:
* alle variabili superglobali di PHP get, post, cookies, server, environment e session
* 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

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.
* lower e upper restituisce il valore della variabile rispettivamente tutto minuscolo e tutto maiuscolo; ad esempio, se la variabile $nome contiene "Mario Rossi":
* truncate: tronca la parola al carattere indicato come primo argomento, concatenando alla fine la stringa indicata come secondo argomento:

## Funzioni

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

### if

La funzione if di Smarty è molto simile al costrutto if di PHP:
Gli operatori logici e di confronto sono gli stessi disponibili in PHP:

### foreach

La funzione foreach permette di iterare sugli elementi di una variabile valorizzata con un array da PHP. La sua sintassi è:
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:
è come scrivere in PHP:
Facciamo un esempio. Valorizziamo una variabile Smarty da PHP:
Nel file Smarty potremo scrivere:
È 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

* Smarty.net, sito ufficiale del progetto Smarty
* Documentazione ufficiale
* Manuale ufficiale completo in italiano Versione 2