Outils personnels
Vous êtes ici : Accueil Blog Introduction aux Zope Page Template (ZPT)
Navigation
 
Actions sur le document

Introduction aux Zope Page Template (ZPT)

Filed Under:

Lorsqu'on veut adapter un site Plone à ses propres besoins, il est très utile de savoir modifier les scripts qui le composent. Ceux-ci sont principalement de deux types: Les scripts python et les Zope Page Templates (ZPT). Pour ceux qui ont l'habitude du PHP, les ZPT peuvent paraître étranges... Cette introduction aux ZPT s'adresse en particulier à cette catégorie de personnes.

Introduction

 


1) Les ZPT c'est quoi ?

Les ZPT ne s'occupent que de la présentation...

Les ZPT on été pensés pour gérer la partie "présentation" des applications (par opposition à la partie "logique"). Il sera préférable de confier les procédures complexes à des scripts python que les zpt pourront appeler pour en afficher le résultat.

...mais ils s'en occupent bien !

Les ZPT (alternative aux DTML) sont devenus le standard pour développer les interfaces d'applications Zope.

2) Je connais un peu de PHP, est-ce que ça va m'aider ?

Comme avec le PHP, tout se passe sur le serveur...

 Les ZPT sont interprétés du côté "serveur" - le client n'en reçoit que le résultat (du simple html).


..mais c'est peut-être le seul véritable point commun entre les deux langages ! :-)

Au premier abord, les ZPT pourront vous paraître étranges. Mais la logique de base reste celle des langages de programmation classiques (des définitions de variable, des conditions et des boucles) et avec un peu de persévérance, on peut rapidement écrire des ZPT qui remplissent parfaitement leur rôle!

3) Démarche

Pour écrire ses premiers ZPT, il faut au minimum apprendre les bases de la syntaxe TALES et les quelques commandes du langage TAL. C'est ce que nous allons voir dans la première partie.

Dans la seconde partie , nous présenterons la suite de la syntaxe TALES et le langage METAL, qui permet d'inclure des ZPT les unes dans les autres (un peu à la manière des "include" en PHP, mais en plus souple et plus puissant).

Enfin, dans la troisième partie nous mettrons en pratique ces connaissances dans un exemple concret d'application Zope. (partie en cours de réalisation !)

 

Ière partie: Ecrire ses premiers ZPT

 


1) La syntaxe des expressions TALES

Il existe 6 types différents d'expression TALES pour les ZPT. Pour débuter, il n'est pas nécessaire de les connaître tous. Nous commencerons donc par en étudier 3: path:, string: et python: (pour une explication des autres types, soient "exists:", "nocall:" et "not:", voir plus loin)

path: préfix un chemin (path) vers la propriété d'un objet sous la forme: /objet/propriété

Ainsi, "path:unepage/title" est un chemin vers la propriété "title" de l'objet "unepage".
en interprétant cette expression, Zope va remplacer unepage/title par la valeur "title" de "unepage".

p.ex: si on se trouve dans une page qui a pour titre "Nouveau", here/title vaut "Nouveau"

Qu'est-ce que ce "here" ?! Il existe un certain nombre de noms prédéfinis pour les ZPT et qui permettent d'appeler différents objets. Citons ici les plus fréquents:

  • "here" correspond à l'objet qui appelle le zpt. p.ex. here/title affiche le titre de la page
  • Il peut être utilisé comme contexte (here en zpt est l'équivalent de "context" dans un script python) pour appeler un autre objet Zope. P.ex. pour appeler un script python "unscript", on écrira  "here/unscript".
  • "request" contient la requête. On l'utilise pour récupérer des variables passées dans la requête (p.ex. request/param)
  • "user" l'utilisateur authentifié.
 
 


Comme "path:" est le type TALES par défaut, ce préfix peut être omis. Par contre les types suivants doivent toujours être explicitement précisés comme préfix à une expression.

string: comme sont nom l'indique, ce type préfix une chaîne de caractère ("string"). p.ex: string:hello world

Il est possible de substituer des variables en ajoutant un $ devant la variable.
p.ex:
string:hello ${nom}
ou
string:ceci est la page ${here/title}

python: évalue l'expression python et en retourne la valeur.
p.ex: python:1+4 retourne 5

"python:" permet une plus grande souplesse que les autres types. On peut également l'utiliser pour accéder aux propriétés d'un objet ou afficher des chaînes de caractère, p.ex:
python:page.title est équivalent à  path:/page/title (les '/' sont remplacés par des '.')
python:'Hello '+nom est équivalent à string:Hello ${nom} (où nom est une variable de type string. Notez la présence des guillemets dans l'expression python et l'opérateur de concaténation "+.")

Lorsque cela est possible, on veillera toutefois à utiliser les types string: et path: plutôt qu'un appel au langage python.

On se souviendra que la "logique business" doit en principe est conservée hors des ZPT (consacrés à la présentation). Si on a besoin de plusieurs instructions python, il vaut souvent mieux les réunir dans un script python et appeler celui-ci dans le page template.
A noter qu'on est obligé d'utiliser le type python: lorsqu'on veut appeler un autre script en lui passant un paramètre. p.ex: python:here.unscript(param='test')

 

J'ai compris... et alors ?! 

Que faire de ces expressions TALES ? Elles sont utilisées dans les tags TAL. Il est temps de les passer en revue !

2) Le langage "TAL" (acronyme de "Template Attribute Language")

C'est le langage qu'on utilise le plus lorsqu'on écrit des ZPT. Ce langage vient se greffer dans les tags HTML (ou XML) sous la forme d'attributs.

p.ex: <p tal:content="exemple"></p>

 

signifie: affiche entre les tags <p> et </p> la valeur de la variable "exemple"

L'expression entre guillemet doit obéir à la syntaxe TALES vue au point 1), ici elle est très simple, c'est juste un nom de variable. Mais on pourrait avoir

 

p.ex:
<p tal:content="string:Hello World"></p>

 

<p tal:content="python:unscript(param='test')"></p>

Puisque le langage "TAL" s'occupe avant tout de la présentation, il est volontairement très limité, il ne comporte que 8 commandes qu'on peut citer ici:

   1. define             définit une variable
   2. condition         soumet le tag et ce qu'il contient à une condition
   3. repeat             répète le tag et ce qu'il contient
   4. content            affiche l'expression (en conservant le tag html)
   5. replace            affiche l'expression (en emplacant le tag html)
   6. attributes         permet de redéfinir un attribut html (p.ex href dans un lien)
   7. omit-tag          omet le tag si une condition est vérifiée
   8. on-error           appelle une expression lorsqu'une erreur se produit

Plusieurs commandes dans un même tag:

Pour alléger un peu le code, il est possible d'inclure plusieurs commandes dans un même tag. Dans ce cas l'ordre dans lequel les commandes sont interprétées est celui donné ci-dessus (remarque: content et replace ont la même priorité et "on-error" est appelé immédiatement quand une erreur se produit.

p.ex:

<span tal:define="nom expression TALES" tal:condition="expression TALES" tal:content="expression TALES"></span>

On voit que si on doit faire des tests ou des boucles complexes, l'écriture en TAL/TALES sera rapidement confuse. D'où l'intérêt de transférer la logique dans un script python et de l'appeler depuis un ZPT pour en afficher le résultat.

Annexe :

Pour lire le Doc 1

Pour lire le Doc 2

Pour lire le Doc 3