Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Template Engine: separare programmazione e design

Cosa sono e a cosa servono i template engine per il php. Un caso pratico: Smarty Template Engine
Cosa sono e a cosa servono i template engine per il php. Un caso pratico: Smarty Template Engine
Link copiato negli appunti

Introduzione

Un'applicazione è costituita principalmente da due componenti: le funzionalità (gli algoritmi usati o la reperibilità dei dati) e la presentazione dei dati elaborati all'utente. Sono due ambiti ben distinti gestiti spesso da soggetti differenti (nello sviluppo web la parte della logica può essere affidata ad un web developer mentre quella della presentazione ad un web designer) che però non sempre vengono separati nella pratica.

Non è inusuale che un web designer senza competenze in materia di programmazione si debba trovare a modificare uno script php nella parte che riguarda il linguaggio html, o che viceversa il programmatore php debba adattare il codice html al proprio applicativo.

I template engine nascono appunto per evitare che queste situazioni si verifichino: la parte applicativa del software dovrebbe essere completamente slegata dal tipo di presentazione utilizzata e la parte di presentazione non dovrebbe curarsi di come i dati le vengano forniti. In sintesi, il programmatore si preoccupa solamente di reperire i dati, operarvi le modifiche necessarie e renderli disponibili; il designer si occupa di creare le presentazioni inserendo al posto dei dati effettivi dei marcatori speciali; il template engine fonde i due aspetti: prende i dati forniti dalla parte applicativa, e li inserisce al posto dei marcatori prestabiliti.

Un altro aspetto di non trascurabile importanza nell'utilizzo di un sistema di template engine è dato dal fatto di poter generare a partire dalla stessa parte applicativa diverse presentazioni dei dati in differenti formati. È il concetto su cui si basa la riutilizzabilità del codice: si scrive una volta sola la parte di reperimento dei dati e poi si crea un template specifico per ogni tipologia di documento da creare. Un esempio banale di questa funzione potrebbe essere la creazione di una pagina in formato html con la grafica, in html senza grafica, in testo puro, in Pdf, in rtf programmando un unico script php e scrivendo semplicemente i template adatti.

Pur tenendo conto di questa potenzialità, nel corso di questo articolo tratteremo soltanto della creazione di documenti in html.

Template e php: due strade

Il php nasce embedded, ciò significa che oltre a poterlo utilizzare normalmente come un qualunque altro linguaggio di programmazione è possibile anche inserire piccole parti di codice direttamente all'interno del documento.

<h1>Titolo dell'articolo: <?php=$titolo;?></h1>

Grazie a questa e altre particolarità (come le forme abbreviate per cicli e costrutti come while:/endwhile;) possiamo utilizzare il php come template engine. I vantaggi di questo sistema sono l'estrema velocità dell'esecuzione del codice e la grande potenza (è possibile usare tutte le funzioni standard del php, le estensioni, funzioni particolari, ecc.). D'altra parte questa soluzione richiede che gli addetti alla parte grafica imparino il php che rimane sempre un linguaggio di programmazione. HTML.it ha già dato spazio a Utilizziamo i template integrati con Php, utili per progetti di piccole dimensioni ma che difficilmente separano la logica dalla presentazione.

Un metodo più elegante è quello dell'utilizzo di sistemi di template engine scritti in php. Questi sistemi utilizzano uno pseudo-linguaggio di programmazione creato ad hoc (quindi se ne avete le capacità potete aggiungere funzionalità modificando il codice sorgente) per creare cicli, blocchi if/then/else, variabili ecc.

Alcuni tra i template engine scritti in php:

  • Phemplate: semplice e veloce nella sostituzione delle variabili, permette anche alcune funzionalità dinamiche come i loop
  • SmartTemplate: sistema molto potente e completo, dispone di alcune caratteristiche interessanti come un comodo metodo per impostare le righe di una tabella a colori alterni
  • Smarty: il sistema oggetto di questo articolo, è considerato da molti il più completo. Per questo è considerato anche un template engine complesso.

Per fornire ai lettori un esempio di Template Engine in php andremo a dare uno sguardo da vicino a Smarty.

Smarty

Analizziamo più da vicino questo template engine che presenta numerose caratteristiche che lo rendono un'ottima scelta.

Facilità di installazione

Smarty è composto da una serie di script php che ne compongono la libreria, per renderlo disponibile sul vostro sistema non dovrete fare altro che copiare questi files in una cartella accessibile dai vostri script e includere il file principale in essi. Se la cartella in cui avete salvato i file di libreria di smarty non fosse compresa nell'include_path avete due possibilità: aggiungerla nel php.ini oppure dichiarare una costante all'inizio dei vostri script.

define("SMARTY_DIR", '/path/to/smarty');
require_once(SMARTY_DIR.'Smarty.class.php');

Gestione dei template

A differenza di altri applicativi analoghi, Smarty non analizza i template ogni volta che li deve includere. I template vengono analizzati una volta solamente e compilati, creando da essi degli script php; questo fa sì che l'utilizzo di Smarty non risenta del peso in termini di tempo derivato dall'analisi e dal parse dei vari template.

Integrazione con ottimizzatori

Data la peculiarità della compilazione dei template, è possibile associare all'utilizzo di Smarty anche quello di accelleratori come Zend Accelerator o php Accelerator per ottenere un aumento di prestazioni ancora maggiore.

Dinamicità

Smarty consente una notevole dinamicità grazie al supporto per i blocchi if/then/else, per i cicli e ad alcune caratteristiche preimpostate (ad esempio è molto semplice creare i tag option inseriti in una select oppure gestire l'alternanza dei colori nelle righe di una tabella).

Filtri

Smarty supporta l'utilizzo di filtri che possono agire in fase di compilazione (prima prefilters o dopo postfilters) oppure ad ogni esecuzione del template (postfilters). Questo rende possibile ad esempio tenere all'interno di un database del testo con url e creare l'apposito tag <a> solamente quando viene creata la pagina html.

Modificatori di variabili

Smarty supporta anche i modificatori che possono agire sulle variabili impostati nel template. In questo modo ad esempio è possibile fare sì che le variabili vengano visualizzate in un template in forma minuscola e in un altro in forma maiuscola, senza cambiare il codice che ricava i dati.

Caching

Per aumentare ulteriormente le performance Smarty prevede l'utilizzo di un sistema integrato di caching che salva l'output risultante da un determinato template per un tempo impostato. Analizzeremo in seguito questa funzionalità.

Scalabilità

È possibile scrivere plugin che si interfaccino a Smarty in modo da estenderne le funzionalità e renderne più personalizzabile l'utilizzo. Inoltre è possibile personalizzare il linguaggio dei template aggiungendo le caratteristiche che riteniamo più opportune.

Documentazione

Smarty è uno dei template engine più utilizzati dagli sviluppatori php, per questo motivo c'è ampia la documentazione. Il manuale ufficiale presente sul sito web di Smarty è molto dettagliato.

Smarty per il programmatore

Vediamo ora come lo sviluppatore impiegato nella parte di sviluppo della logica dell'applicazione deve comportarsi per utilizzare questo template engine.

Innanzitutto bisogna importare il file Smarty.class.php e inizializzare la classe.

require('Smarty.class.php');
$s = new Smarty;

In seguito per assegnare i valori alle variabili si utilizza il metodo assign a cui si può passare la coppia nome/valore oppure un array associativo adatto.

$s->assign("Nome", "Andrea");
//Associa alla variabile nome presente nel template il valore Andrea

Fondamentale infine il metodo display che si occupa di reperire il template ed eseguire le sostituzioni necessarie.

$s->display('template.tpl');

Il parametro passato può anche essere assoluto nella forma /path/to/template.tpl oppure file:/path/to/template.tpl (obbligatorio in caso di path windows, file:C:/path/to/template.tpl).

Analogo il metodo fetch che invece di mandare in output il risultato lo restituisce in una variabile.

$out = $s->fetch('template.tpl');

Per quello che riguarda i filtri è possibile impostarli tramite i metodi register_postfilter(nome_funzione), register_prefilter(nome_funzione) e register_outputfilter(nome_funzione).

Analizziamo invece quello che riguarda la cache: per attivare questa funzionalità si deve impostare il parametro caching a 1 per l'abilitazione semplice e a 2 per rendere possibile un maggiore controllo del tempo di vita della cache attraverso il parametro cache_lifetime.

$s->caching = 2;

$s->cache_lifetime = 300; //secondi
$display->('template.tpl');
//se sono passati meno di 5 minuti dalla precedente esecuzione
//verrà utilizzata semplicemente la cache

Per aumentare la precisione a scapito delle performance è anche possibile abilitare l'opzione compile_check in modo che nonstante l'esistenza di una copia in cache, questa venga rigenerata a seguito di ogni modifica dei template.

$s->compile_check = true;

Per verificare l'esistenza di una copia in cache di un template (e quindi magari evitare i collegamenti al database o pesanti calcoli) è possibile utilizzare il metodo is_cached() a cui viene passato come parametro il nome del template da controllare. È possibile anche mettere in cache intere pagine ma lasciare una piccola parte dinamica attraverso l'uso della funzione insert a livello di template, vedere il manuale per i dettagli.

Infine, si può liberare la cache totale oppure solo la parte relativa ad un determinato template attraverso i metodi clear_all_cache() e clear_cache(nome_template).

Come si può ben capire quindi la creazione di uno script che utilizzi Smarty non è per niente complicata.

<?php //Esempio di script che utilizza Smarty
require('Smarty.class.php');
$s = new Smarty;
$s->caching = 2;
$s->cache_lifetime = 300;

// Elaborazione delle variabili subordinata all'esistenza di una copia in cache
if( !$s->is_cached('prodotti.tpl') ){
   $nome = 'Scarpe numero 43';
   $prezzo = '25 Euro';

   $s->assign("Nome", $nome);
   $s->assign("Prezzo", $prezzo);
}

$s->display('prodotti.tpl');
?>

Vi si può associare un template di questo tipo:

<html>
<head><title>Pagina prodotti<title></head>
<body>
<b>Nome del prodotto</b>: {$Nome} <br />
<b>Prezzo</b>: {$Prezzo}
</body>
</html>

per ottenere la pagina completa

<html>
<head><title>Pagina prodotti<title></head>
<body>
<b>Nome del prodotto</b>: Scarpe numero 43 <br />
<b>Prezzo</b>: 25 Euro
</body>
</html>

Conclusioni

Nonostante la semplicità degli esempi usati si inizia a comprendere la potenzialità di questo eccezionale strumento. Nel prossimo articolo su questo argomento tratteremo con attenzione la creazione di template più sofisticati e l'uso di funzionalità avanzate di Smarty.

Ti consigliamo anche