Bookmark and Share
Document Actions

TAL in pillole
medio

vediamo i principali meccanismi dinamici che ZPT ci offre per manipolare i template durante il rendering.

Inserire Testo

Funzionalità minima richiesta ad un template language, come abbiamo visto, TAL gioca con i tag definendone il contenuto.

Possiamo utilizzare l'istruzione content per definire il contenuto di un tag, ad esempio il template seguente:

<H1 tal:content=”here/title”/> 

si trasformerà in qualcosa di simile a questo (dipende dal valore dell'attributo `title` del contesto a cui applichiamo il template!):

<H1>Homepage</H1> 

In alternativa possiamo direttamente rimpiazzare un tag usando l'istruzione replace:

<H1 tal:replace=”here/title”>Titolo</H1>

in questo caso otterremo piuttosto:

Homepage
attenzione a cosa chiedete!!
;) il tag H1 è sparito dalla pagina!

Strutture Cicliche

Il vantaggio di un template è quello di potersi fermare alla descrizione di quello che sarà il risultato finale!

TAL offre l'istruzione repeat, con cui velovemente costruire una sequenza di elementi nella pagina usando le informazioni fornite dagli elementi di una lista Python:

Esaminate attentamente il template seguente:

<table border="1" width="100%"> 
  <tr tal:repeat="item container/objectValues"> 
    <td tal:content="repeat/item/number">#</td> 
    <td tal:content="item/id">Id</td> 
    <td tal:content="item/title">Title</td> 
  </tr> 
</table> 

Con un po' di fantasia vedrete formarsi una tabella, la cui prima colonna riporta il numero della riga corrente!

NB: se proprio non la vedete
..provate ad applicare il template ad una cartella Zope ;))

Condizioni

L'istruzione tal per decidere se far comparire un tag e tutto il suo contenuto nella pagina finale è condition:

<table border="1" width=”100%”  
       tal:condition="container/objectValues"> 
    <tr tal:repeat="item container/objectValues"> 
      <td tal:content="repeat/item/number">#</td> 
      <td tal:content="item/id">Id</td> 
      <td tal:content="item/title">Title</td> 
    </tr>
</table>

La tal:condition che abbiamo aggiunto nel nostro template controlla che la tabella venga costruita solo se l'espressione tales container/objectValues fornisce effettivamente degli oggetti da elencare.

Definire Variabili

L'istruzione define ci permette di definire delle variabili valide all'interno del tag in cui vengono definite:

<table border="1" width=”100%”  
           tal:define="object_list container/objectValues" 
           tal:condition="object_list"> 
    <tr tal:repeat="item object_list"> 
      <td tal:content="repeat/item/number">#</td> 
      <td tal:content="item/id">Id</td> 
      <td tal:content="item/title">Title</td> 
    </tr> 
 </table>

Nel precedente template, object_list potrà essere utilizzato ovunque nel contesto del tag table.

Gli Attributi dei Tag

Per poter costruire dinamicamente gli attributi dei tag dei nostri template, tal ci fornisce l'istruzione attributes:

<td>
    <img src=”/images/icon.png” 
         tal:attributes="src item/icon"/> 
    <span tal:replace="item/meta_type">MType</span> 
</td> 

Nel template precedente, l'editor wysiwyg del designer caricherà l'immagine icon.gif nella cartella /images, mentre, dopo il rendering, il valore dell'attributo src sarà sostituito dal risultato dell'espressione item/icon.

Structure e omit-tag

Le istruzioni tal:content e tal:replace quotano il testo che inseriscono nel template renderizzato: ad esempio &lt; sostituisce il carattere <.

Nei casi in cui vogliamo evitarlo, perchè stiamo effettivamente inserendo degli elementi XHTML ben formati, è sufficiente usare la direttiva structure.

Se invece avete bisogno di togliere di mezzo un tag inserito dal designer, ma mantenendo in uscita il suo contenuto, potete usare l'istruzione òmit-tag:

<div tal:define="ciao string:<b>ciao</b>" 
     tal:omit­tag="nothing">   
    <span tal:replace="ciao"/> 
    <span tal:replace="structure ciao"/> 
</div> 

Il template precedente dopo il rendering produce il risultato seguente:

&lt;b&gt;ciao&lt;b&gt; 
<b>ciao</b> 

Dovrebbe essere abbastanza facile immaginare come un browser web vi mostrerà il risultato. :)

Tag fantasma: nothing

Editare un template in un editor wysiwyg è poco utile se non si utilizzano dei segnaposto, che devono però scomparire a run­time.

Se ad esempio il designer prevede di inserire una tabella in un certo punto, avrà bisogno di caricarci dei record per capire come impattano sulla pagina.

Lo sviluppatore non vuole mostrare quei record agli utenti finali della pagine, ma dovrà fare lasciarli disponibili al designer. Per farlo gli sarà sufficiente usare un'istruzione replace con valore nothing:

<tr tal:replace="nothing">   
  <td>nome</td>  <td>cognome</td> 
</tr> 

Tutto questo template non produce nulla in fase di rendering, ma il designer potrà vedere nel suo editor alcune righe della tabella per capire il loro impatto sulla pagina.

Gestione Errori

L'istruzione on-error permette di gestire errori all'interno dei template.

Considerate il template seguente:

<b tal:on­error="string:username non definito" 
     tal:content="here/getUsername">Mauro</b> 

Se l'espressione here/getUsername restituisce errore, dopo il rendering avremo:

<b>username non definito</b>

Analogamente, nel caso del seguente template:

<b tal:on­error="nothing" 
     tal:content="here/getUsername">Mauro</b> 

Se l'espressione here/getUsername restituisce errore in fase di rendering l'intero tag verrà eliminato.

...E non Finisce Qui!

Molto altro dovrebbe essere detto sulle possibilità offerte da TAL, ma non è più tempo...

Lo ZopeBook - http://docs.zope.org/ - offre due interi capitoli su ZPT oltre alla ZPT reference.

Sul Plone.org c'è un valido tutorial di Limi: http://plone.org/documentation/tutorial/zpt.

Inotre, come al solito, molti validi spunti ed esempi sono sparsi nella rete: Google è il vostro migliore amico!

 
by Maurizio Delmonte last modified 2009-03-19 12:30
Contributors: Paolo Dina