Les page templates, ZPT

publicité
Les page templates, ZPT
Les ZPT, Zope Page Templates, basé sur le TALES, voir ci-après, ont été développés
après le langage DTML. Leur grandes forces sont :
•
•
•
une syntaxe facile à lire, donc à maintenir
de permettre une collaboration sans interférence entre graphistes et
développeurs
un langage de macro permettant de réutiliser le code commun à plusieurs
gabarits
TALES
TALES signifie "Template Attribute Language Expression Syntax", c'est le langage
qui définit la forme des expressions utilisées dans les gabarits (templates) Zope.
Une expression peut être composée d'un ou plusieurs chemins séparés par un pipe |
(le caractère obtenu avec la combinaison altgr+6)
exemple : here/mon_champ | here/Title cette expression sera évaluée à la valeur de
mon_champ dans le contexte de l'objet appelé si ce champ existe, à la valeur du
champ Title dans le cas contraire
Les expressions TALES sont la base des ZPT, mais on peut les retrouver dans
d'autres situations, comme paramètrage de produits d'extension par exemple.
not
Une expression prefixée par not donne un résultat logique inversé. Cela est très utile
notamment dans l'évaluation consitionnelle, voir le paragraphe sur tal:condition.
exists
Permet de tester l'existence d'une variable dans le contexte courant, et donc d'éviter
de lever une erreur de type : Attribute error. Pour le traitement particulier des erreurs,
référez vous au paragraphe sur tal:on-error.
nocall
Le comportement par défaut est d'appeler l'objet obtenu par l'évaluation de
l'expression. Il est parfois utile d'obtenir un objet sans qu'il soit évalué. C'est le rôle
de l'expression nocall.
On utilise nocall le plus souvent pour obtenir une référence sur une fonction ou un
script afin de l'utiliser plus tard en lui passant des paramètres.
string
Une expression string permet de définir une chaîne de caractères. Vous pouvez
évaluer une variable dans la chaîne en la prefixant avec un signe dollar : $ .
string: ma variable vaut $ma_variable
Dans l'exemple précédent il est évident que ma_variable doit avoir été définie
auparavant.
Plus fréquemment on utilise une expression de type chemin. Dans ce cas il convient
de l'entourer d'accolades.
string:l'identifiant dans ce contexte est ${here/id}
python
une expression de ce type permet d'évaluer une expression python dans les gabarits.
La règle de séparation entre logique et présentation voudrait que l'on restreigne
au maximum les calculs au sein des gabarits. Il ne s'agit pourtant pas d'un
dogme absolu et cette commodité reste appréciable
Par exemple la fonction test permet des évaluations différentes en fonction d'une
condition.
python:test(condition, résultat si vrai, résultat sinon)
Voici les différentes valeurs qui sont évaluées à faux (false)
•
une chaîne vide
•
la valeur 0 (entier) ou 0.0 (flottant)
•
une liste ou un dictionnaire vide
•
La valeur python None
•
La valeur TAL nothing
Tout le reste est évalué à vrai (true)
TAL
Créer un gabarit
ici insertion d'une capture d'écran.
Comme pour tous les objets Zope, vous devez lui attribuer un identifiant (Id) unique
dans de dossier où vous le créez.
Vous avez alors le code par défaut d'un ZPT dans la zone d'édition :
<html>
<head>
<title tal:content="template/title">The title</title>
</head>
<body>
<h2><span tal:replace="here/title_or_id">content title or
id</span>
<span tal:condition="template/title"
tal:replace="template/title">optional template
title</span></h2>
This is Page Template <em tal:content="template/id">template
id</em>.
</body>
</html>
Vous remarquez immédiatement que ce code est très proche du HTML 'normal'.
Certaine expressions, préfixées par tal: et ignorées par les éditeurs graphiques
(Wysiwyg) permettent de donner les caractère dynamique à la page. Nous allons
revenir en détail sur chacun de ces attributs.
Vous pouvez changer le code par défaut à la création d'un ZPT en modifiant le
fichier :
votre_zope/lib/python/Products/PageTemplates/www/default.html
L'espace de nom.
L'espace de nom TAL est défini par :
xmlns:tal="http://xml.zope.org/namespaces/tal"
Ceci n'est pas une URL mais une URI, un identifiant unique. Zope exige une
déclaration d'un espace de nom XML si le type de contenu est différent de
text/htm. Ne pointez pas votre navigateur sur cette adresse, il n'y a rien à voir!
Attributs
TAL permet d'utiliser six attributs spéciaux dans le code HTML ou XML. Ils sont
évalués suivant l'ordre suivant quelque soit leur ordre d'apparition dans le code
source :
define : pour définir des variables locales au tag dans lequel elle sont définies.
condition : pour afficher un bloc en fonction de l'évaluation d'une expression.
repeat : pour définir une boucle autour d'un bloc d'affichage.
content : pour remplacer le contenu d'un tag.
replace : dans le même ordre d'idée que content, mais remplace également le tag
dans lequel il se trouve. A la même priorité que content.
attributes : pour affecter les attributs d'un tag.
omit-tag : pour supprimer des tags et alléger le rendu.
on-error : traitement des erreurs à l'exécution.
Définir des variables
Pour définir une variable locale dans un gabarit il faut utiliser tal:define. La portée de
la variable est limitée au tag html dans lequel elle est définie.
Exemple:
<div>
<div tal:define="ma_variable context/une_propriete">
<!-- dans ce div ma_variable peut être utilisée dans des
expressions tal:attributes, tal:content ... -->
</div>
<!-- ici ma_variable n'a plus de sens -->
</div>
Pour définir plusieurs variables dans un seul tag, il convient de les séparer par un
point virgule.
<tal:exemple tal:define="variable1 string:une chaine par exemple;
variable2 python:fonction
(context.propriete);" />
Les tests
Une condition peut être testée grâce au tag tal:condition.
<div tal:define="results python:get_results">
<div tal:condition="results">
... ici un code pour afficher les resultats...
</div>
<div tal:condition="not:results">
Pas de résultat
</div>
</div>
Il n'y a pas en TALES d'expression pour définir une alternative (else), c'est
donc par l'utilisation de la même condition prefixée par not: que vous pouvez
obtenir ce résultat.
Les boucles
Pour répéter une présentation pour chaque contenu d'une liste, vous utiliserez le tag
tal:repeat.
La variable spéciale repeat contient un certain nombre d'informations :
•
•
•
•
•
•
•
•
•
•
•
•
•
index - numéro de la répétition courante, commence à zero.
number - numéro de la répétition courante, commence à un.
even – vrai pour les répétitions paires (0, 2, 4, ...).
odd - vrai pour les répétitions impaires (1, 3, 5, ...).
start - vrai pour la première répétition (index 0, number 1).
end – vrai pour la dernière répétition.
first – vrai pour le premier élément d'un groupe
last - vrai pour le derneir élément d'un groupe
length – taille de la liste, c'est à dire le nombre total de répétitions à faire.
letter – représentation alphabétique du numéro de la répétition courante, en
lettre minuscule : "a" - "z", "aa" - "az", "ba" - "bz", ..., "za" - "zz", "aaa" "aaz", etc.
Letter – la version majuscule de letter.
roman - représentation en chiffres romains du numéro de la répétition
courante, en lettre minuscule: "i", "ii", "iii", "iv", "v", etc.
Roman - la version majuscule de roman.
Vous accédez à ces valeur par une expression de type chemin à trois parties :
- lemot clé repeat
- le nom de la variable utilisée
- le nom de la variable spéciale
Par exemple: repeat/ma_variable/index
Pour mieux comprendre, voici quelques exemples, nous reviendrons sur ces notions
avec des exemples complets en fin de chapitre.
<table>
<tr tal:repeat="objet python:('rouge','vert','bleu')">
<td tal:content="objet">couleur</td>
</tr>
</table>
Ce code va générer une table de trois lignes contenant chacune un mot de la séquence
python.
<table>
<tr tal:repeat="objet python:range(8)">
<td tal:content="objet"
tal:define="ligne_paire repeat/objet/even"
tal:attributes="class python:test
(ilgne_paire,'paire','impaire')">5</td>
</tr>
</table>
Ici on modifie la classe CSS de la ligne en fonction de la parité.
Définir le contenu
Deux possibilités pour définir le contenu d'un tag HTML, tal:content qui affecte ce
qu sera rendu entre le tag d'ouverture et le tag de clôture, et tal:replace qui remplace
complètement le tag, c'est à dire que les tags d'ouverture et de clôture n'apparaîtront
pas au rendu.
Définir les attributs
Vous pouvez modifier les attributs d'un tag à l'aide de tal:attributes.
Par exemple :
<a href="#" tal:attributes="href here/absolute_url;"
tal:content="here/Title"> Lien vers de Dossier en cours
</a>
Les commentaires
Vous pouvez évidemment commenter votre code à la mode HTML, comme ceci :
<!-- Ceci est un commentaire ignoré par les navigateurs -->
L'inconvénient est que ce code apparaît quand même dans la source générée.
Pour faire disparaître complètement un commentaire au rendu, une simple astuce :
<tal:commentaire tal:replace="nothing">
Ici vous pouvez commenter votre code, rien n'apparaîtra au rendu
</tal:commentaire>
Alléger le code résultant
Tous les tags se trouvant dans le gabarits ne sont pas forcemment pertinents dans le
rendu final. C'est le cas, par exemple des tags utilisés pour définir des variables
locales, porter les conditions ou les boucles. Vous pouvez alors utiliser un tag de
l'espace de nom TAL.
<tal:datetime define="today python:DateTime().earliestTime()">
...
</tal:datetime>
Dans cet exemple earliestTime est une méthode qui retourne la première heure
possible de la date (minuit).
Vous pouvez utiliser l'espace de nom pour définir des blocs à votre
convenance. Lorsque vous écrivez tal:XXX, XXX peut être ce que vous
voulez, il est ignoré par l'interpréteur. Le mieux est d'utiliser une terminologie
claire sur l'utilité de ce bloc.
Les erreur
Si l'interpréteur génére une erreur, il recherche un attribut on-error dans le tag
courant, puis dans celui qui le contient et ainsi de suite. Le premier tag on-error
trouvé est alors traité de la même manière qu'un tag content.
Exemples :
<div tal:content="here/ma_variable"
tal:on-error="string:ma_variable n'est pas définie">
Ma Variable
</div>
Si vous attribuez la valeur spéciale nothing au tag on-error, le bloc en cause ne sera
pas affiché :
<div tal:content="here/ma_variable"
tal:on-error="nothing">
Ma Variable
</div>
Téléchargement