SAVANT - PHP template System
Indice
- Design e programmazione: un connubio possibile!
- SAVANT: il template tuttofare
- Un primo sguardo
- API di riferimento
- Plugin
- APPENDICE A - extract e/o setExtract()
- APPENDICE B - referenza delle variabili
Design e programmazione: un connubio possibile!
La gestione di un progetto Web di qualsiasi entità esso sia,
implica generalmente la fusione tra l'aspetto grafico e
quello della programmazione, due elementi per molti versi
in contrapposizione.
Da un lato il povero webdesigner,
costretto ad allestire layout e vesti grafiche districandosi
in mezzo a centinaia di righe di codice, e dall'altro il programmatore,
che tra notti insonni alla ricerca di fastidiosi e comuni errori di
programmazione, si trova costretto a lavorare adattando il
proprio lavoro alla veste grafica.
Come ben noto, il linguaggio PHP è circondato da numerosi progetti
ed iniziative atti a migliorare la vita del programmatore e a
rendere il processo di sviluppo il più rapido possibile;
da interi repository di funzioni e classi astratte per gestire
qualsiasi genere di operazione, sino ai cosidetti Framework
di sviluppo.
Ovviamente anche sul versante dei template engine, tema
centrale di quest'articolo, c'è solo l'imbarazzo della scelta e
come si dice in questi casi, l'unico problema è scegliere
quello che meglio si adatta alle nostre esigenze.
Non ho certo la pretesa di valutare quale sia il migliore o il peggiore, sempre ammesso che questa distinzione realmente esista. Mi limito ad affermare che il miglior sistema è quello con la quale ci troviamo meglio.
SAVANT: il template tuttofare
Giungere a SAVANT come scelta definitiva è il frutto di una lunga selezione attraverso i vari sistemi disponibili; le mie personali esigenze in merito, sono:
- rapido apprendimento;
- funzionalità di base per la gestione dei template;
- stesura del codice ordinata e pulita, per una facile lettura;
- possibilità di espandere le funzionalità grazie ad una licenza aperta e ad un sistema di plug-in davvero interessante.
Ecco perchè ho preso in considerazione quest'ottimo prodotto, più
intuitivo del mostruoso SMARTY, più avanzato del rudimentale
EVAL!
SAVANT è disponibile per il
download sulla home-page ufficiale
del progetto, e la sua installazione è di una semplicità disarmante.
E' possibile infatti depositare l'intera libreria all'interno del
proprio progetto Web (figura. 1)
oppure procedere come se si trattasse di una libreria PEAR; un esempio è indicato nel riquadro sottostante:
[#: ~] pear install http://phpsavant.com/Savant*-*.*.*.tgz downloading Savant*-*.*.*.tgz ... Starting to download Savant*-*.*.*.tgz .....done.
Un primo sguardo
Se l'installazione è un'operazione semplice, sarete contenti di sapere che lo è anche nel suo funzionamento. Come infatti specificato nel paragrafo precedente, uno dei motivi per la quale ho ritenuto importante valutare l'utilizzo di SAVANT è proprio per la sua estrema semplicità nel essere utilizzato.
Trattandosi di una classe, la prima cosa di cui è necessario occuparsi è creare un'istanza di SAVANT. E' utile inoltre definire fin da subito alcune opzioni di carattere generale legate alla struttura del nostro progetto.
# Definisce un percorso completo da utilizzare nel corso # dello sviluppo: una buona regola nella stesura di # qualsiasi progetto. define(PROJECT_PATH, dirname(__FILE__)); # Include il file contenente la classe require_once (PROJECT_PATH . '/Savant2.php'); # Crea un array, che definisca alcune opzioni generali # legate al template. $options = array( 'template_path' => PROJECT_PATH . '/layout/', 'extract' => true, 'template' => 'page.tpl.php'); # Crea una istanza al template engine. # Per comodità rendiamo il template engine GLOBALE. $GLOBALS['template'] = & new Savant2($options);
API di riferimento
Si è detto che è utile definire una serie di opzioni da passare come valori alla classe, tuttavia è importante ricordare che non è assolutamente un passo obbligatorio. Sono infatti disponibili alcune funzioni che permettono di giungere allo stesso risultato ma in tempi differenti.
La lista seguente, riepiloga l'elenco delle opzioni disponibili, e le funzioni equivalenti:
- template_path indica il percorso predefinito
dove verranno cercati i template.
L'opzione può essere sostituita attraverso l'uso delle funzione setPath();
- resource_path indica il percorso predefinito
dove verranno cercati plugin e filtri.
L'opzione può essere sostituita attraverso l'uso delle funzione setPath();
- error definisce l'utilizzo di errori
personalizzati.
L'opzione può essere sostituita attraverso l'uso delle funzione setError();
- extract questa opzione è attiva per compatibilità con la serie 1.x. Per maggiori informazioni si veda la sezione APPENDICE A . L'opzione può essere sostituita attraverso l'uso delle funzione setExtract();
- template definisce il template predefinito
da utilizzare.
L'opzione può essere sostituita attraverso l'uso delle funzione settemplate();
Definite le opzioni generali e creata una nuova istanza di SAVANT, il percorso verso il risultato finale passa attraverso due fasi: l'elaborazione degli script e il trasferimento dei dati raccolti all'interno del template.
L'intera fase viene gestita attraverso assign(), che occupa il ruolo di connettore tra lo script e il template, e il metodo display() che chiude la fase permettendo la visualizzazione del risultato conclusivo.
La sintassi dei due metodi è molto semplice:
assign() accetta come primo argomento il nome
che vogliamo assegnare alla variabile nel template, e come secondo
argomento il suo valore.
Il metodo display() invece,
accetta un solo argomento: il template che intendiamo utilizzare.
Si ricordi tuttavia che a differenza di assign(), il valore
di display() non è assolutamente obbligatorio.
Qualora non venga specificato verrà utilizzato in maniera predefinita,
il valore specificato inizialmente nell'array delle opzioni
Espandiamo quindi l'esempio visto sopra, attraverso alcuni utilizzi basilari della classe:
ESEMPIO 1, con variabili semplici e opzione template definita:
$options = array(
'template_path' => PROJECT_PATH . '/layout/',
'extract' => false,
'template' => 'page.tpl.php');
$GLOBALS['template'] = & new Savant2($options);
# All'interno dello script associamo ad una variabile
# $username il nome di un utente, ottenuto ad esempio
# attraverso un interrogazione ad un Database.
$username = "beppe";
# Ricaviamo inoltre i dati relativi al suo ultimo accesso
# e li associamo alla variabile $lastlogin.
$lastlogin = "05/04/2005";
# Assegnamo i valori alle variabili
$GLOBALS['template']->assign('username', $username);
$GLOBALS['template']->assign('lastlogin', $username);
# Processiamo il template e visualizziamo il risultato conclusivo
$GLOBALS['template']->display();
NEL TEMPLATE:
<html> <head> <title>Pagina di test</title> </head> <body> Benvenuto <?php $this->username; ?><br> Il tuo ultimo accesso risale al giorno <?php $this->lastlogin; ?> </body> </html>
ESEMPIO 2, con array e opzione template non definita:
$options = array(
'template_path' => PROJECT_PATH . '/layout/',
'extract' => true);
$GLOBALS['template'] = & new Savant2($options);
# Salva le informazioni utente all'interno di un array associativo.
$userinfo = array("name" => "beppe", "lastlogin" => "05/04/2005");
# Assegna i valori alle variabili
$GLOBALS['template']->assign('userinfo', $userinfo);
# Processiamo il template e visualizziamo il risultato conclusivo
$GLOBALS['template']->display('page.tpl.php');
NEL TEMPLATE:
<html> <head> <title>Pagina di test</title> </head> <body> Benvenuto <?php $this->userinfo["name"]; ?><br> Il tuo ultimo accesso risale al giorno <?php $this->userinfo["lastlogin"]; ?> </body> </html>
Gli esempi mostrati sono molto elementari, ma credo siano evidenti i benefici nell'utilizzo di un sistema di template come SAVANT; il codice risulta ordinato e chiaro sia dal punto di vista del programmatore sia da quello del designer, ricordando inoltre che anche nel caso di grosse modifiche dei layout gli sforzi saranno comunque ridotti al minimo.
Tornando a parlare delle possibilità di trasferimento delle informazioni ai template è doveroso che assign() non è l'unico connettore disponibile. E' possibile utilizzare infatti anche il metodo assignRef(), che assegna le variabili per referenza e non per valore. Quest'ultimo concetto potrebbe essere nuovo; una nota in riguardo è disponibile alla sezione APPENDICE B .
Plugin
Un'altro aspetto che fanno di SAVANT un'ottima scelta è la disponibilità di una serie di plugin pronto uso che aiutano a processare i dati ottenuti dagli script. Attraverso questi strumenti è possibile estendere rapidamente le funzionalità del template: si possono creare liste ben formattate, inserire codice Javascript o link diretti a foglie di stile, creare collegamenti ipertestuali o generare codice HTML per l'inserimento di immagini. Inoltre, come già accennato all'inizio dell'articolo, espandere le funzionalità scrivendo dei propri plugin personalizzati è cosa tutt'altro che complicata.
ESEMPIO 1 - collegamento ipertestuale
<!-- Esempio: otteniamo attraverso l'elaborazione di uno script
l'ID di un ipotetico utente loggato sul nostro sistema. Creiamo un
collegamento ad una pagina di gestione account -->
<p>
Gestisci il tuo <?php $this->plugin('ahref', 'account.php?id=' . $id . '', 'account'); ?>
</p>
Segue l'output risultante:
<!-- Ipotizzando che l'ID utente sia 5 --> <p> Gestisci il tuo <a href="account.php?id=5">account</a> </p>
ESEMPIO 2 - collegamento ad un foglio di stile
<!-- Esempio: il foglio di stile predefinito per tutto il sito
si chiama style.css e si trova posizionato nella directory css -->
<?php $this->plugin('stylesheet', 'css/style.css') ?>
Segue l'output risultante:
<link rel="stylesheet" type="text/css" href="css/style.css" />
In riferimento a quest'ultimo esempio, pensate con quale semplicità si può ideare uno script che sostituisca il CSS predefinito con uno alternativo. Questo è solo l'inizio...
Per ovvie motivazioni, non è possibile fare un esempio per ogni plugin disponibile, tuttavia la documentazione disponibile sul sito ufficiale è molto chiara ed esaustiva, quindi consiglio di dedicare un po di tempo per studiare i plugin sia nel loro funzionamento, sia nelle possibilità offerte.
APPENDICE A - extract e/o setExtract()
Come si è avuto modo di osservare nella corso dell'articolo i valori all'interno del template vengono trattati come proprietà di un classe, a differenza di quanto accadeva nella release precedente (1.x). Questo è perfettamente normale, se si pensa che SAVANT, come dall'altra parte la maggior parte dei sistemi analoghi, è un template engine sviluppato con il paradigma della programmazione ad oggetti. Nella precedente release infatti l'accesso alle variabili trasferite all'interno del template avveniva come indicato nel riquadro:
[ ... ] <p>Benvenuto <?php $name; ?></p> [ ... ]
mentre con l'attuale release l'accesso avviene nella seguente maniera:
[ ... ] <p>Benvenuto <?php $this->name; ?></p> [ ... ]
Per garantire quindi la compatibilità con la vecchia release è stato introdotto il concetto di estrazione delle variabili, attraverso il quale è possibile migrare alla attuale release continuando ad utilizzare il vecchio metodo di accesso.
Di default la funzione di estrazione non è attiva. Questo vuole dire che bisognerà sviluppare file utilizzando l'attributo $this; qualora fosse necessario attivarla è sufficiente impostare a true il valore di extract nelle opzioni del template engine (trattato all'inizio dell'articolo) oppure utilizzando il metodo setExtract().
APPENDICE B - referenza delle variabili
Generalmente una variabile è un contenitore indipendente, che muta solamente in funzione delle assegnazioni dirette o indirette che noi stessi diamo. Un esempio chiarirà il concetto:
# Variabile $a con valore a 100 $a = 100; # Variabile $b copia di $a $b = $a; echo $a; # Stampa 100 echo $b; # Stampa 100
E' chiaro che le due variabili si equivalgono grazie alla assegnazione per copia dei valori. Cosa accadrebbe però se fossimo costretti a cambiare il valore della variabile $a ? Se è vero che le variabili sono indipendenti il valore di $b non cambierà. Lo specchietto qui sotto lo dimostra.
# Riprendiamo l'esempio precedente: # modifichiamo il valore di $a $a = 200; # Stampa i valori delle variabili per verifica echo $a; # Ora il valore è 200 echo $b; # Il valore è rimasto a 100
Quindi attraverso la referenza possiamo assegnare un valore a più variabili e dal momento che una sola di questa cambia il proprio valore, cambierano tutte le altre. E' possibile utilizzare questa tecnica anteponendo alla variabile il simbolo della "E commerciale" ( & ):
# Assegnamo un valore alla variabile $a $a = 200; $b = & $a; # Stampa il valore di $b echo $b; # Ritorna 200 # Sotituiamo il valore di $a $a = 100; # Controlliamo nuovamente il valore di $b echo $b; # Ritorna 100
Ultimo aggiornamento: 22/04/2005 - 23:40:55
Pagina elaborata in 0.00152206420898 secondi
