La scorsa settimana abbiamo visto come si presenta PHPTal, e come risulti semplice e veloce sviluppare dei template con questa implementazione di ZPT (Zope Page Template in PHP). Oggi ci addentreremo più in dettaglio nell'analisi del linguaggio TAL e di come, in cooperazione con le sue estensioni, permetta un'enorme libertà nello sviluppo dei propri template.
PHPTales - I
Per prima cosa è opportuno trattare l'estensione PHPTales che permette di definire espressioni complesse come valore degli attributi TAL o di qualunque altro attributo supportato da PHPTal. Un attributo può contenere più di un'espressione; in quel caso è necessario suddividere ognuna delle espressioni utilizzando un punto e virgola.
path:
All'interno delle espressioni sono accessibili i valori assegnati al template engine utilizzando direttamente l'identificatore utilizzato in fase di assegnazione nel codice PHP; per poter accedere ad eventuali attributi (nel caso il valore sia un oggetto) o a specifici elementi dell'array (nel caso il valore sia un array associativo) è possibile utilizzare il backslash come se si stesse scrivendo un'espressione XPath. Questo comportamento è dato dall'operatore path: che viene utilizzato di default nel caso in cui non sia specificato nessun altro. Per comodità è possibile includere le espressioni path anche direttamente all'interno del testo HTML utilizzando l'operatore ${ ... }
.
Le seguenti espressioni danno tutte lo stesso risultato:
<span tal:content="data/user/name"/>
<span tal:content="path:data/user/name"/>
<span>${data/user/name}</span>
Operatori condizionali
All'interno del tag tal:condition
(che vedremo successivamente) è spesso necessario utilizzare degli operatori di comparazione. Dato che i caratteri <
e >
non sono accettati da XML all'interno dei valori degli attributi, Tales definisce delle alternative per gli operatori che comprendono questi caratteri. LT
corrisponde a <
, LE
a <=
, GT
a >
e GE
a >=
.
string:
Serve per specificare che l'espressione indicata è espressamente una stringa (bisogna ricordarsi che $
va sostituito con $$
e ;
con ;;
) e che quindi non andrà valutata utilizzando path come operatore di default. Qualche esempio:
<span tal:replace="string:A quanto ammonta il dollaro ($$) ?"/>
<span tal:replace="string:Benvenuto $username !"/>
<span tal:replace="string:Il valore di $$username è $username !"/>
PHPTales - II
php:
Permette di specificare direttamente del codice PHP all'interno delle espressioni Tales. Questo operatore è molto utile se si vogliono specificare array oppure utilizzare delle funzioni built-in di PHP per modificare il valore di una variabile assegnata al template.
Dato che >
non è un carattere accettato nel valore degli attributi dalle specifiche XML, per accedere manualmente agli attributi o ai metodi di un oggetto è necessario utilizzare il punto e dato che $
è un carattere speciale che sostituisce l'utilizzo dell'operatore path, non è necessario utilizzare $
davanti al nome delle variabili. Se si desidera concatenare delle stringhe invece è necessario utilizzare il punto preceduto e seguito da uno o più spazi. Qualche esempio:
<span tal:content="php:htmlentities(testo_html)" />
<span tal:content="php:'string ${sostituita_da_php}'" />
<span tal:content="php:'string ${some.path().to[0].var}'" />
<span tal:content="php:NOT foo OR (bar GT baz)" />
<span tal:content="php:espressione + aritmetica" />
<span tal:content="php:array('a', 'b', 'c')" />
<span tal:content="php:mia_stirnga . a.b.c(e) . htmlentities(SomeClass::staticMethod())" />
<span tal:content="php:SomeClass::Costante" />
<span tal:content="php:SomeClass::$variabile_statica" />
Nonostante sia molto potente è consigliabile limitare l'utilizzo dell'operatore php
solamente allo stretto necessario al fine di facilitare la leggibilità delle proprie template anche a chi non è avvezzo alla programmazione.
not:
Nega l'espressione precedente.
exists:
Controlla che il path specificato sia definito come se utilizzassimo isset
.
default
Questa keyword viene automaticamente valutata da Tales con il contenuto di default del tag dove l'attributo che utilizza default è stato utilizzato. In congiunzione con la catena di espressioni può essere quindi utilizzato per lasciare invariato il contenuto di un tag nel caso di errore:
<span tal:define="test prova/non/definita | default">
Il valore di default
</span>
Catene di espressioni
Tales permette di concatenare le espressioni utilizzando l'operatore pipe (|
). Le espressioni vengono valutate una alla volta finché non viene restituito un valore vero. In questo caso il valore è restituito come risultato della catena, altrimenti si procede con quello successivo.
Il namespace TAL - I
Prima di iniziare a trattare nello specifico gli attributi standard del namespace TAL, è necessario fare una precisazione sul modo in cui vengono interpretati gli attributi TAL e sull'ordine in cui vengono eseguiti. Per facilitare la vita ai designer e mantenere una maggior libertà nello sviluppo dei template, il linguaggio TAL non tiene conto, in fase di esecuzione, dell'ordine in cui gli attributi di un tag sono specificati, ma segue un apposita mappa delle priorità:
- define
- condition
- repeat
- content/replace
- attributes
- omit-tag
Fatta questa precisazione possiamo passare all'analisi dei singoli attributi supportati da TAL.
tal:define
L'attributo define
permette di definire una variabile che potrà successivamente essere utilizzata all'interno delle proprie template. Dato che l'attributo viene eseguito per primo, la variabile definita sarà subito accessibile da tutti gli altri attributi.
Il valore del tag define
è formato dal nome della variabile e dal suo valore separati da spazio. Il valore può essere una qualsiasi espressione valida Tales, mentre il nome un qualsiasi identificatore valido in PHP. Se si desidera rendere la variabile accessibile all'intero template e non limitata allo scope locale, è possibile far precedere al valore dell'attributo la parola chiave global
.
<span tal:define="hello string:Ciao ${name}, benvenuto!"
tal:content="hello"
>
Messaggio di Benvenuto
</span>
tal:condition
Visualizza il contenuto di un tag solamente se l'espressione assegnata all'attributo a valore vero.
<span tal:condition="exists: username">Benvenuto ${username} </span>
<span tal:condition="php: cart.countItems() GT cart.maxItems">Troppi oggetti nel carrello</span>
tal:repeat
Come specificato nell'articolo precedente permette di iterare i valori di un array in modo da ripetere il tag per ognuno di questi valori. Accetta come valore il nome a cui verrà assegnato ogni singolo elemento, seguito da un'espressione Tales che dovrebbe restituire un valore iterabile. All'interno dello scope del tag repeat
è possibile utilizzare la variabile speciale repeat
con cui accedere ad informazioni sull'iterazione quali l'indice (index
), se pari o dispari (even
o odd
), e così via.
<table>
<tr tal:repear="item cart">
<td tal:content="repeat/item/index">Indice</td>
<td tal:content="item/name">name</td>
<td tal:content="item/price">price</td>
</tr>
</table>
tal:content
Sostituisce il contenuto del tag con il valore dell'espressione Tales specificata come valore dell'attributo.
Il namespace TAL - II
tal:replace
Sostituisce l'intero tag con il valore dell'espressione Tales specificata come valore dell'attributo.
tal:attributes
Questo è uno degli attributi più interessanti e si occupa di cambiare dinamicamente il valore degli altri attributi del tag a cui è assegnato. Il valore dell'attributo è rappresentato da una serie di espressioni Tales separate da punto e virgola e formate dal nome dell'attributo da sostituire e da valore separati da uno spazio.
<a href="http://www.test.it" title="placeholder"
tal:attributes="href string:http://www.html.it;title html_it/title"
tal:content="Il sito di HTML.it"
>
Un link ...
</a>
Una volta eseguito il codice precedente, si produrrebbe il seguente output (supponendo che html_it
sia un array il cui valore corrispondente a TITLE
sia "HTML.it"):
<a href="http://www.html.it" title="HTML.it">Il sito di HTML.it</a>
Spesso attributes
viene utilizzato in congiunzione con l'operatore PHP per creare comportamenti molto interessanti. Vediamo un esempio precedente leggermente modificato per visualizzare le righe di colore alternato:
<table>
<tr tal:repear="item cart" tal:attributes="style php:repeat.item.odd ? 'background-color: red;' : false">
<td tal:content="repeat/item/index">Indice</td>
<td tal:content="item/name">name</td>
<td tal:content="item/price">price</td>
</tr>
</table>
tal:omit-tag
Questo attributo si occupa di sostituire il tag al quale è assegnato con il suo contenuto.
Conclusione
Eccoci nuovamente alla fine dell'articolo. Abbiamo analizzato in modo adeguato il linguaggio Tales e gli attributi supportati da TAL in modo che si possa iniziare a creare template anche molto complesse. In un prossimo articolo tratteremo METAL e gli strumenti di internazionalizzazione (il namespace I18N); fino a quel momento vi consiglio di esercitarvi con PHPTal e di provarlo nelle vostre applicazioni.