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

PHPTal: template engine per PHP

Introduzione a PHPTal, un template engine snello e funzionale che utilizza una normale struttura XML
Introduzione a PHPTal, un template engine snello e funzionale che utilizza una normale struttura XML
Link copiato negli appunti

I template engine sono una necessità per chiunque desideri sviluppare codice facilmente mantenibile separando l'aspetto dalla logica di generazione dei contenuti. Purtroppo, o forse dovremmo dire fortunatamente, la rete ci propone una serie innumerevole di alternative su cui basare le nostre applicazioni. Il template engine più utilizzato con PHP molto probabilmente è, visto il suo successo negli articoli che si leggono in siti specialistici, Smarty. Un successo dovuto soprattutto al suo ricco repertorio di funzionalità, alla sua grande modularità e, ultimo ma non meno importante, al fatto di essere il template engine ufficiale di PHP. A Smarty e ai template engine abbiamo dedicato un articolo qualche tempo fa.

Contrariamente alla tendenza comune in questo articolo prenderò in esame un template engine alternativo chiamato PHPTal. Il template engine in questione è stato sviluppato da Nicolas Cannasse (che per chi non lo sapesse è il ragazzo che sta dietro a molti progetti largamente utilizzati in campo Open Source, vedasi Haxe, Neko e MTASC) ed è un'implementazione in PHP dell'eccellente Zope Page Template (ZPT) utilizzato per l'appunto dall'application server Zope. Oltre ad implementare TAL (Template Attribute Language, il template language utilizzato da Zope), PHPTal offre anche alcune estensioni molto utili, come PHPTales, un linguaggio che permette di definire attraverso appositi attributi come l'XML dei template andrà gestito, METAL, un'estensione di TAL per il supporto delle macro, ed i namespace per l'internazionalizzazione.

Le peculiarità di PHPTal

Rispetto alla maggior parte dei template engine sviluppati per PHP, PHPTal ha una serie di feature e peculiarità che lo rendono altamente differente dai suoi "concorrenti".

Per prima cosa i template sono file XML, dai quali poi potrà essere generato un output in diversi formati in base alle esigenze specificate in fase di sviluppo. I template in XML permettono di avere una sintassi rigida ma al tempo stesso molto semplice, con la quale difficilmente si possono fare errori dato l'utilizzo abitudinario di questo linguaggio da parte dei designer e degli sviluppatori web.

Grazie a Tales, i template PHPTal non contengono tag proprietari per la gestione dei template e la generazione dell'output, ma tutto viene fatto utilizzando degli attributi speciali preceduti da appositi namespace. In questo modo il codice è molto più leggibile e facilmente comprensibile anche dai designer che non hanno competenze di programmazione. Oltretutto i template così generati si avvicinano molto al concetto WYSIWYG: dato che gli attributi errati non vengono interpretati dal browser, è possibile definire inizialmente i template in semplice XHTML in modo da avere un'idea di come dovrà apparire la pagina finale, e infine aggiungere gli attributi di PHPTal rendendo la pagina effettivamente una template ma avendo comunque la possibilità di visualizzare un'anteprima di quest'ultima all'interno di un browser web.

Nella documentazione ufficiale c'è un esempio che chiarisce abbastanza il concetto. In Smarty per esempio, se volessimo renderizzare una tabella contenente una serie di righe generate dinamicamente, dovremmo scrivere:

<table>
  {section name=myitem loop=$myarray}
  <tr>
    <td>{$myarray[myitem]}</td>
  </tr>
  {/section}
</table>

Il codice non è affatto complesso, ma se visualizzassimo direttamente il template nel browser o in un editor WYSIWYG senza effettuarne la valutazione attraverso Smarty, otterremo un output inquinato dai tag del template engine. In PHPTal invece questo non accade:

<table>
  <tr tal:repeat="myitem myarray">
    <td tal:content="myitem">
      Testo di esempio
    </td>
  </tr>
  <tr tal:replace="">
    <td>Esempio 1</td>
  </tr>
  <tr tal:replace="">
    <td>Esempio 2</td>
  </tr>
  <tr tal:replace="">
    <td>Esempio 3</td>
  </tr>
</table>

Il template rimane comunque semplice ma possiamo permetterci di aggiungere dei tag in modo che l'output risulti veramente come vorremmo ottenendo comunque lo stesso risultato che avremmo ottenuto eseguendo il template Smarty precedente.

Un'altra peculiarità molto importante è il fatto che il linguaggio TAL è seguito da molti anni dalla grande comunità di Zope, che ha provveduto a renderlo completo e funzionale. Oltretutto, essendo PHPTal un'implementazione delle specifiche TAL, la documentazione disponibile per quest'ultimo linguaggio può essere facilmente riutilizzata per le proprie esigenze nello sviluppo PHP.

Installazione ed un primo esempio

PHPTal è distribuito come package PEAR e, anche se non è presente nel repository ufficiale del progetto, è possibile installarlo o aggiornarlo facilmente utilizzando lo script pear distribuito con PHP e specificando come target l'URL del file compresso che contiene l'ultima versione (o quella che vogliamo installare) di PHPTal:

pear install http://phptal.motion-twin.com/files/PHPTAL-X.X.X.tar.gz
pear update http://phptal.motion-twin.com/files/PHPTAL-X.X.X.tar.gz

In questo modo verranno installate o aggiornati il file PHPTAL.php e tutte le cartelle necessarie contenenti gli script di supporto all'interno del path specificato in fase di configurazione di PEAR. Successivamente, se non lo avete ancora fatto, basterà aggiungere la locazione sopra indicata al proprio include_path all'interno del file php.ini e sarete pronti per cominciare ad utilizzare il template engine. Per chi non potesse modificare il file di configurazione di PHP, è comunque possibile modificare la direttiva direttamente da script:

<?php

$include_path = ini_get('include_path');

// In windows deve essere utilizzato ';' come separatore al posto di ':'
ini_set('include_path', $include_path.':/path/to/your/lib/folder');

// Ora possiamo includere PHPTal ed eseguire le nostre template
require_once 'PHPTAL.php';

// ...

?>

Dopo aver effettuato l'installazione possiamo procedere con il primo esempio. I template PHPTal possono avere qualunque estensione e sono semplici file di testo. Per comodità e per evidenziare il fatto che abbiano un comportamento adatto ai WYSIWYG, viene solitamente utilizzata l'estensione .html.

Come primo esempio vedremo come visualizzare una classica lista di contatti che, per comodità, verrà prelevata da un array associativo creato ad-hoc. Lo vederemo nella pagina seguente.

Ecco un esempio di template PHPTal:

<?xml version="1.0" encoding="UTF-8"?>

<html>
  <head>
    <title tal:content="title">Il titolo della pagina</title>
  </head>
  <body>
    <h1 tal:content="title">Titolo</h1>
    <table>
      <thead>
        <tr>
          <th>Nome</th>
          <th>Email</th>
        </tr>
      </thead>

      <tbody>
        <tr tal:repeat="contact contacts">
          <td tal:content="contact/name">Nome contatto</td>
          <td tal:content="contact/email">Email contatto</td>
        </tr>
        <tr tal:replace="">
          <td>Nome d'esempio</td>
          <td>Email d'esempio</td>
        </tr>
        <tr tal:replace="">
          <td>Nome d'esempio</td>
          <td>Email d'esempio</td>
        </tr>
        <tr tal:replace="">
          <td>Nome d'esempio</td>
          <td>Email d'esempio</td>
        </tr>
        <tr tal:replace="">
          <td>Nome d'esempio</td>
          <td>Email d'esempio</td>
        </tr>
      </tbody>      
    </table>
  </body>
</html>

Se visualizzassimo il template all'interno del browser otterremo una corretta rappresentazione di come desideriamo risulti il template una volta eseguito.

Come possiamo notare grazie al colore rosso usato nel codice visualizzato sopra il comportamento è dato dagli attributi preceduti dall'alias tal. Le funzionalità utilizzate nell'esempio sono tre delle più comuni:

  • repeat: accetta come valore il nome a cui assegnare il risultato dell'iterazione corrente e la sorgente rappresentante l'array su cui iterare, separati da spazio; ripete il proprio contenuto per ogni valore dell'array.
  • replace: sostituisce l'intero tag con il valore specificato nell'attributo (che può essere anche vuoto se si desidera nascondere il tag).
  • content: accetta come parametro un'espressione Tales e sostituisce il contenuto del tag con il valore di questa espressione.

Le espressioni Tales verranno analizzate in un prossimo articolo; per ora basti sapere che utilizzando il backslash (/) è possibile accedere agli attributi di un determinato valore allo stesso modo in cui in PHP si usa l'operatore ->.

Passiamo ora alla parte PHP, in cui genereremo i contenuti necessari per riempire dinamicamente il template presentato sopra.

<?php

// Supponiamo che include_path sia stato impostato correttamente
require_once 'PHPTAL.php';

/* PHPTALES gestisce allo stesso modo oggetti ed array associativi,
* utilizzando un linguaggio simile a XPath per accedere agli attributi/valori
*/
class Contact
{
  public $name;
  public $email;
  
  public function __construct($name, $email)
  {
    $this->name = $name;
    $this->email = $email;
  }
}

$template = new PHPTAL('path/alla/template.html');

$contacts = array();
$contacts[] = new Contant("Gabriele Farina", "g.farina@html.it");
$contacts[] = new Contant("Francesco Caccavella", "f.caccavella@html.it");

$template->title = 'I miei contatti';
$template-> contacts = $contacts;

// eseguiamo il template
try {
   echo $template->execute();
}
catch (Exception $e){
   echo $e;
}

?>

Conclusioni

Abbiamo concluso il primo articolo dedicato a PHPTal. Nel prossimo tratteremo in dettagli gli attributi che è possibile utilizzare per creare le proprie template e vedremo come si presenta e si utilizza il linguaggio Tales.

Ti consigliamo anche