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>