Articoli
Home
Il Mio Personal Firewall
Linux : Un router...
Adsl-Usb HOWTO / Part. 1
Adsl-Usb HOWTO / Part. 2
GnuPG: GNU Privacy Guard
SPAM: mailfilter
Periferiche SCSI e backup
Periferiche USB-storage
SAVANT-PHP Template System
PHP-PEAR: Flexy
Miscellaneous
Repository
SOFTWARE Credits
Links
http://www.pluto.linux.it
http://www.php.net
http://pear.php.net
http://www.apt-get.org
L'autore
Chi è costui?
PublicKey

W3C XHTML


W3C CSS


SAVANT - PHP template System

di Giuseppe Lucente


Indice


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.

A questo punto viene spontaneo domandarsi se sia possibile separare i due aspetti attraverso un sistema rapido e pulito. La risposta è si, e si basa sul semplice concetto di template engine!

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:

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)

Directory ROOT

Figura nr. 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:

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
Autore: Beppe
Ultimo aggiornamento: 22/04/2005 - 23:40:55
Pagina elaborata in 0.00152206420898 secondi

Ricerca nel sito