Actions sur le document
Introduction aux Zope Page Template (ZPT)
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 :

