Créer une apparence (Skin) sur mesure (pour Plone 1.x) [How-To]
Ceci explique comment construire un nouveau 'look' pour un site Plone. C'est un processus assez simple et la méthode suivante a été conçue pour rendre simple l'application de nouvelles skins pour des sites sur d'autres serveurs en copiant simplement un dossier contenant tous les éléments personnalisés dans le dossier plone_styles (voir étape 1 ci-dessous) et en appliquant qq changements dans la ZMI.
Paramétrer une skin personnalisée
- Créez un nouveau dossier sur le système de fichiers local au
serveur concernant les styles Plone, sous Windows ça donne
C:\...\Plone\Data\Products\CMFPlone\skins\plone_styles\
Pour me rendre la vie plus facile j'ai copié/collé un des dossiers que j'ai renommé. Vous pouvez juste créer un dossier vide et le remplir ensuite avec les fichiers concernés (voir plus bas).
(Note du traducteur : dés qu'il faut attaquer le système disque local j'ai un doute sur la propreté de la méthode, toujours est-il que ça marche et qu'il est toujours possible de faire marche arrière)
- Après avoir fait un "Refresh" - dans la ZMI allez sur /Plone/portal_skins et cliquez sur l'onglet properties.
- Pour ajouter ma nouvelle skin je lui donne un nom, j'ai copié/collé
un autre champ contenant les ‘paths’ des layers et donné à la skin le
même nom que celui du dossier créé plus haut où la nouvelle skin sera
stockée. Si vous voulez supprimer l'une des skins qui seront
accessibles dans les préférences et options de Plone c'est ici que vous
devez supprimer les entrées.
- Pour tester rapidement les changements, je recommande d'ouvrir
le 'Control Panel' de la ZMI dans une nouvelle fenêtre et d'aller
ensuite sur "Product Management" puis CMFPlone. Cliquez sur le bouton
"refresh" en haut à droite. Rafraichissez chaque fois que vous voulez
voir le résultat des changements effectués. Il faut aussi réactualiser
la page dans le navigateur. Vous aurez ainsi une fenêtre réservée à la
ZMI que vous pourrez rafraichir quand nécessaire et vers laquelle vous
pourrez basculer à tout moment.
Note. Les changements sur les images - ex le logo etc peut ne pas s'afficher dans le browser sans un rafraichissement complet. Essayez Ctrl-F5 ou videz le cache et faites un rafraichissement normal ...
Custom Style Sheets (CSS) - styles personnalisés
Copiez ploneCustom.css depuis le dossier plone_styles dans votre
dossier portal_skins\custom. Vous pouvez personnaliser des éléments
contenus dans plone.css (styles par défaut de Plone) en les
incluant dans ce fichier personnalisé (par un bête copier coller du contenu de plone.css dans plonecustom.css)
- les éléments seront d'abord
examinés dans ce fichier personnalisé (plonecustom.css). Vous pouver également définir
des classes personnalisées que vous pourrez inclure dans vos propres
templates. (les changements seront vus après un ZMI/Plone/Refresh.)
Stylesheet_properties.props
De même, si vous ne voulez pas d'ennui après un plantage il vaut mieux copier ce fichier depuis le dossier plone_styles dans votre dossier custom . C'est une autre 'feuille de style' qui concerne les éléments standards contenus dans Plone. Vous noterez que plone.css définit quelques propriétés avec le préfixe &dtml- suivi d'un nom (par exemple: &dtml-mainBackground; ). Ce nom fait référence à une entrée dans le fichier stylesheet_properties où cet élément de 'style' (ex couleur, police etc) est défini. Voilà donc une nouvelle méthode permettant de changer des valeurs dans stylesheet_properties pour appliquer les changements à tous les éléments css définis de cette manière. Il est également possible d'ajouter de nouveaux éléments dans le fichier stylesheet_properties et d'en faire référence dans un fichier css personnalisé en utilisant le préfixe &dtml-nompropriete; .
(Vous devez faire un rafraichissement complet (Ctrl-F5) ou vider votre cache pour voir les résultats des changements sur ce fichier.)
A PARTIR D'ICI CE N'EST PLUS UNE TRADUCTION DU HOWTO
car j'ai amené quelques précisions utiles.
Les paramètres décrits dans le tableau ci-dessous correspondent aux
différents champs du style_sheet_properties standard tels qu'ils sont
utilisés dans le plone.css standard lui aussi (et éventuellement
plonecustom.css ou encore dans n'importe quelle feuille de style css
que vous créez). Vous pouvez tout à fait créer votre propre
plonecustom.css qui ne ferait pas usage de ces paramètres ou bien les
utiliserait d'une autre façon. Le style_sheet_properties permet donc à
quelqu'un de modifier tous ces paramètres sans avoir à connaître le
codage d'une css. C'est moins puissant que la modification directe du
css car toutes les caractéristiques des styles ne sont pas disponibles,
cependant ça présente quelques avantages :
- si on veut
utiliser plusieurs skins (apparences) chaque skin possèdera son propre
style_sheet_properties.
- une seule propriété de stylesheetproperties peut être utilisée pour
modifier plusieurs classes de style en une seule opération.
- vous pouvez, comme pour n'importe quel objet Zope, ajouter de
nouvelles propriétés à la style_sheet_properties, et de cette manière
caractériser les différences entre une apparence et une autre ou
caractériser ce qui fait la différence entre votre site Plone et celui
du voisin.
|
Noms de propriété du stylesheet _properties standard
|
Utilisation dans le plone.css standard |
|
| |
plone_skin
|
Nom de la skin ou du style (pas vraiment utile mais peut servir dans le cadre des skins à titre de mémo) |
| |
mainFont
|
Police de base utilisée dans le site Plone. |
| |
mainBackground
|
Fond de page général utilisé sur tout le site Plone |
| |
mainFontColor
|
Couleur de la police de base |
| |
mainLinkColor
|
Couleur des liens |
| |
mainTabBorderColor
|
Couleur des bordures des onglets non sélectionnés. Attention ce paramètre et ceux qui suivent (avec le préfixe mainTab) sont également utilisés pour la couleur des barres de scrolling sous IE5, pour les filets sous les titres, pour les scroll-bar des SELECT ou des TEXTAREA, .... |
| |
mainTabBorderColorSelected
|
Couleur des bordures des onglets sélectionnés |
| |
mainTabBackground
|
Paramètres d'arrière-plan (Couleur de fond ou image de fond ...) pour un onglet survolé ou sélectionné |
| |
mainTabBackgroundNotSelected
|
Paramètres d'arrière-plan pour un onglet ni survolé ni sélectionné |
| |
mainTabBackdrop
|
Paramètres d'arrière-plan pour tout autre type d'onglet |
| |
mainTabFontWeight
|
épaisseur de caractère pour les onglets |
| |
mainTabFontColor
|
couleur de caractère pour un onglet |
| |
mainTabFontColorSelected
|
couleur de caractère pour onglet survolé ou sélectionné |
| |
headingFont
|
Police de caractère utilisée dans les titres |
| |
headingFontColor
|
Couleur de caractère utilisée dans les titres |
| |
headingSize1
|
taille de caractère pour les titres de type <H1> |
| |
headingSize2
|
taille de caractère pour les titres de type <H2> |
| |
headingSize3
|
taille de caractère pour les titres de type <H3> |
| |
headingSize4
|
taille de caractère pour les titres de type <H4> |
| |
headingSize5
|
taille de caractère pour les titres de type <H5> |
| |
headingSize6
|
taille de caractère pour les titres de type <H6> |
| |
descriptionFont
|
Police de caractère utilisée pour afficher la description d'un document |
| |
contentFont
|
Police de caractère utilisée pour afficher le contenu d'un document. |
| |
contentBackground
|
Attention,
ce ne sont pas les paramètres d'arrière-plan pour le contenu d'un document
mais pour un contenu éditable. |
| |
contentImageBorder
|
Caractéristiques de bordure autour des images |
| |
contentLinkActiveColor
|
Couleur des liens dans le contenu d'un document |
| |
contentLinkVisitedColor
|
Couleur des liens visités dans le contenu d'un document |
| |
contentTabBorder
|
Caractéristiques de bordure des onglets concernant un contenu (tous les paramètres
préfixés contentTab concernent des onglets comme editer, voir,
propriétés, attachés à chaque contenu) |
| |
contentTabBackground
|
Paramètres d'arrière-plan des onglets attachés à un contenu, lorsqu'ils sont sélectionnés ou survolés |
| |
contentTabBackgroundNotSelected
|
Paramètres d'arrière-plan des onglets attachés à un contenu, lorsqu'ils ne sont ni sélectionnés ni survolés |
| |
contentTabBackdrop
|
Paramètres d'arrière-plan des autres onglets attachés à un contenu. |
| |
contentTabFontWeight
|
épaisseur de caractère dans les onglets attachés à un contenu |
| |
contentTabFontColor
|
couleur de caractère dans les onglets attachés à un contenu ni séléctionnés ni survolés |
| |
contentTabFontColorSelected
|
Couleur de caractère dans les onglets attachés à un contenu séléctionnés ou survolés |
| |
preBorder
|
Caractéristiques de bordure pour texte préformatté (balise <pre>) |
| |
preBackground
|
Paramètres d'arrière-plan pour texte préformatté |
| |
messageFont
|
Police de caractère réservée aux messages (d'alerte en cas d'erreur sur saisie formulaire par exemple) |
| |
messageBackground
|
Paramètres d'arrière-plan pour ces messages |
| |
messageBorder
|
Caractéristiques de bordure pour ces messages |
| |
textTransform
|
Transformation éventuelle du texte dans les barres et onglets de navigation (pour tout forcer en minuscule entrer lowercase) |
| |
noBorder
|
Caractéristiques de bordure pour les champs input qui d'habitude n'en ont pas besoin
comme les boutons radio. Je ne vois pas à quoi sert vraiment cette
propriété (si on ne met pas none c'est pas terrible ...) |
| |
evenRowBackground
|
Paramètres
d'arrière-plan d'une ligne de tableau sur deux pour certains tableaux
de Plone (je ne vois pas trop lesquels vu que les listes dynamiques
sont traitées plus bas) |
| |
oddRowBackground
|
Paramètres d'arrière-plan d'une ligne de tableau sur deux (l'autre couleur) pour certains tableaux de Plone |
| |
groupBorder
|
Caractéristiques de bordure autour des formulaires |
| |
requiredField
|
Caractéristiques de l'image qui signale un champ obligatoire dans un formulaire |
| |
inputFont
|
Police de caractères utilisée dans les champs de type input (texte) |
| |
inputBorder
|
Caractéristiques de bordure utilisée dans les champs de type input text et textarea - Là il manque une propriété évidente qui est la couleur de fond. |
| |
contextButtonBackground
|
Paramètres d'arrière-plan pour les boutons de type submit dans les formulaires contextuels comme la boîte de recherche (searchbox) ou la loginbox. |
| |
contextButtonPadding
|
Marge intèrieure pour les boutons de type "submit" dans les formulaires contextuels |
| |
contextButtonFontColor
|
Couleur de caractère pour les textes des boutons de type "submit" dans les formulaires contextuels |
| |
standaloneButtonBackground
|
Paramètres d'arrière-plan pour les boutons "submit" avec la classe de style "standalone". Par exemple le bouton "Ajouter" un contenu dans un dossier en mode édition. |
| |
standaloneButtonPadding
|
Marge intèrieure pour les boutons "submit" avec la classe de style "standalone". |
| |
standaloneButtonFontColor
|
Couleur de caractère pour les boutons "submit" avec la classe de style "standalone". |
| |
destructiveButtonBackground
|
Paramètres d'arrière-plan pour les boutons "submit" avec la classe de style "destructive" (je n'ai pas trouvé d'exemple - désolé). |
| |
destructiveButtonPadding
|
Marge intèrieure pour les boutons "submit" avec la classe de style "destructive". |
| |
destructiveButtonBorder
|
Caractéristiques de bordure pour les boutons "submit" avec la classe de style "destructive". |
| |
destructiveButtonFontColor
|
Couleur de caractère pour les boutons "submit" avec la classe de style "destructive". |
| |
buttonWeight
|
Epaisseur des caractères pour tous les boutons de type "submit". |
| |
boxBorder
|
Caractéristiques de bordure |
| |
boxHeaderBackground
|
Paramètres d'arrière-plan des entêtes (titres) de toutes les boîtes (slots) de navigation. |
| |
boxHeaderFontColor
|
Couleur de caractère des entêtes (titres) de toutes les boîtes (slots) de navigation. |
| |
boxLinkBackground
|
Paramètres d'arrière-plan pour certains liens dans les slots (utilisés seulement pour les événements du calendrier) |
| |
boxLinkColor
|
Couleur des liens pour certains liens dans les slots (utilisés seulement à ma connaissance pour les événements du calendrier) |
| |
boxEvenBackground
|
Paramètres d'arrière-plan des lignes "foncées" dans les boîtes de navigation (exemple dans le slot "à propos" l'état est indiqué avec la classe even) |
| |
boxOddBackground
|
Paramètres d'arrière-plan des lignes "claires" dans les boîtes de navigation (exemple dans le slot "à propos" l'auteur est indiqué avec la classe odd) |
| |
boxHighlight
|
Caractéristiques
de bordure pour certains textes dans les slots de navigation (je ne
connais qu'un exemple c'est le chiffre de la journée en cours dans le
calendrier qui est encadré d'une bordure) |
| |
listingBorder
|
Caractéristiques de bordure des tableaux pour les listes dynamiques par défaut de Plone |
| |
listingHeaderBackground
|
Paramètres d'arrière-plan de l'entête des tableaux pour les listes dynamiques par défaut de Plone |
| |
listingHeaderFontColor
|
Couleur de caractère de l'entête des tableaux pour les listes dynamiques par défaut de Plone |
| |
listingLinkHover
|
Couleur des liens survolés dans les listes dynamiques par défaut de Plone |
| |
listingEvenBackground
|
Paramètres d'arrière-plan d'une ligne de tableau sur deux (la ligne traditionnellement foncée) dans les listes dynamiques par défaut de Plone. Même si vous modifiez ce paramètre l'arrière-plan des lignes "foncées" sera identique si vous ne changez pas EvenRowBackground de la même manière, le contraire n'est pas vrai. |
|
listingOddBackground
|
Paramètres d'arrière-plan d'une ligne de tableau sur deux (la ligne traditionnellement claire) dans les listes dynamiques par défaut de Plone. Même si vous modifiez ce paramètre l'arrière-plan des lignes "claires" sera identique si vous ne changez pas OddRowBackground de la même manière, le contraire n'est pas vrai. | |
| |
topBackground
|
Paramètres d'arrière-plan pour l'entête de page (contenant en standard le logo et la boîte de recherche) |
| |
topMargin
|
Marge extérieure pour l'entête de page (contenant en standard le logo et la boîte de recherche) |
| |
topPadding
|
Marge intèrieure pour l'entête de page (contenant en standard le logo et la boîte de recherche) |
| |
logoMargin
|
Marge extérieure pour le seul bloc logo, donc par rapport aux autres éléments de l'entête. |
| |
logoPadding
|
Marge intèrieure pour le seul bloc logo. |
| |
searchMargin
|
Marge extérieure pour le seul bloc de recherche, donc par rapport aux autres éléments de l'entête. |
| |
searchPadding
|
Marge intèrieure pour le seul bloc de recherche. |
| |
searchFontColor
|
Couleur de caractère pour le seul bloc de recherche. |
| |
footerBackground
|
Paramètres d'arrière-plan pour le pied de page. |
| |
footerBorder
|
Caractéristiques de bordure pour le pied de page. |
Ouf !!!
Templates personnalisés
Pour véritablement modifier la mise en page il faudra à un moment ou
un autre s'attaquer aux templates et en particulier au main_template
situé dans /votresitePlone/portal_skins/plone_templates/ toujours grâce
à la ZMI. Vous choisissez main_template et, comme d'habitude, vous cliquez sur "custom".
Plutôt que de seulement traduire le HOWTO qui est un peu
timide de ce point de vue (on trouve quand-même la suite plus bas), je
vous propose de modifier le main_template et en particulier de corriger
un problème soulevé par tous les utilisateurs des sites Plone utilisant
le main_template standard :
Dans le site Plone de base vous remarquerez que si le contenu
d'un document est trop large, soit à cause d'une image, ou à cause d'un
texte sans espace trop long (lignes de code par exemple), alors la
largeur du contenu s'agrandit mais les entêtes et les pieds de page ne
suivent pas, et ça fait tout de suite site "amateur", du point de vue
graphique j'entends. Pour éviter ce problème la solution est
simple : il faut intégrer les blocs entête et pied de page dans un même
tableau. Il y a la solution la plus simple qui consiste à créer un
nouveau tableau, mais ça alourdit
le code pour rien.
Il suffit en réalité de faire commencer le tableau utilisé pour le
contenu, en haut de page (après la balise <body>), de mettre le
bloc d'entête dans une ligne(<tr>) comportant une seule colonne
(<td colspan="3"> car le contenu central comporte lui 3 colonnes), de
faire la même chose pour le bloc pied de page, et de déplacer la balise
de fermeture du tableau (</table>) avant la balise
</body>.
Vous remarquerez que les balises
<tbody> et </tbody> ont également été déplacées avec les
balises <table> et </table>, ces balises qui ne servent pas
à grand-chose dans le main_template standard de plone me servent ici à créer des
marges d'une couleur de fond différente, car j'ai appliqué dans le
plone_custom.css une couleur de fond blanc à la page (style body) et
une couleur de fond bleu au style tbody, de plus j'ai créé pour la page
(<body>) une marge de 10px partout. Mais si vous voulez que
le corps central du site possède des propriétés différentes des entêtes
et pied de page vous pouvez placer la balise <tbody> de manière à
ce qu'elle encadre seulement les 3 colonnes du corps central du
site.
Assez parlé voici le code source de mon main_template
:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en"
lang="en"
metal:define-macro="master"
tal:define="member here/portal_membership/getAuthenticatedMember;
portal here/portal_url/getPortalObject;
global portal_url portal;
actions python:here.portal_actions.listFilteredActionsFor(here);
site_properties here/portal_properties/site_properties;
ztu modules/ZTUtils;
actions options/actions|actions|nothing;
obj_actions actions/object;
wf_actions actions/workflow;
folder_actions actions/folder;
local_actions python:actions.get('object_tabs', []);
isFolder python:test(here.getTypeInfo().getId() in site_properties.use_folder_tabs,1,0);
template_id options/template_id|template_id|template/getId|nothing;
slots_mapping options/slots_mapping|here/prepare_slots|nothing;
Iterator python:modules['Products.CMFPlone'].IndexIterator;
tabindex python:Iterator(pos=30000);"
tal:attributes="lang site_properties/default_language|default;
xml:lang site_properties/default_language|default;">
<head metal:use-macro="here/header/macros/html_header">
<metal:block metal:fill-slot="base">
<metal:block metal:define-slot="base">
<base href=""
tal:condition="here/aq_explicit/isPrincipiaFolderish|nothing"
tal:attributes="href python:here.absolute_url()+'/'" />
<metal:block tal:condition="not:here/aq_explicit/isPrincipiaFolderish|nothing">
<base href=""
tal:define="path python:'/'.join(here.portal_url.getRelativeContentPath(here)[:-1])"
tal:attributes="href python:here.portal_url()+'/'+path+test(len(path)>0,'/','')" />
</metal:block>
</metal:block>
</metal:block>
<metal:block fill-slot="head_slot"
tal:define="language here/Language;
lang python:test(language,
language,
site_properties.default_language);
charset site_properties/default_charset|string:utf-8">
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/html;;charset=%s' % charset)" />
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Language', lang)" />
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT')" />
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Pragma', 'no-cache')" />
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Last-Modified', DateTime().toZone('GMT').rfc822())" />
<metal:block define-slot="head_slot" />
</metal:block>
<metal:block fill-slot="css_slot">
<metal:block define-slot="css_slot" />
</metal:block>
<metal:block fill-slot="javascript_head_slot">
<metal:block define-slot="javascript_head_slot" />
</metal:block>
</head>
<body>
<table class="columns">
<tbody>
<tr>
<td colspan="3" align="left" valign="top">
<div metal:use-macro="here/header/macros/portal_header">
Header stuff
</div>
</td>
</tr>
<tr>
<td class="left" metal:define-macro="left_column"
tal:define="slots_mapping options/slots_mapping|slots_mapping|nothing;
site_properties options/site_properties|site_properties|nothing;
portal_url options/portal_url|portal_url|nothing;
Iterator python:modules['Products.CMFPlone'].IndexIterator;
tabindex python:Iterator(pos=10000);"
tal:condition="slots_mapping/left|nothing">
<metal:block tal:repeat="slot slots_mapping/left|slots_mapping/left">
<tal:block tal:define="global pathexpr python:slot[0];
global usemacro python:slot[1]"
tal:condition="usemacro">
<metal:block metal:use-macro="python:path(pathexpr)" />
</tal:block>
<span tal:condition="not: usemacro"
tal:replace="structure python:path(pathexpr)" />
</metal:block>
</td>
<td class="main"
tal:define="global show_border python:here.showEditableBorder( template_id=template_id
, actions=actions );
Iterator python:modules['Products.CMFPlone'].IndexIterator;
tabindex python:Iterator(pos=0);">
<metal:block define-slot="super"
tal:condition="show_border" >
<div id="contentTabs" metal:define-macro="contentTabs"
tal:define="isFolder options/isFolder|isFolder|nothing;
folder_actions options/folder_actions|folder_actions|nothing;
local_actions options/local_actions|local_actions|nothing;
obj_actions options/obj_actions|obj_actions|nothing;
template_id options/template_id|template_id|nothing"
i18n:domain="plone">
<tal:block tal:repeat="action python:test(isFolder, folder_actions+obj_actions+local_actions, obj_actions+local_actions)">
<a class="" href=""
tal:attributes="class python:test(action['url'][action['url'].rfind('/')+1:]==template_id, 'selected', 'plain');
href action/url;">
<span tal:omit-tag="" i18n:translate=""><span tal:replace="action/name">dummy</span></span>
</a>
</tal:block>
</div>
<div id="contentBar">
</div>
</metal:block>
<div class="document"
tal:attributes="class python:test(show_border, 'editableDocument', 'document')">
<div id="content">
<metal:block metal:use-macro="here/header/macros/portal_message">
Message box
</metal:block>
<div class="documentActions"
metal:define-macro="documentActions"
tal:define="portal_url portal_url|here/portal_url">
<metal:block define-slot="documentActions"
tal:content="nothing">
Document actions slot
</metal:block>
<a href=""
tal:condition="site_properties/allow_sendto | nothing"
tal:attributes="href python:'%s/portal_form/sendto_form' % here.absolute_url()">
<img i18n:attributes="title" alt="Send to"
tal:attributes="src string:$portal_url/mail_icon.gif"
src="mail_icon.gif" title="Send this page to somebody" />
</a>
<a href="javascript:this.print();">
<img i18n:attributes="title" alt="Print"
tal:attributes="src string:$portal_url/print_icon.gif"
src="print_icon.gif" title="Print this page" />
</a>
</div>
<metal:block metal:define-slot="header" tal:content="nothing">
Header slot
</metal:block>
<metal:block metal:define-slot="main" tal:content="nothing">
Page body text
</metal:block>
<metal:block metal:define-slot="sub">
<tal metal:use-macro="here/viewThreadsAtBottom/macros/discussionView" />
</metal:block>
</div>
</div>
</td>
<td class="right" metal:define-macro="right_column"
tal:define="slots_mapping options/slots_mapping|slots_mapping|nothing;
portal_url options/portal_url|portal_url|nothing;
Iterator python:modules['Products.CMFPlone'].IndexIterator;
tabindex python:Iterator(pos=20000);"
tal:condition="slots_mapping/right">
<metal:block tal:repeat="slot slots_mapping/right">
<tal:block tal:define="global pathexpr python:slot[0];
global usemacro python:slot[1];"
tal:condition="usemacro">
<metal:block metal:use-macro="python:path(pathexpr)" />
</tal:block>
<span tal:condition="not: usemacro"
tal:replace="structure python:path(pathexpr)" />
</metal:block>
</td>
</tr>
<tr>
<td colspan="3" align="left" valign="top">
<hr size="" class="netscape4" />
<div class="footer" metal:use-macro="here/footer/macros/portal_footer">
Footer
</div>
</td>
</tr>
</tbody>
</table>
</body>
</html>
Je n'ai pas mis le schéma présenté dans le howto quant à la structure de la page car il manque de clarté.
Voilà ce qui compte pour changer le look d'un site :
- La struture du template main_template avec ses tableaux, ses
blocs inclus dans les tableaux, et ses appels aux autre templates comme
le portal_header qui fabrique le bloc d'entête.
- Les balises html du template et leurs correspondances dans la feuille de style plone.css ou plone_custom.css si vous avez personnalisé vos styles. Si je veux un style particulier pour l'ensemble de ma page je changerais dans le plone_custom.css ce qui se trouve entre les accolades pour l'attribut body (body { ...}). Ensuite il peut y avoir soit des attributs de classe s'appliquant seulement à une balise, par exemple "td.pabo {...}" s'appliquera à la balise <td> avec la classe "pabo" et s'écrira donc dans le template <td class="pabo" ...>, soit des attributs de classe écrits simplement ".pabo {...}" et qui s'appliqueront partout où on trouvera la classe (class="pabo"), soit des attributs s'appliquant uniquement à un élément portant un nom (exemple le bloc <div id="monbloc"> ou le tableau <table id="montableau">) et dans ce cas le style s'écrira "#moncalque {...}" ou encore "#montableau {...}" .
- Le style_sheet_properties qui servira dans le cas d'un site devant être décliné en plusieurs skins et qui permet d'inclure des variations sans avoir à retoucher le style lui-même.
Plone
est offert avec toute une batterie d'outils mais il faut cibler leur
usage et éviter d'alourdir le temps de fabrication des pages, par
conséquent la bonne démarche est sans doute de tout reprendre à zéro
avec un main_template tout neuf et d'inclure petit à petit les objets
nécessaires.
A PARTIR D'ICI REPRISE DE LA TRADUCTION DU HOWTO
Vous pouvez également vous intéresser aux éléments créés grâce au
langage de templating Template Attribute
Language (TAL). Il est utilisé pour incorporer des éléments dynamiques
dans vos gabarits (templates) personnalisés. Mon intérêt pour cette
technique est venue du désir d'ajouter la date du jour dans un
entête personnalisé. N'étant pas programmeur par profession, au départ
j'ai trouvé ça très complexe. Ma première étape fut les pages d'aide
suivantes :
http://www.zope.org/Documentation/Articles/ZPT1 et http://www.zope.org/Documentation/Articles/ZPT2
J'ai eu ensuite un bon aperçu de la manière dont fonctionne le calendrier (calendar_slot.pt que l'on trouve sur
C:\...\Plone\Data\Products\CMFPlone\skins\plone_templates\ui_slots) et le module DateTime (DateTime.pt situé sur
C:\...\Plone\Zope\lib\python\DateTime).
J'ai
utilisé le code suivant pour ajouter la date (svp notez que le tableau
(<table> est utilisé pour mes besoins ergonomiques propres et
n'est pas utile pour le fonctionnement):
<table
tal:define="DateTime python:modules['DateTime'].DateTime;
current python:DateTime();
day python:request.get('day', DateTime().Day());
dd python:request.get('dd', DateTime().dd());
month python:request.get('month', DateTime().Month());
year python:request.get('year', DateTime().year());"><tr>
<td>
<span tal:replace="string:$day">Monday </span>
<span tal:replace="string:$dd">01 </span>
<span tal:replace="string:$month">January </span>
<span tal:replace="string:$year" >2001</span>
</td></tr>
</table>
Andrew R. Halko (de la mailing list des utilisateurs de Plone) m'a suggéré le code suivant plus compact :
<table
tal:define="now modules/DateTime/DateTime" ><tr>
<td>
<span tal:replace="now/%A %d %B %Y">Monday 01 January 2001</span>
</td>
</tr>
</table>
Selon l'article de Zope il semblerait que tal:define ne puisse être
utilisé plus d'une fois dans une balise. Ici j'ai besoin de
l'utiliser une fois seulement (dans le tag TABLE) - c'est utilisé
pour importer le
module python (DateTime) pour manipuler les dates. Il définit ensuite
les éléments du module dont nous aurons besoin - dans ce cas le Jour,
dd (le jour en format numérique), le mois et l'année.
Pour
insérer ces éléments dans ma page j'ai utilisé les balises
<span>, tal:replace et les 'String
expressions' (see the section on this in ZPT2). La balise
<span> est juste utilisée comme container pour chaque élément
individuel et ne change rien au rendu de la page. Le code tal:replace
code est utilisé pour remplacer ce qui se trouve entre les balises
<span> et </span> par les éléments dynamiques produits par
le module python et supprime également les balises <span>.
Si j'avais voulu garder ces balises j'aurais plutôt utilisé
tal:content.
Pourquoi
est-ce pratique ? Le plus grand intérêt de TAL est qu'il ne fout pas en
l'air la manière dont le HTML est affiché dans un éditeur web
WYSIWYG comme Dreamweaver. En effet tous les éléments
TAL seront ignorés par l'éditeur WYSIWYG. Ca signifie qu'un designer
peut travailler sur le the look de la page sans avoir à se soucier de
ce que vont devenir les contenus dynamiques. Toutefois -
Dreamweaver n'a pas accès aux contenus dynamiques (ceux créés avec
Zope) donc pour les besoins du design les éléments à l'intérieur des
balises <span> sont affichés. Dans ce cas précis le contenu du
tableau s'affichera dans l'éditeur wysiwyg " Monday 01 January 2001",
tandis que dans mon site il affichera la date.
De même - réactualisez l'écran pour voir le contenu dans Plone.
Encore deux pages qui peuvent valoir le coup pour clarifier le langage TAL:
http://www.zope.org/Documentation/Books/ZopeBook/current/ZPT.stx
http://www.zope.org/Documentation/Books/ZopeBook/current/AdvZPT.stx
A partir de là je ne traduis plus car je pense que c'est une hérésie de modifier directement sur le disque dur plutôt que d'utiliser le dossier Custom. Le how-To d'origine propose à peu près le contraire en plus il ne parle que de C:\, c'est à dire Windows.

Log in
PloneArticle
Forgot your password?