Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur...

59

Transcript of Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur...

Page 1: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Table des matiegraveres1 Introduction au document1

11 Version actuelle de ce document112 A propos de ce document113 Contributions et creacutedits214 La licence Creative Commons3

2 Preacutesentation de Plone421 Structure dun site622 Types de contenu823 Workflows924 Introduction au catalogue925 Preacutesentation du meacutecanisme de skins10

3 Page Template dans Plone1231 RappelsIntroduction agrave TAL et METAL1432 Consideacuterations dinternationalisation1933 Creacuteation dun formulaire Plone 22334 Preacutesentation du gabarit et des macros standards2835 Structure dune page30

4 Deacuteveloppement de nouveaux meacutecanismes3241 Requecirctes sur le catalogue3242 Requecirctes sur un SGBDR3543 Creacuteation dun portlet3844 Deacutefinition dune action de site4045 Gestion des utilisateurs4146 Dossiers automatiques (smart folders)43

5 Creacuteation dun nouveau type de contenu4551 Preacutesentation dArchetypes4552 Deacutefinition dun type et de ses vues4653 Cas dutilisation RichDocument49

6 Personnalisation de workflow5561 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats et transitions5562 Actions automatiques aux transitions57

22092006 173026

i

1 Introduction au documentVersion actuelle de ce document

A propos de ce document

Contributions et creacutedits

La licence Creative Commons

11 Version actuelle de ce document

Version 092 du 22 septembre 2006

12 A propos de ce document

Ce document est une photographie de notre systegraveme de travail collaboratif Wiki At Work

Lensemble des pages de ce document est accessible par lURL httpsprojetspilotsystemsnet Si vous necirctespas un u t i l i sa teur deacutec lareacute dans le systegraveme vous pouvez en fa i re la demande agrave l adressemailtowawpilotsystemsnet

Wiki At Work repose sur un serveur dapplication Zope

Un wiki est un systegraveme de gestion de contenu de site Web qui rend les pages Web librement et eacutegalementmodifiables par tous les visiteurs autoriseacutes Les wikis sont utiliseacutes pour faciliter leacutecriture collaborative dedocuments avec un minimum de contrainte Le wiki a eacuteteacute inventeacute par Ward Cunningham en 1995 pour unesection dun site sur la programmation informatique quil a appeleacutee WikiWikiWeb Le mot laquo wiki raquo vient duterme hawaiien wiki wiki qui signifie laquo rapide raquo ou laquo informel raquo Au milieu des anneacutees 2000 les wikis ontatteint un bon niveau de maturiteacute et sont associeacutes au Web 20 Creacuteeacutee en 2001 lencyclopeacutedie Wikipeacutedia estdevenue le wiki le plus visiteacute au monde Deacutefinition Wikipedia

Preacutecisions sur les liens

Lensemble des liens internes au document pointe sur linfrastructure seacutecuriseacutee Wiki At Work Par conseacutequentil vous faudra disposer dun utilisateur deacuteclareacute dans le sytegraveme pour acceacuteder agrave ces liens

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 1

13 Contributions et creacutedits

Vous souhaitez contribuer

corriger des erreursbull participer agrave la structure de ce documentbull

Pour contribuer vous pouvez nous contacter par email agrave ladresse suivante mailtoplonepilotsystemsnet

Ont deacutejagrave participeacute agrave ce document

vous bull leacutequipe Pilot Systemsbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 2

14 La licence Creative Commons

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 3

2 Preacutesentation de Plone

Quest ce que Plone

Deacutefinition

Plone est un systegraveme de gestion de contenu Web Open Source publieacute selon les termes de la GNU GPL Il estconstruit au-dessus du serveur dapplication Zope et de son extension CMF (Content ManagementFramework)

Un systegraveme de gestion de contenu (en anglais Content Management System ou CMS) est une famille delogiciels de conception et de mises agrave jour dynamiques de sites web posseacutedant en particulier les fonctionnaliteacutessuivantes

permettre agrave plusieurs individus de travailler sur un mecircme documentbull fournir une chaicircne de publication (workflow) offrant par exemple la possibiliteacute de publier (mettre enligne) des documents

bull

seacuteparer les opeacuterations de gestion de la forme et du contenubull structurer le contenu (utilisation de FAQ de document de blog forum etc)bull administration via une interface webbull

Le serveur dapplications Zope

Zope est un serveur dapplication web orienteacute objet libre et eacutecrit dans le langage de programmation Python(avec quelques parties en C pour des raisons de performances)

Il peut ecirctre entiegraverement geacutereacute agrave partir dune interface Web (la ZMI Zope Management Interface)

Zope publie des objets Python enregistreacutes dans une base de donneacutees objet la ZODB

Des types dobjets basiques tels que des documents des images des patrons (templates) de page sont agrave ladisposition des utilisateurs pour ecirctre creacuteeacutes et geacutereacutes via linternet Des types dobjets speacutecialiseacutes tels que leswikis les blogs les galeries de photos sont disponibles

La structure de Zope est hieacuterarchique et composeacutee dobjets contenant eux-mecircmes des objets contenanteux-mecircmes agrave linfini

Ces objets se caracteacuterisent par un eacutetat deacutefini comme lensemble des valeurs de ses attributs et par uncomportement deacutecrit sous la forme de meacutethodes qui lui sont applicables

Chaque objet est identifieacute par un identifiant (id) unique qui est utiliseacute pour lindexation en ZODB

CMF (Content Management Framework )

CMF est une plateforme de gestion de contenu fournissant aux deacuteveloppeurs les outils pour construire desCMSs complexes ( comme Plone par exemple)

CMF repose sur Zope et Plone est la couche supeacuterieure de CMF

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 4

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 2: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

1 Introduction au documentVersion actuelle de ce document

A propos de ce document

Contributions et creacutedits

La licence Creative Commons

11 Version actuelle de ce document

Version 092 du 22 septembre 2006

12 A propos de ce document

Ce document est une photographie de notre systegraveme de travail collaboratif Wiki At Work

Lensemble des pages de ce document est accessible par lURL httpsprojetspilotsystemsnet Si vous necirctespas un u t i l i sa teur deacutec lareacute dans le systegraveme vous pouvez en fa i re la demande agrave l adressemailtowawpilotsystemsnet

Wiki At Work repose sur un serveur dapplication Zope

Un wiki est un systegraveme de gestion de contenu de site Web qui rend les pages Web librement et eacutegalementmodifiables par tous les visiteurs autoriseacutes Les wikis sont utiliseacutes pour faciliter leacutecriture collaborative dedocuments avec un minimum de contrainte Le wiki a eacuteteacute inventeacute par Ward Cunningham en 1995 pour unesection dun site sur la programmation informatique quil a appeleacutee WikiWikiWeb Le mot laquo wiki raquo vient duterme hawaiien wiki wiki qui signifie laquo rapide raquo ou laquo informel raquo Au milieu des anneacutees 2000 les wikis ontatteint un bon niveau de maturiteacute et sont associeacutes au Web 20 Creacuteeacutee en 2001 lencyclopeacutedie Wikipeacutedia estdevenue le wiki le plus visiteacute au monde Deacutefinition Wikipedia

Preacutecisions sur les liens

Lensemble des liens internes au document pointe sur linfrastructure seacutecuriseacutee Wiki At Work Par conseacutequentil vous faudra disposer dun utilisateur deacuteclareacute dans le sytegraveme pour acceacuteder agrave ces liens

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 1

13 Contributions et creacutedits

Vous souhaitez contribuer

corriger des erreursbull participer agrave la structure de ce documentbull

Pour contribuer vous pouvez nous contacter par email agrave ladresse suivante mailtoplonepilotsystemsnet

Ont deacutejagrave participeacute agrave ce document

vous bull leacutequipe Pilot Systemsbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 2

14 La licence Creative Commons

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 3

2 Preacutesentation de Plone

Quest ce que Plone

Deacutefinition

Plone est un systegraveme de gestion de contenu Web Open Source publieacute selon les termes de la GNU GPL Il estconstruit au-dessus du serveur dapplication Zope et de son extension CMF (Content ManagementFramework)

Un systegraveme de gestion de contenu (en anglais Content Management System ou CMS) est une famille delogiciels de conception et de mises agrave jour dynamiques de sites web posseacutedant en particulier les fonctionnaliteacutessuivantes

permettre agrave plusieurs individus de travailler sur un mecircme documentbull fournir une chaicircne de publication (workflow) offrant par exemple la possibiliteacute de publier (mettre enligne) des documents

bull

seacuteparer les opeacuterations de gestion de la forme et du contenubull structurer le contenu (utilisation de FAQ de document de blog forum etc)bull administration via une interface webbull

Le serveur dapplications Zope

Zope est un serveur dapplication web orienteacute objet libre et eacutecrit dans le langage de programmation Python(avec quelques parties en C pour des raisons de performances)

Il peut ecirctre entiegraverement geacutereacute agrave partir dune interface Web (la ZMI Zope Management Interface)

Zope publie des objets Python enregistreacutes dans une base de donneacutees objet la ZODB

Des types dobjets basiques tels que des documents des images des patrons (templates) de page sont agrave ladisposition des utilisateurs pour ecirctre creacuteeacutes et geacutereacutes via linternet Des types dobjets speacutecialiseacutes tels que leswikis les blogs les galeries de photos sont disponibles

La structure de Zope est hieacuterarchique et composeacutee dobjets contenant eux-mecircmes des objets contenanteux-mecircmes agrave linfini

Ces objets se caracteacuterisent par un eacutetat deacutefini comme lensemble des valeurs de ses attributs et par uncomportement deacutecrit sous la forme de meacutethodes qui lui sont applicables

Chaque objet est identifieacute par un identifiant (id) unique qui est utiliseacute pour lindexation en ZODB

CMF (Content Management Framework )

CMF est une plateforme de gestion de contenu fournissant aux deacuteveloppeurs les outils pour construire desCMSs complexes ( comme Plone par exemple)

CMF repose sur Zope et Plone est la couche supeacuterieure de CMF

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 4

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 3: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

13 Contributions et creacutedits

Vous souhaitez contribuer

corriger des erreursbull participer agrave la structure de ce documentbull

Pour contribuer vous pouvez nous contacter par email agrave ladresse suivante mailtoplonepilotsystemsnet

Ont deacutejagrave participeacute agrave ce document

vous bull leacutequipe Pilot Systemsbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 2

14 La licence Creative Commons

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 3

2 Preacutesentation de Plone

Quest ce que Plone

Deacutefinition

Plone est un systegraveme de gestion de contenu Web Open Source publieacute selon les termes de la GNU GPL Il estconstruit au-dessus du serveur dapplication Zope et de son extension CMF (Content ManagementFramework)

Un systegraveme de gestion de contenu (en anglais Content Management System ou CMS) est une famille delogiciels de conception et de mises agrave jour dynamiques de sites web posseacutedant en particulier les fonctionnaliteacutessuivantes

permettre agrave plusieurs individus de travailler sur un mecircme documentbull fournir une chaicircne de publication (workflow) offrant par exemple la possibiliteacute de publier (mettre enligne) des documents

bull

seacuteparer les opeacuterations de gestion de la forme et du contenubull structurer le contenu (utilisation de FAQ de document de blog forum etc)bull administration via une interface webbull

Le serveur dapplications Zope

Zope est un serveur dapplication web orienteacute objet libre et eacutecrit dans le langage de programmation Python(avec quelques parties en C pour des raisons de performances)

Il peut ecirctre entiegraverement geacutereacute agrave partir dune interface Web (la ZMI Zope Management Interface)

Zope publie des objets Python enregistreacutes dans une base de donneacutees objet la ZODB

Des types dobjets basiques tels que des documents des images des patrons (templates) de page sont agrave ladisposition des utilisateurs pour ecirctre creacuteeacutes et geacutereacutes via linternet Des types dobjets speacutecialiseacutes tels que leswikis les blogs les galeries de photos sont disponibles

La structure de Zope est hieacuterarchique et composeacutee dobjets contenant eux-mecircmes des objets contenanteux-mecircmes agrave linfini

Ces objets se caracteacuterisent par un eacutetat deacutefini comme lensemble des valeurs de ses attributs et par uncomportement deacutecrit sous la forme de meacutethodes qui lui sont applicables

Chaque objet est identifieacute par un identifiant (id) unique qui est utiliseacute pour lindexation en ZODB

CMF (Content Management Framework )

CMF est une plateforme de gestion de contenu fournissant aux deacuteveloppeurs les outils pour construire desCMSs complexes ( comme Plone par exemple)

CMF repose sur Zope et Plone est la couche supeacuterieure de CMF

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 4

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 4: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

14 La licence Creative Commons

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 3

2 Preacutesentation de Plone

Quest ce que Plone

Deacutefinition

Plone est un systegraveme de gestion de contenu Web Open Source publieacute selon les termes de la GNU GPL Il estconstruit au-dessus du serveur dapplication Zope et de son extension CMF (Content ManagementFramework)

Un systegraveme de gestion de contenu (en anglais Content Management System ou CMS) est une famille delogiciels de conception et de mises agrave jour dynamiques de sites web posseacutedant en particulier les fonctionnaliteacutessuivantes

permettre agrave plusieurs individus de travailler sur un mecircme documentbull fournir une chaicircne de publication (workflow) offrant par exemple la possibiliteacute de publier (mettre enligne) des documents

bull

seacuteparer les opeacuterations de gestion de la forme et du contenubull structurer le contenu (utilisation de FAQ de document de blog forum etc)bull administration via une interface webbull

Le serveur dapplications Zope

Zope est un serveur dapplication web orienteacute objet libre et eacutecrit dans le langage de programmation Python(avec quelques parties en C pour des raisons de performances)

Il peut ecirctre entiegraverement geacutereacute agrave partir dune interface Web (la ZMI Zope Management Interface)

Zope publie des objets Python enregistreacutes dans une base de donneacutees objet la ZODB

Des types dobjets basiques tels que des documents des images des patrons (templates) de page sont agrave ladisposition des utilisateurs pour ecirctre creacuteeacutes et geacutereacutes via linternet Des types dobjets speacutecialiseacutes tels que leswikis les blogs les galeries de photos sont disponibles

La structure de Zope est hieacuterarchique et composeacutee dobjets contenant eux-mecircmes des objets contenanteux-mecircmes agrave linfini

Ces objets se caracteacuterisent par un eacutetat deacutefini comme lensemble des valeurs de ses attributs et par uncomportement deacutecrit sous la forme de meacutethodes qui lui sont applicables

Chaque objet est identifieacute par un identifiant (id) unique qui est utiliseacute pour lindexation en ZODB

CMF (Content Management Framework )

CMF est une plateforme de gestion de contenu fournissant aux deacuteveloppeurs les outils pour construire desCMSs complexes ( comme Plone par exemple)

CMF repose sur Zope et Plone est la couche supeacuterieure de CMF

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 4

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 5: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

2 Preacutesentation de Plone

Quest ce que Plone

Deacutefinition

Plone est un systegraveme de gestion de contenu Web Open Source publieacute selon les termes de la GNU GPL Il estconstruit au-dessus du serveur dapplication Zope et de son extension CMF (Content ManagementFramework)

Un systegraveme de gestion de contenu (en anglais Content Management System ou CMS) est une famille delogiciels de conception et de mises agrave jour dynamiques de sites web posseacutedant en particulier les fonctionnaliteacutessuivantes

permettre agrave plusieurs individus de travailler sur un mecircme documentbull fournir une chaicircne de publication (workflow) offrant par exemple la possibiliteacute de publier (mettre enligne) des documents

bull

seacuteparer les opeacuterations de gestion de la forme et du contenubull structurer le contenu (utilisation de FAQ de document de blog forum etc)bull administration via une interface webbull

Le serveur dapplications Zope

Zope est un serveur dapplication web orienteacute objet libre et eacutecrit dans le langage de programmation Python(avec quelques parties en C pour des raisons de performances)

Il peut ecirctre entiegraverement geacutereacute agrave partir dune interface Web (la ZMI Zope Management Interface)

Zope publie des objets Python enregistreacutes dans une base de donneacutees objet la ZODB

Des types dobjets basiques tels que des documents des images des patrons (templates) de page sont agrave ladisposition des utilisateurs pour ecirctre creacuteeacutes et geacutereacutes via linternet Des types dobjets speacutecialiseacutes tels que leswikis les blogs les galeries de photos sont disponibles

La structure de Zope est hieacuterarchique et composeacutee dobjets contenant eux-mecircmes des objets contenanteux-mecircmes agrave linfini

Ces objets se caracteacuterisent par un eacutetat deacutefini comme lensemble des valeurs de ses attributs et par uncomportement deacutecrit sous la forme de meacutethodes qui lui sont applicables

Chaque objet est identifieacute par un identifiant (id) unique qui est utiliseacute pour lindexation en ZODB

CMF (Content Management Framework )

CMF est une plateforme de gestion de contenu fournissant aux deacuteveloppeurs les outils pour construire desCMSs complexes ( comme Plone par exemple)

CMF repose sur Zope et Plone est la couche supeacuterieure de CMF

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 4

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 6: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

A quoi ressemble Plone

Ici Plone est afficheacute via la ZMI (Zope Manager Interface)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 5

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 7: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

21 Structure dun site

Preacutesentation

Un site Plone peut-ecirctre deacutecomposeacute ainsi

un ensemble de skinsbull un moteur de workflowbull un ensemble de types de contenusbull un ensemble de contenusbull

Plone est baseacute sur une architecture modulaire

CMF a introduit le concept des outils (ou tools) Il en fournit dailleurs un grand nombre Plone sappuie surces outils et en a introduit dautres pour simplifier certains concepts

Voici une liste non exhaustive des outils existant sous Plone

Portal_syndication

La syndication cest-agrave-dire le fait dexporter le contenu dans le format RSS est controcircleacutee par loutilportal_syndication Elle est utile lorsque diffeacuterents sites souhaitent eacutechanger leurs contenus

Portal_url

Loutil portal_url est un outil mis agrave disposition des deacuteveloppeurs Il permet de connaicirctre lurl delinstance Plone et des objets contenus Il ne dispose pas dinterface utilisateur

Portal_catalog

Loutil portal_catalog est la version CMF du Zcatalog precircte agrave lemploi Le vocabulaire standard estutiliseacute les index et les meacuteta donneacutees ont eacuteteacute deacutefinis pour les types de CMFDefault

Pour rappel les index sont les champs stockeacutes dans le ZCatalog pour lindexation et les meacuteta donneacutees sont lesdonneacutees qui peuvent ecirctre utiliseacutees lors de laffichage du reacutesultat

Portal_discussion

Loutil portal_discussion est responsable de la gestion des commentaires que lon peut associer agrave undocument Il deacutefinit une action reply qui est soumise agrave une condition loutil doit autoriser les commentairesCette autorisation est deacutefinie dans les types deacutefinis dans portal_types dans le champ allow Discussion

Portal_calendar

Cet outil permet de parameacutetrer le calendrier fourni avec Plone Par deacutefaut ce dernier naffiche que les objetsde type news item mais il est possible dafficher les diffeacuterents types dobjets Il suffit dutiliser longletproperties pour seacutelectionner les objets qui doivent apparaicirctre dans le calendrier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 6

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 8: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Portal_membership

Loutil portal_membership permet de controcircler lauthentification Il permet eacutegalement de controcircler lacreacuteation des reacutepertoires pour les membres De plus il deacutefinit les actions utilisateurs Les actions sont deacutetailleacuteesdans la section portal_actions Loutil portal_registration complegravete cet outil en geacuterant lenregistrement desutilisateurs

Portal_memberdata

Loutil portal_memberdata est responsable des donneacutees propres agrave lutilisateur Longlet propertiespermet de visualiser les proprieacuteteacutes disponibles pour les utilisateurs Enfin longlet content permet de connaicirctrele nombre dutilisateurs de Plone

Portal_metadata

Ce composant permet de geacuterer les meacuteta donneacutees des types preacutesents dans Plone

Portal_undo

Loutil portal_undo permet de geacuterer la fonctionnaliteacute undo de la ZODB Cette fonctionnaliteacute permetdannuler des modifications Elle est baseacutee sur un systegraveme dhistorique Loutil deacutefinit deux actions

undo cette action globale permet de lister les undo disponibles Pour visualiser les undo disponiblesil suffit de visualiser lurl httpserversiteundo_form

bull

quick_undo cette action permet aux membres deffectuer un undo sur un objetbull

Les actions sont deacutetailleacutees dans la section portal_actions

Portal_properties

Cet outil permet de geacuterer des feuilles de proprieacuteteacutes pour linstance Plone Il en existe deux

navtree_properties cette feuille permet de controcircler le slot de navigation Il est ainsi possible desupprimer certains types de laffichage de modifier lordre de cet affichage etc

bull

site_properties cette feuille contient les proprieacuteteacutes du site Elles permettent de deacutefinir la langue pardeacutefaut le format de la date le charset par deacutefaut les eacutediteurs WYSIWIG et lautorisation de creacuteationde meacutetadonneacutees

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 7

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 9: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

22 Types de contenu

Quest ce que cest

Concregravetement un type de contenu correspond agrave un certain scheacutema de donneacutees cest-agrave-dire un ensemble dechamps agrave remplir dans un formulaire

Linteacuterecirct de speacutecifier des types de contenu speacutecifiques est de bien cateacutegoriser le contenu du site de pouvoireffectuer des recherches preacutecises sur chacun des champs qui composent un type de contenu

Plone fournit en standard les types de contenu suivants

Dossier (Folder) peut contenir nimporte lequel des types suivantsbull Document (Page) texte simple HTML ou STX (Structured Text)bull Eacuteveacutenement (Event) deacutefinit un eacuteveacutenementbull Fichier (File) contenu externebull Lien (Link) hyper lien autonomebull Image (Image) tout type graphique standard (JPEG GIF PNG)bull Actualiteacute (News Item) document dateacutebull Dossier automatique (Smart Folder) dossier virtuel qui effectue une recherche sur critegraveresbull

Gracircce au produit (add-on) Archetypes il est possible de facilement deacutefinir dautres types de contenu (voir plusloin dans cette documentation)

En pratique ccedila donne quoi

On peux voir ici que lajout dun nouveau type de contenu se fait aiseacutement via un menu ajouter au dossier(add to folder) Dans cet exemplele type article nest pas un type de contenu de base Cest un type qui a eacuteteacuteajouteacute par lintermeacutediaire dun produit (Le produit RichDocument dont nous aurons loccasion de reparler)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 8

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 10: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

23 Workflows

Deacutefinition

Wikipeacutedia [] le workflow deacutecrit le circuit de validation les tacircches agrave accomplir entre les diffeacuterents acteursdun processus les deacutelais les modes de validation et fournit agrave chacun des acteurs les informations neacutecessairespour la reacutealisation de sa tacircche Pour un processus de publication en ligne par exemple il sagit de lamodeacutelisation des tacircches de lensemble de la chaicircne eacuteditoriale

Les workflows dans Plone

Plone integravegre un moteur de workflow baseacute sur des eacutetats Un exemple de ce type de workflow est un circuit depublication dun document dans un intranet

Un membre de lintranet reacutedige un document et le donne agrave valider agrave un responsable

Pendant quil reacutedige ce document le membre peut choisir de ne pas le rendre visible aux autresutilisateurs du site afin de pouvoir le modifier sans que personne ne puisse prendre en compte desinformations non deacutefinitives qui pourraient y ecirctre contenues

1

Le responsable lorsquil se connecte au site voit apparaicirctre ce document dans une liste de documentsagrave valider

Il peut publier le document sil le juge acceptable ou le rejeter (sil ne correspond pas agrave la ligneeacuteditoriale par exemple ou si plus geacuteneacuteralement il doit ecirctre corrigeacute) pour que le membre le modifie

2

Le moteur de workflow peut servir agrave deacutefinir des workflows simples ou complexes et permet de restreindre lesactions (demander la publication publier rejeter etc) possibles pour chaque eacutetat (priveacute en cours devalidation public)

Laccegraves aux contenus peut ecirctre restreint dapregraves leur eacutetat par exemple seul l auteur dun contenu pourraacceacuteder agrave un document quil a creacuteeacute et deacuteclareacute priveacute

De mecircme dans un site internet seuls les contenus valideacutes seraient accessibles agrave linternaute non authentifieacute

24 Introduction au catalogue

Le ZCatalog fournit de puissants moyens dindexation et de recherche de contenu agrave partir la ZMI UnZCatalog est un objet Zope pouvant ecirctre placeacute agrave linteacuterieur dun dossier geacutereacute via le web et pouvant ecirctre eacutetendude plusieurs faccedilons

Voici entre autres les proprieacuteteacutes du ZCatalog

Les recherches sont rapides et consomment peu de meacutemoire gracircce aux structures de donneacutees utiliseacuteesbull Les recherches sont puissantes Le ZCatalog supporte les booleacuteens les synonymes et les caractegraveresjokers

bull

Lindexation est flexiblebull Lutilisation peut se faire en dehors de Zope Le ZCatalog peut ecirctre utiliseacute dans nimporte quel scriptPython

bull

Si quelque chose se passe mal apregraves lindexation dun contenu lindex est restaureacute agrave son eacutetatpreacuteceacutedent De plus un ZCatalog peut ecirctre alteacutereacute en priveacute ce qui signifie que personne dautre ne peut

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 9

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 11: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

voir les changements effectueacutes sur lindexUne recherche renvoyant un tregraves grand nombre de concordances ne retournera pas un grand ensemblede reacutesultats Seule une partie des reacutesultats sera renvoyeacutee

bull

25 Preacutesentation du meacutecanisme de skins

Introduction aux skins

Cest le rocircle des skins que dhabiller le site chaque skin est un ensemble coheacuterent de briques fonctionnelleseacuteleacutementaires appeleacutees des layers (couches) ou sous-skins

Il peut y avoir pour un site donneacute plusieurs skins et dans ce cas lutilisateur peut choisir celui qui luiconvient

Il revient agrave ladministrateur de choisir celui par deacutefaut depuis les Properties de Ploneportal_skins

Dans ces mecircmes Properties ladministrateur peut creacuteer de nouveaux skins en deacutetaillant les layers qui lescomposent Les layers geacuteneacuteriques de Plone sont plone_content plone_styles plone_scripts et plone_templatescompleacuteteacutes par le dossier contenant les images du site plone_images

Il existe deux types de layers les objets standards de type File System Directory View et ceux de type Foldercreacuteeacutes pour personnaliser le site tels que Custom

Lordre dans lequel sont classeacutees les layers est important images scripts et templates de Custom sontprioritaires sur les objets de mecircmes noms mais contenus dans les layers placeacutes plus bas dans la liste

Alteacuteration dun skin

Ajout dun nouveau dossier dans le chemin de recherche du skinbull Personnalisation du layer dans ce nouveau dossierbull La recherche prend en compte le premier layer trouveacute le layer personnaliseacutebull Nom de dossier pour les personnalisations Custombull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 10

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 12: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 11

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 13: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

3 Page Template dans Plone

En quoi ccedila consiste

Lorsquon veut adapter un site Plone agrave ses propres besoins il est tregraves utile de savoir modifier les scripts qui lecomposent Ceux-ci sont principalement de deux types

Les scripts pythonbull Les Zope Page Templates (ZPT)bull

ZPT est un outil de geacuteneacuteration de pages web qui sappuie sur le langage TAL (Template Attribute Language)

Cest ce systegraveme qui est utiliseacute dans Plone pour creacuteer des pages au format HTML

ZPT preacutesente lavantage de mieux seacuteparer traitement et preacutesentation que ne le fait DTML (DocumentTemplate Markup Language) DTML est plus ancien que ZPT et tend agrave devenir obsolegravete Il ne sera pas abordeacutedans ce support agrave part dans la partie SGBD ougrave il est encore utiliseacute

Le langage TAL est simple et reacuteduit agrave quelques expressions Un avantage majeur est que le code est conformeXML-XHTML

Concregravetement ZPT est constitueacute de 4 composants

XML langage de description de donneacuteesbull TAL Template Attribute Languagebull TALES TAL Expression Syntaxbull METAL Macro Expansion for TALbull

TAL et METAL permettent de deacutefinir des attributs pour XML tandis que TALES permet de deacutefinir desvaleurs dattributs TAL

METAL permet de deacutefinir un bloc de code (macro) qui pourra ecirctre appeleacute ailleurs dans la mecircme page oudepuis dautres pages On retrouve un peu le mecircme principe que le define de PHP

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 12

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 14: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Quelques exemples

TAL

Le code suivant

ltp talcontent=exemplegtltpgt

signifie affiche la valeur de la variable exemple entre les tags ltpgt et ltpgt

Lexpression entre guillemets doit obeacuteir agrave la syntaxe TALES Ici elle est tregraves simple cest juste un nom devariable

TAL soccupe avant tout de la preacutesentation il est donc (volontairement) tregraves limiteacute

il ne comporte que 8 commandes define condition repeat content replace attributes omit-tag on-error

TALES

Le code suivant

lttalcontent=stringHello Worldgtltpgt

signifie affiche Hello World entre les tags ltpgt et ltpgt

Ici string est un type dexpression TALES Il en existe 6 string path python recall not exists

METAL

Le code suivant

ltmetalheader define-macro=headergt Titre image etc constant dans tout le site ltmetalheadergt

signifie deacutefinir une macro appeleacutee header contenant le haut dune page

Le code suivant

ltmetalheader use-macro=heremacro_headermacrosheadergt texte ltmetalheadergt Le contenu de la page

signifie remplacer texte par le contenu de la macro header

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 13

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 15: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

31 RappelsIntroduction agrave TAL et METAL

Le langage TAL

Cest le langage quon utilise le plus lorsquon eacutecrit des ZPT Ce langage vient se greffer dans les tags XML(ou HTML) sous la forme dattributs

Ses attributs sont de la forme talnom=valeur

TALES est le langage de deacutefinition des valeurs dattributs TAL

Exemple

ltdiv talcontent=hereobjectIdsgt

talcontent attribut TAL

hereobjectIds expression TALES

Les Commandes TAL

Voici les diffeacuterentes commandes TAL et leurs fonctions respectives

define deacutefinit une variablebull condition soumet le tag et ce quil contient agrave une conditionbull repeat reacutepegravete le tag et ce quil contientbull content affiche lexpression (en conservant le tag html)bull replace affiche lexpression (en remplaccedilant le tag html)bull attributes permet de redeacutefinir un attribut html (pex href dans un lien)bull omit-tag omet le tag si une condition est veacuterifieacuteebull on-error appelle une expression lorsquune erreur se produitbull

Il est heureusement possible dinclure plusieurs commandes dans un mecircme tag

Lordre dans lequel vous eacutecrivez les attributs TAL dans un mecircme tag naffecte pas lordre dans lequel ils sontexeacutecuteacutes En effet quelque soit lordre de vos deacuteclarations ils seront toujours effectueacutes dans cet ordre

define1 condition2 repeat3 contentreplace4 attributes5

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 14

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 16: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Exemples TAL

Remplacement

Attribut talreplace

Exemple

ltspan talreplace=hereCreatorgt Premier nom ltspangt

Affiche

John Smith

Omission conditionnelle

Attribut talcondition

Exemple

lta href=edit talcondion=notisAnongt Lien vers le formulaire deacutedition ltagt

Affiche

Affiche le lien Lien vers le formulaire deacutedition seulement dans le cas ougrave lutilisateur nest pas anonyme

Edition dattributs

Attribut talattributes

Exemple

lta talattributes=href portalabsolute_url title portalDescriptiongt Lien vers la racine du portail ltagt

donne

lta href=http title=gtLien vers la racine du portailltagt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 15

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 17: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Reacutepeacutetition

Attribut talrepeat

Exemple

ltli talrepeat=elem python[123]gt Numeacutero ampltspan talreplace=elemgt ltligt

Affiche

ltligtNumeacutero 1ltligt ltligtNumeacutero 2ltligt ltligtNumeacutero 3ltligt

Exemples TAL courants

Creacuteation dun lien vers un objet

lta talattributes=href objabsolute_url title objDescriptiongt ltimg talattributes=src objgetIcon gt ltspan talreplace=objpretty_title_or_idgt ltagt

Insertion dune image-objet

ltimg talreplace=structure objtag gt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 16

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 18: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Les expressions TALES

Il existe 3 types diffeacuterents dexpression TALES pour les ZPT

Path Expressions

path preacutefixe un chemin (path) vers la proprieacuteteacute dun objet Zope sous la forme objetproprieacuteteacute

Ainsi pathunepagetitle est un chemin vers la proprieacuteteacute title de lobjet unepage

En interpreacutetant cette expression Zope va remplacer unepagetitle par la valeur title de unepage

Remarque path est le type TALES par deacutefaut ce preacutefixe peut donc ecirctre omis

Il existe un certain nombre de noms preacutedeacutefinis pour les ZPT et qui permettent dappeler diffeacuterents objetsCitons entre autres

here correspond au contexte dacquisition Exemple heretitle affiche le titre de la pagebull context est eacutequivalent agrave herebull template correspond agrave lobjet ZPT lui-mecircmebull request correspond agrave lobjet requecircte Zserver On lutilise pour reacutecupeacuterer des variables passeacutees dans larequecircte Exemple requestparam

bull

user correspond agrave lutilisateur authentifieacutebull root correspond agrave lobjet racine de Zopebull

String Expressions

Ce type preacutefixe une chaicircne de caractegraveres Exemple stringhello world

Il est possible dinclure des variables en ajoutant un $ devant la variable

Exemple stringcette page a pour titre $heretitle

Python Expressions

python eacutevalue lexpression python et en retourne la valeur

Exemple pythonhereobjetmethode()

On peut eacutegalement lutiliser pour acceacuteder aux proprieacuteteacutes dun objet ou afficher des chaicircnes de caractegraveres

Exemples

pythonpagetitle est eacutequivalent agrave pathpagetitlebull pythonHello +nom est eacutequivalent agrave stringHello $nom (ougrave nom est type string)bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 17

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 19: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Exemples TALES courants

Ces 3 exemples affichent la mecircme chose

ltspan talcontent=heretitle_and_idgt

ltspan talcontent=string$heretitle ($hereid)gt

ltspan talcontent=pythons (s) (hereTitle()heregetId())gt

Variables de Plone

On peut acceacuteder aux variables deacutefinies par Plone via la ZMI

portal_skins gt plone_templates gt global_defines

Elles permettent dobtenir un accegraves rapide aux informations et aux outils

Quelques variables Plone

isAnonbull memberbull portalbull utoolbull object_titlebull here_urlbull workflow_actionsbull

Exemple dutilisation des variables

Cet exemple preacutesente lutilisation des variables dans un document

lthtmlgt ltbodygt Voici le template ltspan talreplace=templatetitle_or_idgt Votre navigateur est ltpre talcontent=requestHTTP_USER_AGENTgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 18

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 20: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

32 Consideacuterations dinternationalisation

Preacutesentation

Linternationalisation (i18n) est un des principes cleacutes de Plone i18n permet de traduire son site plone enplusieurs langues en inseacuterant des attributs TAL ou METAL

Il est possible de traduire agrave la fois les labels des diffeacuterents types de contenu mais aussi leurs champs ainsi queles formulaires deacutedition

Il existe 5 attributs speacutecifiques pour i18n qui sont

i18ntranslate pour le contenubull i18nattributes pour les attributsbull i18nname pour les traduction parameacutetreacuteesbull i18ndomain pour deacutefinir le domaine de traductionbull i18ndata pour tout ce qui nest pas une chaicircne de caractegraveres ( exemple un format de date )bull

Il en existe un 6egraveme i18nsource mais qui nest pas utiliseacute dans Plone

Exemple

Consideacuterons le template suivant

lthtmlgt ltbodygt ltpgtWelcome to Ploneltpgt ltimg src=plonegif alt=Plone Icon gt ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt lthtmlgt

Il y a ici plusieurs eacuteleacutements agrave traduire

Welcome to Plone qui peut-ecirctre directement traduit dans un autre langagebull Le texte Plone Icon de lattribut alt du tag imgbull La phrase There have been over 100000 downloads of Plone Ici on veut que le nombre soittoujours calculeacute dynamiquement De plus en fonction de la langue la structure de la phrase peutchanger En effet le nombre peut ecirctre placeacute en deacutebut en fin ou agrave un autre endroit de la phrase

bull

La phrase Please visit About Plone for more informationIci on veut que About Plone reste unlien et quil puisse ecirctre traduit agrave part De plus comme preacuteceacutedemment la position du lien dans laphrase peut-ecirctre diffeacuterent selon les langages

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 19

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 21: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Cas 1 Welcome to Plone

Dans ce cas on veut signifier agrave leacutequipe de traduction que la traduction agrave effectuer est une traduction simplesans texte agrave traiter speacutecialement ou qui doit ecirctre calculeacute dynamiquement

Pour faire cela on utilise lattribut i18ntranslate avec la valeur XXX agrave linteacuterieur du tag ltpgt

Exemple

ltp i18ntranslate=XXXgtWelcome to Ploneltpgt

Leacutequipe de traduction choisira un identifiant de message qui remplacera XXX pour identifier cetteexpression et qui deviendra la nouvelle valeur de lattribut i18ntranslate

Cas 2 Le texte alt de limage

Dans ce cas on a besoin de faire savoir agrave leacutequipe de traduction que cest la valeur dun attribut et non lecontenu du tag qui doit ecirctre traduit

Pour faire ccedila on utilise lattribut i18nattributes

Cet attribut liste tous les attributs du tag qui contiennent du texte devant ecirctre traduit Sil y a plus dun attributvous pouvez les seacuteparer avec un espace

Exemple

ltimg src=plonegif alt=Plone Icon i18nattributes=alt gt

Exemple avec 2 attributs

ltimg src=plonegif alt=Plone Icon title=Plone Icon Title i18nattributes=alt titlegt

Cas 3 Le contenu dynamique

La partie qui nous inteacuteresse ici est

ltpgtThere have been over ltspan talcontent=heredownload_countgt100000ltspangt downloads of Plone ltpgt ltpregt

Ici on va utiliser lattribut i18nname Cela nous donne un moyen didentifier la partie dun long morceau quidoit ecirctre traduite

Par exemple on veut que les traducteurs voient notre texte comme cela

There have been $count downloads of Plone

Ainsi ils peuvent la traduire en deacuteplaccedilant le compteur nimporte ougrave dans la phrase en fonction des besoins

En utilisant i18nname on donne un nom agrave la partie calculeacutee dynamiquement

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 20

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 22: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

ltpregt ltp i18ntranslate=gtThere have been over ltspan talcontent=heredownload_count i18nname=countgt100000ltspangt downloads of Plone ltpgt ltpregt

On remarque que name na pas besoin davoir de relation avec lexpression TAL qui le calcule De plus namedoit ecirctre unique agrave linteacuterieur dun tag

Un exemple avec plusieurs il8nname

ltp i18ntranslate=gtMy name is ltspan talcontent=herefirst i18nname=firstgtfirstltspangt ltspan talcontent=herelast i18nname=lastgtlastltspangt ltpgt ltpregt

Cas 4 Combinaison des concepts

Pour ce cas on va utiliser un meacutelange des ideacutees vues dans les cas preacuteceacutedents

On a

ltpgtPlease visit lta href=aboutgtAbout Ploneltagt for more information ltpgt

Nous voulons que les traducteurs voient

Please visit $about-plone for more information

Mais au contraire du contenu dynamique du cas preacuteceacutedent on veut que la phrase interne About Plone soitaussi traduite

Pour ce faire on insegravere un attribut i18nname autour du tag et on insegravere un attribut i18ntranslate agrave linteacuterieurmecircme du tag Ainsi les traducteurs verront que ce tag doit ecirctre traduit

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 21

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 23: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

On a donc

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate=gt About Ploneltagt ltspangt for more information ltpgt

Dans le cas ougrave on a un attribut qui doit ecirctre traduit dans le tag link ( par exemple title ) on procegravede ainsi

ltp i18ntranslate=gtPlease visit ltspan i18nname=about-plonegt lta href=about i18ntranslate= i18nattributes=title title=Go to About Pagegt About Ploneltagt ltspangt for more information ltpgt ltpregt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 22

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 24: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

33 Creacuteation dun formulaire Plone 2

Probleacutematique

En Zope classique laction dun formulaire charge un script python ou un autre formulaire

Ce mode de fonctionnement peut poser problegraveme dans les cas suivants

lorsquil y a plusieurs boutons dactionsbull lorsquil y a une erreur au traitement du formulairebull lorsquune validation des champs est neacutecessairebull

En effet comment revenir au formulaire initial Comment geacuterer diffeacuterentes actions en fonction du bouton

Le produit CMFFormController

CMFFormController est un produit dextension Zope pour le CMF

CMFFormController aide les deacuteveloppeurs en simplifiant le processus de validation des formulaires

il fournit les types suivants

Controller Page Templatebull Controller Python Scriptbull Controller Validatorbull Controller Statebull

Formulaires

Voici le code dun formulaire basique utilisant CMFFormController

ltform taldefine=errors optionsstategetErrors talattributes=action string$hereabsolute_url$templateid method=postgt ltinput type=hidden name=formsubmitted value=1 gt ltp taldefine=err errorsfoo|nothing talcondition=err talcontent=err gt ltinput type=text name=foo taldefine=val requestfoo|nothing talattributes=value val gt ltinput type=submit name=submit value=submit gt ltformgt

On remarque les choses suivantes

Le formulaire est soumis agrave lui-mecircme Tous les formulaires doivent se comporter ainsibull Une variable cacheacutee ( hidden ) speacuteciale est preacutesente formsubmitted La page template veacuterifie lobjetREQUEST pour formsubmitted pour voir si le formulaire a eacuteteacute soumis ou si on vient dy acceacuteder viaun lien par exemple Les formulaires doivent toujours contenir cette variable formsubmitted

bull

Au deacutebut du code du formulaire la variable errors est deacutefinie Elle permet entre autre au validateurdeffectuer une action particuliegravere en fonction du type de lerreur

bull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 23

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 25: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Avant dutiliser ce formulaire il est neacutecessaire de speacutecifier les validateurs utiliseacutes pour veacuterifier les valeurs duformulaire Il est eacutegalement neacutecessaire de speacutecifier laction effectueacutee apregraves la validation

Validateurs

Il existe 2 maniegravere pour speacutecifier des validateurs de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les validateurs dans le systegraveme de fichiers

On peut speacutecifier des validateurs dans le systegraveme de fichiers en utilisant un fichier de proprieacuteteacutes posseacutedantlextension metadata

Pour creacuteer un fichier metadata il suffit de creacuteer un fichier posseacutedant le mecircme nom que la page template enquestion et de rajouter lextension metadata

Si on a un Controller Page Template appeleacute document_edit_formcpt alors les proprieacuteteacutes de ce fichier devrontecirctre stockeacutees dans le fichier document_edit_formcptmetadata

Dans le fichier metadata la section concernant les validateurs aura la forme suivante

[validators] validators = validate_script1 validate_script2

Les scripts de validation validate_script1 et validate_script2 seront appeleacutes dans cet ordre

Si on souhaite que diffeacuterents validateurs soient appeleacutes en fonction du contexte du formulaire on peutproceacuteder ainsi

[validators] validators = validate_script1 validatorsDocument = validate_script2

Dans cet exemple si le contexte est un objet de type Document validate_script2 sera appeleacute Dans tout autrecas cest validate_script1 qui sera appeleacute

Supposons maintenant quon ait 2 boutons diffeacuterents dans le formulaire et quon veuille des seacutequences devalidation diffeacuterentes en fonction du bouton presseacute On peut proceacuteder de la maniegravere suivante

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

On speacutecifie ensuite les validateurs pour button1 et button2 dans le fichier metadata

[validators] validatorsbutton1 = validate_script1 validate_script3 validatorsbutton2 = validate_script2 validate_script4

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 24

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 26: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Speacutecifier les validateurs en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Validation

Longlet Validation affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des validateurs avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via unformulaire web

Les informations concernant les validateurs de tous les formulaires sont stockeacutees dans l outi lportal_form_controller de Plone

Loutil portal_form_controller possegravede des meacutethodes quon peut utiliser pour speacutecifier les validateurs dunController Page Template donneacute

portal_form_controlleraddFormValidators(id context_type button validators)

Ici id est lId du Controller Page Template context_type est le nom de la classe pour la classe de lobjetcontext button est le nom du bouton presseacute et validators est une liste de chaicircnes de caractegraveres

Si on souhaite quun validateur sapplique agrave toutes les classes on met la variable context_type agrave None Idempour les boutons

Actions

La suite de validateurs qui est exeacutecuteacutee retourne un statut dans lobjet state Le statut par deacutefaut est successcest agrave dire que si aucun validateur nest exeacutecuteacute le statut sera success Si un validateur rencontre une erreur lestatut sera failure

Il faut maintenant speacutecifier ce qui doit ecirctre fait lorsquun statut donneacute est renvoyeacute

Comme pour les validateurs il existe 2 moyens pour speacutecifier des actions de formulaire

Dans le systegraveme de fichiers1 Directement en ZMI2

Speacutecifier les actions dans le systegraveme de fichiers

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 25

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 27: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Les actions sont stockeacutees dans le mecircme fichier metadata que les validateurs La syntaxe de la section actionsest la suivante

[actions] actionsuccess = traverse_tostringscript1

Ici lorsque le formulaire est soumis et que les scripts de validation ont retourneacutes le statut successtraverse_to_action est appeleacute avec largument stringscript1 En dautres termes si les donneacutees du formulairesont valides le script script1 sera exeacutecuteacute

Il aurait aussi eacuteteacute possible de proceacuteder de la faccedilon suivante

actionsuccess = redirect_tostringhttpmy_url_here

Dans ce cas le navigateur redirigera la page vers httpmy_url_here

Il existe 4 types de transitions

traverse_tobull traverse_to_actionbull redirect_tobull redirect_to_actionbull

Les 2 premiegraveres permettent un transfert de la variable deacutetat les 2 suivantes une redirection par le navigateurmais avec perte de la variable deacutetat

Laction par deacutefaut du statut failure est de recharger le formulaire Le formulaire aura alors accegraves agrave tous lesmessages derreurs via lobjet state

Supposons que lon veuille diffeacuterentes actions en fonction du contexte du formulaire On peut proceacuteder ainsi

[actions] actionsuccess = traverse_tostringscript1 actionsuccessDocument = traverse_tostringdocument_script

Ici si le contexte est un objet de type Document document_script sera exeacutecuteacute degraves que la validation aura lestatut success Dans tous les autres cas script1 sera exeacutecuteacute

Supposons maintenant que lon ait 2 boutons diffeacuterents dans notre formulaire et que lon souhaite que desactions diffeacuterentes aient lieu en fonction du bouton presseacute On procegravede ainsi

ltinput type=submit name=formbuttonbutton1 value=First Button gt ltinput type=submit name=formbuttonbutton2 value=Second Button gt

Ensuite on speacutecifie les actions pour button1 et button2

[actions] actionsuccessbutton1 = traverse_tostringscript1 actionsuccessbutton2 = traverse_tostringscript2

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 26

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 28: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Speacutecifier les actions en ZMI

En ZMI Un Controller Page Template possegravede entre autre longlet Actions

Longlet Actions affiche tous les validateurs pour la page template en question

On peut speacutecifier ici des actions avec le mecircme niveau de speacutecialisation que preacuteceacutedemment via un formulaireweb

Les informat ions concernant les act ions de tous les formulaires sont stockeacutees dans l out i lportal_form_controller de Plone

Comme pour les validations loutil portal_form_controller possegravede des meacutethodes permettant de speacutecifier desactions

portal_form_controlleraddFormAction(id status context_type button action_type args)

action_type est le type daction qui aura lieu et args est une chaicircne de caractegraveres ( typiquement une expressionTALES ) qui sera passeacutee en argument de laction

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 27

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 29: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

34 Preacutesentation du gabarit et des macros standards

Loutil portal_skins

La partie graphique dun site Plone est geacutereacutee par loutil portal_skins Ce dernier permet aux utilisateurs du sitede choisir son aspect graphique

Cet outil permet de seacuteparer comme il se doit lapparence et le contenu du site

Le parameacutetrage de loutil portal_skins est accessible via la ZMI

Longlet Contents

Cet onglet permet dacceacuteder aux diffeacuterents reacutepertoires contenant les eacuteleacutements graphiques du site

On trouve en particulier

plone_images les images et les icocircnes Plonebull plone_templates les zpt deacutecrivant larchitecture des pages de Plonebull plone_scripts Les scripts Python utiliseacutes dans les ZPTbull plone_styles les feuilles de styles de Plonebull plone_content les pages ZPT permettant la gestion des diffeacuterents typesbull plone_forms les diffeacuterents formulaires de Plonebull plone_ecmascript les scripts javascriptsbull plone_3rdParty les autres skins de produits externesbull plone_wysiwyg le modegravele pour leacutediteur WYSIWYG ( what you see is what you get )bull custom ce reacutepertoire est extrecircmement utiliseacute lors de ladaptation dun modegravele Il est placeacute commepremier reacutepertoire lors de lacquisition Ainsi si un logo nommeacute logopng ne vous satisfait pas ilsuffit de placer dans ce reacutepertoire un autre logo avec le mecircme nom

bull

Longlet Properties

Cet onglet permet de deacutefinir les modegraveles disponibles aux utilisateurs Les modegraveles sont deacutefinis par unensemble de reacutepertoires fournissant un modegravele dacquisition

Quand une page Plone recherche un objet elle reacutealise lacquisition normalement ( cest agrave dire dans lereacutepertoire courant puis dans le reacutepertoire pegravere) puis recherche dans les chemins proposeacutes dans le modegravele

De plus cet onglet permet de deacutefinir un certain nombre de paramegravetres du site comme

le skin par deacutefaut ( Defaut skin )bull le nom du cookie chargeacute de laspect du site ( Resquest variable name )bull la possibiliteacute de choisir un skin ( Skin flexibility )bull la dureacutee de vie du cookie ( Skin persistence )bull

enfin il est possible de creacuteer ou supprimer un ou plusieurs skins un skin eacutetant composeacute dun ensemble dechemins dacquisition

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 28

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 30: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Le reacutepertoire plone_styles

Les feuilles de styles (CSS) sont une partie essentielle dans la deacutefinition dun modegravele Plone

Le reacutepertoire plone_styles contient diffeacuterents reacutepertoires correspondant aux diffeacuterents modegraveles fournis avecPlone

Ces reacutepertoires contiennent tous un objet appeleacute stylesheet_properties Cet objet stocke un certain nombre devariables et leurs valeurs associeacutees

Ces variables sont utiliseacutees par la feuille de style de Plone plonecss

Il est ainsi aiseacute aux administrateurs de deacutefinir facilement de nouvelles feuilles de styles

Lobjet stylesheet_properties

Il deacutefinit les variables utiliseacutees par la feuille de style de Plone

Pour modifier les valeurs de la feuille de style il faut utiliser le bouton customize de cet objet

Cette action a pour effet de creacuteer dans le reacutepertoire custom un reacutepertoire portant le mecircme nom et dy recopierses valeurs dans les proprieacuteteacutes du reacutepertoire

Pour deacutefinir une valeur il suffit de seacutelectionner le reacutepertoire puis longlet Properties et enfin de speacutecifier lesvaleurs

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 29

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 31: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

35 Structure dune page

Preacutesentation

Nous allons aborder ici la structure geacuteneacuterale des pages dun site plone

Visuellement lorsquon affiche une page on distingue facilement 4 parties

la partie du haut (lentecircte ou header)1 les cocircteacutes2 la partie centrale3 la zone du bas (le pied de page ou footer)4

Lentecircte

Lentecircte contient la plupart du temps un logo un petit formulaire de recherche des renseignements utiles etdes onglets de navigation

En cliquant sur le logo on retourne toujours sur la page daccueil du site

Pour faire une recherche il suffit dentrer des mots agrave rechercher puis de valider Le reacutesultat de votre recherchesera alors immeacutediatement visible dans la partie centrale

Les onglets de navigation permettent de se diriger directement dans les diffeacuterentes sections du site(Preacutesentation Accueil etc)

Les barres lateacuterales

Elles contiennent plusieurs boicirctes agrave outils ( appeleacutees portlets )

Ce qui est visible dans les menus de gauche et de droite deacutepend bien eacutevidemment du site et de sa vocationTout est bien sucircr configurable

Par exemple on peut y trouver

un calendrierbull un portlet de navigationbull un portlet affichant les modifications reacutecentesbull

La partie centrale

Cest la partie qui affiche le contenu du document que vous visualisez

Cest ici aussi quapparaicirctront les informations de certains dossiers ougrave lutilisateur a le droit de contribuerDans ce cas preacutecis de nouveaux onglets apparaissent de nouvelles actions sont possibles (il faut bien sucircr ecirctreauthentifieacute pour y avoir accegraves)

Ces onglets donnent accegraves agrave certaines fonctionnaliteacutes telles que changer leacutetat dun document ou le modifier

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 30

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 32: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

En fonction du document et des autorisations qui sont attribueacutees agrave lutilisateur certaines fonctionnaliteacutesdirectement lieacutees agrave ce document (les actions rapides) apparaissent en haut agrave droite de la partie centrale

De gauche agrave droite ces actions permettent de

afficher le flux RSS correspondantbull envoyer agrave quelquun le lien de la page par e-mailbull imprimer la pagebull basculer en mode plein eacutecranbull

Le pied de page

Il est principalement estheacutetique En fonction du type de site il est pratique dy trouver des liens pourretourner en haut de la page ou consulter le plan du site

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 31

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 33: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

4 Deacuteveloppement de nouveaux meacutecanismesPlone permet deffectuer un grand nombre de configurations de modifications et dajouts de fonctionnaliteacutes etce dans pratiquement tous les domaines de la gestion de contenu

Plone peut par exemple sinterfacer facilement avec un grand nombre de SGBDR (systegravemes de gestion de basede donneacutees)

Plone permet de recherche facilement lensemble des contenus dun site et de configurer finement cesrecherches Pour celale catalogue est agrave disposition ainsi que les smart folders (dossiers automatiques)

Lapparence dun site est eacutegalement hautement configurable notamment gracircce au concept de portlets Il estpossible de creacuteer de nouveaux portlets et de les disposer comme bon nous semble

Il est eacutegalement possible entre autres choses de deacutefinir de nouvelles actions de site et bien sucircr de geacutererfinement les utilisateurs du site

41 Requecirctes sur le catalogue

Introduction

Toutes les informations du catalogue se trouvent dans loutil portal_catalog qui est une version eacutetendue deloutil ZCatalog de Zope

Le catalogue de Plone fournit les 3 fonctionnaliteacutes suivantes

creacuteer des index de contenubull fournir des meacuteta-donneacutees sur le contenu de lindexbull fournir une interface de recherchebull

Le catalogue est intimement lieacute aux diffeacuterents contenus de votre site Plone Ainsi les objets Zope et les outilsne sont pas placeacutes dans le catalogue

Les index

Les index se trouvent sous longlet indexes du portal_catalog

Les index peuvent avoir les types suivants

DateIndex Pour indexer les dates et faire des recherches baseacutees sur les dates et les heuresbull DateIndexRange Plus puissant que DateIndex permet de faire des recherches sur 2 dates en mecircmetemps

bull

FieldIndex Permet de traiter automatiquement les reacutesultats et autorise la recherche de ce que lindexpeut contenir

bull

KeywordIndex Prend plusieurs mots-cleacutes et les seacutepare en diffeacuterents mots Retournera un reacutesultat si aumoins 1 mot-cleacute correspond agrave la requecircte

bull

PathIndex Pour indexer le chemin dun objetbull TextIndex Pour indexer du texte Plus ancien que ZCTextIndexbull TopicIndex Pour creacuteer des reacutesultats preacutedeacutefinis Utile dans le cas ougrave une requecircte est souvent appeleacuteebull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 32

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 34: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

ZCTextIndex Plus reacutecent que TextIndex ce type fournit une recherche efficace sur des morceauxentiers de texte

bull

Par deacutefaut un certain nombre dindex sont preacutesents dans Plone en voici quelques-uns

Nom Type Description

Creator FieldIndex Le nom dutilisateur de la personne qui a creacuteeacute lobjet

AllowedRolesAndUsersKeywordIndexLes personnes pouvant voir le contenu

review_state FieldIndex Leacutetat dun objet dans le workflow

Title TextIndex Le titre dun objet

Les Meacuteta-donneacutees

Lorsque le catalogue renvoit un reacutesultat il ne renvoit pas directement un objet mais les meacuteta-donneacuteescontenues dans le catalogue

Ces meacuteta-donneacutees sont en fait une seacuterie de champs existants pour chaque valeur dun objet

Voici quelques meacuteta-donneacutees par defaut

Nom Description

CreationDateLa date de creacuteation dun objet

Creator Le nom dutilsateur de la personne ayant creacuteeacute lobjet

ExpiresDate La date dexpiration de lobjet

end Pour les objets de type event la date de fin de levent

getId Lid de lobjet

Reacuteeindexer le contenu dun site

Il est parfois neacutecessaire de reacuteeindexer lensemble du contenu dun site apregraves avoir installeacute un nouveau produitpar exemple

Pour ce faire dans portal_catalog cliquez sur Advanced puis sur Update Catalog

Attention cette opeacuteration peut prendre beaucoup de temps et utilser beaucoup de ressources

Recherches dans le catalogue exemples

Le meilleur moyen pour faire des recherches est dutiliser un script python Cependant il est eacutegalementpossible de le faire agrave partir templates

On utilisera la meacutethode searchResults sur lobjet portal_catalog

- premier exemple

contextportal_catalogsearchResults( review_state = published SearchableText = Plone sort_order=Date )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 33

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 35: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Cette recherche renvoit lintersection des reacutesultats de chaque index Elle affichera donc les items publieacutesmentionnant Plone

Remarque sort_order est un paramegravetre reacuteserveacute conditionnant lordre daffichage Il existe un certain nombrede paramegravetres reacuteserveacutes en fonction du type de lindex

- deuxiegraveme exemple

results = contextportal_catalogsearchResults( Type = Image )

Ce code permet de rechercher toutes les images dun site

- troisiegraveme exemple

from DateTime import DateTime start = DateTime(20060401 ) end = DateTime(20060412 ) results = contextportal_catalogsearchResults( Type = News Item CreationDate = query [ start end ] range minmax )

Cet exemple recherche tous les eacutevegravenements du mois de deacutecembre

Remarque minmax est un paramegravetre reacuteserveacute Il permet de preacuteciser que les valeurs de CreationDate doivent setrouver entre start et end

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 34

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 36: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

42 Requecirctes sur un SGBDR

Introduction

Par deacutefaut Plone stocke ses donneacutees dans la base de donneacutees de Zope la ZODB (Zope Object DataBase) unebase de donneacutees orienteacutee-objet particuliegraverement adapteacutee aux applications de gestion de contenu

Cependant dans certains cas il est preacutefeacuterable ou neacutecessaire de stocker les donneacutees sur un systegraveme de fichiersou dans une base de donneacutees relationnelle

La plupart des grands SGBDR du marcheacute sont connectables agrave Zope et par conseacutequent agrave Plone Cesconnecteurs sont geacuteneacuteralement libres (MySQL PostgreSQL mecircme Oracle) dautres sont payants enadeacutequation avec la politique de leacutediteur concerneacute (Microsoft SQL Server et Access)

Concepts geacuteneacuteraux

Les adaptateurs sont des interfaces ils permettent dabstraire une impleacutementation speacutecifique Ce sont eux quifont la liaison entre lapplication Zope et les diffeacuterentes bases de donneacutees

Les meacutethodes ZSQL fournissent les moyens de traiter les programmes SQL en tant quobjets qui peuvent ecirctreutiliseacutes pour publier des donneacutees provenant de bases de donneacutees et creacuteer des applications Zope avanceacutees

Les meacutethodes ZSQL sont appeleacutees dans lapplication Zope via des templates ou des scripts

Les adaptateurs fournissent des objets de type de connexions qui permettent un accegraves agrave une base de donneacuteesparticuliegravere dans Zope Ce sont les connexions qui gegraverent les transactions Un adaptateur est un produit ZopeIl se place donc dans le reacutepertoire Products de linstance

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 35

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 37: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Il peut y avoir plusieurs connexions par instance de Zope Elles sont configurables en ZMI et utiliseacutees via lesmeacutethodes ZSQL

Les scripts accegravedent aux connexions via les meacutethodes ZSQL

Il existe des adptateurs pour la plupart des SGBDR courants

ODBC (mxODBC ODBCDA)bull MySQL (ZMySQLDA)bull PostgreSQL (ZPgSQLDA)bull Sybase (ZSybaseDA)bull Oracle (ZOracleDA)bull SQL Server via ODBCbull

Les meacutethodes SQL sont un type universel compatible avec tous les types de bases de donneacutees

En pratique une requecircte ZSQL est composeacutee de code DTML et de code SQL Les constructions dynamiquessont possibles Les reacutesultats dun requecircte sont renvoyeacutes sous forme dune seacutequence python Ils sontexploitables avec une boucle for in ou avec lattribut talrepeat par exemple

Exemples

Creacuteation dune table

create table contacts ( nom varchar prenom varchar mail varchar numero integer )

Ajout de valeurs dans cette table via un formulaire

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=result_htmlgt Nomltinput type=text name=nomgt Prenomltinput type=text name=prenomgt Mailltinput type=text name=mailgt Numeroltinput type=text name=numerointgt ltinput type=submitgt ltformgt ltdivgtlthtmlgt ltpregt

Le mecircme ajout de valeurs via une meacutethode ZSQL

insert into contacts (nom prenom mail numero) values (ltdtml-sqlvar nom type=stringgt ltdtml-sqlvar prenom type=stringgt ltdtml-sqlvar mail type=stringgt ltdtml-sqlvar numero type=intgt )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 36

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 38: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Lors de leacutedition de cette meacutethode en ZMI il est neacutecessaire de speacutecifier les arguments nom prenom mailnumero dans le champ correspondant

Page de traitement dajout de valeur

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt lttalblock taldefine=empty python hereaddNewRecord(nom=request[nom] prenom=request[prenom] mail=request[mail] numero=request[numero] talon-error=stringErreur survenuegt Les donneacutees ont eacuteteacute ajouteacutees lttalblockgt ltdivgt lthtmlgt

Formulaire de recherche

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt ltform action=search_htmlgt Nom agrave chercher ltinput type=text name=nomgt ltinput type=submitgt ltformgt ltdivgt lthtmlgt

Ceci est un formulaire de recherche par nom

Requecircte de recherche par nom

select from contacts where nom=ltdtml-sqlvar nom type=stringgt

Lagrave encore speacutecifier nom en argument dans la ZMI

Reacutesultat de la recherche par nom

lthtml metaluse-macro=heremain_templatemacrosmastergt ltdiv metalfill-slot=maingt Reacutesultat lttablegt lttr talrepeat=item pythonheresearchByName(nom=request[nom])gt lttd talcontent=itemnomgt lttd talcontent=itemprenomgt lttd talcontent=itemmailgt lttd talcontent=itemnumerogt lttrgt lttablegt ltdivgt lthtmlgt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 37

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 39: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

43 Creacuteation dun portlet

Introduction

La creacuteation et lajout de portlet sont des actions relativement simples

Pour creacuteer un portlet il est neacutecessaire dutiliser un template avec une macro ( METAL ) agrave linteacuterieur

Le code de base pour un template de porlet est le suivant

ltdiv metaldefine-macro=portletgt ltdl class=portletgt ltdt class=portletHeadergtTitre du portletltdtgt ltdd class=portletItemgt lt-- Le code se trouve ici --gt ltddgt ltdlgt ltdivgt

Pour ajouter un portlet en ZMI allez agrave la racine de votre site Plone puis cliquez sur properties

En fonc t ion de l endro i t ougrave vous vou lez que vo t re por t le t so i t a f f i cheacute vous a jou te rezherele_nom_de_votre_portletmacrosportlet dans right_slots ou left_slots

Remarque lordre des deacuteclarations des portlets correspond agrave lordre de leur affichage

Exemple

Voici le code complet dun portlet de recherche

lthtml xmlnstal=httpxmlzopeorgnamespacestal xmlnsmetal=httpxmlzopeorgnamespacesmetal i18ndomain=plonegt

ltbodygt

ltdiv metaldefine-macro=portlet talomit-tag=gt

ltdl class=portlet id=portlet-searchgt

ltdt class=portletHeadergtRechercheltdtgt

ltdd class=portletItemgt

ltfieldset style=text-alignright border 0gt

ltform name=searchform action=search talattributes=action string$portal_urlsearch gt ltlabel for=searchGadget class=hiddenStructure i18ntranslate=text_searchgtSearchltlabelgt ltinput id=searchGadget name=SearchableText type=text size=20 value=

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 38

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 40: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

alt=Search title=Search accesskey=accesskeys-search i18nattributes=alt accesskey title talattributes=value requestSearchableText|nothing tabindex tabindexnext class=visibilityvisible gt ltinput class=searchButton type=submit value=Search accesskey=accesskeys-search talattributes=tabindex tabindexnext i18nattributes=value accesskey style=margin-top 06emgt ltformgt ltfieldsetgt ltddgt ltdlgt ltdivgt ltbodygt

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 39

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 41: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

44 Deacutefinition dune action de site

Quest ce que cest

Les actions deacutesignent des liens ( des url donc ) deacuteclenchant une action

Il existe diffeacuterentes cateacutegories dactions

Les actions globales elles sont deacutefinies quelque soit le contextebull Les actions locales elles permettent dassocier des actions agrave des types de contenus ou des workflowsbull

Dougrave proviennent ces actions

Le portal_actions gegravere non seulement ses propres actions mais aussi celles des autres objets posseacutedant desactions et figurant dans son onglet Actions providers

Le portal_action est le produit responsable de geacuterer toutes les actions dun site CMFPlone Cest lui parexemple qui est responsable des onglets du portail (welcome search news etc) ou des boutons dufolder_contents qui permettent de copier coller supprimer des objets dun dossier et tant dautres

Deacutecomposition dune action

Une action se deacutecompose en 7 champs

Name son libelleacute1 Id son identifiant2 Action Lexpression geacuteneacuterant notre lien3 Condition une condition qui si elle se veacuterifie fera que notre lien saffiche ( en python )4 Permission luser pour lequel on affichera laction devra avoir cette permission Sinon laction ne serapas afficheacutee

5

Category un identifiant commun agrave nos actions qui nous permettra de les retrouver parmi toutes lesactions

6

Visible Permet de masquerafficher temporairement ou deacutefinitivement une action7

Les types dactions

Onglets de site portal_tabs1 Actions de site site_actions2 Boutons de dossier folder_buttons3 Actions de document document_actions4 Onglets de contenu object_tabs5 Actions de dossier et de contenu folder object6 Transitions de workflow workflow7

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 40

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 42: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

45 Gestion des utilisateurs

Pour geacuterer les utilisateurs et leurs permissions sur les objets Plone utilise une combinaison de rocircles rocircleslocaux et workflows baseacutes sur Zope

Permissions et Rocircles

Les permissions permettent de speacutecifier ce quun utilisateur peut faire et ne peut pas faire dans un contextedonneacute

On peut se les repreacutesenter en tant que barriegraveres permettant ( ou pas ) dacceacuteder agrave des meacutethodes des scriptsdes templates ou des transitions de workflow

Les permissions les plus courantes sont

Viewbull Modify portal contentbull Access contents informationbull List folder contentsbull

Les permissions sont relieacutees aux rocircles des utilisateurs et non aux utilisateurs eux-mecircmes Ainsi dans undossier quelconque toute personne ayant le rocircle RandomRole possegravede la permission Modify portal content

Les rocircles par deacutefaut sont

Memberbull Managerbull Reviewerbull

Il existe eacutegalement des rocircles automatiques

Ownerbull Anonymousbull

Le rocircle Anonymous est donneacute aux utilisateurs neacutetant pas loggeacutes sur le site

Owner sapplique uniquement lorsque lutilisateur est le possesseur ( owner ) dun contenu

En ZMI presque tous les objets possegravedent un onglet Security

Cest ici quon voit les permissions associeacutees aux rocircles

La case Acquire permission settings si elle est cocheacutee indique que le rocircle donnant cette permission est lemecircme que celui de lobjet parent

On utilise le formulaire en bas de la page de longlet Security pour ajouter et supprimer des rocircles

On peut assigner des rocircles aux utilisateurs manuellement en utilisant le dossier acl_users placeacute agrave la racine delinstance de Plone ( pas celui de la racine de la ZMI )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 41

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 43: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Les groupes

Plone ajoute le concept de groupes dutilisateurs au modegravele de seacutecuriteacute de base de Zope

Lutilisation de groupes est un moyen efficace permettant de geacuterer les rocircles ( et donc les permissions ) pourplusieurs utilisateurs simultaneacutement

Les groupes sont geacutereacutes directement dans plone dans la partie users and groups administration dans plonesetup

On peut donner un ou plusieurs rocircles agrave un groupe si neacutecessaire Dans ce cas tous les utilisateurs appartenant agravece groupe heacuteriteront automatiquement du ou des rocircles de celui-ci

Les rocircles locaux et le partage

Il est souvent utile de donner agrave un utilisateur ou agrave un groupe des permissions speacutecifiques uniquement sur unepartie preacutecise du site

Dans Plone longlet sharing ( partage ) permet de donner aux utilisateurs diffeacuterentes permissions dansdiffeacuterentes zones

La seacutelection des rocircles sacquiert par le bas Cela signifie que si un utilisateur a le rocircle de Manager sur ledossier un_dossier alors il la aussi pour un_dossierdocumentsun_document

Workflows

Dans la plupart des cas lutilisation de worklfows est le meilleur moyen de geacuterer les permissions sur lecontenu

On utilise pour cela loutil portal_workflow

cf le chapitre sur les worklfows

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 42

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 44: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

46 Dossiers automatiques (smart folders)

Preacutesentation

Les smart folders sont une nouveauteacute de Pone 21 Ils permettent dacceacuteder directement au reacutesultat dunerecherche sauvegardeacutee Cette recherche est mise agrave jour automatiquement

Il est possible de deacutefinir les critegraveres de recherche que lon souhaite et de speacutecifier la faccedilon dont les reacutesultatsseront afficheacutes

Ainsi gracircce agrave lutilisation dun smart folder il est par exemple possible d afficher en un simple clic lensembledes images ajouteacutees par lauteur Toto classeacutees par date dajouts avec 10 reacutesultats par pages

Creacuteation dun smart folder

Un smart folder sajoute simplement comme tout autre type de contenu standard de Plone

Il possegravede les champs suivants

Titrebull Descriptionbull Limite des reacutesultats de la recherche Si la case est cocheacutee alors seuls les X premiers eacuteleacutements serontafficheacutes ougrave X correspond au champ Nombre deacuteleacutements

bull

Nombre deacuteleacutements Le nombre deacuteleacutements afficheacutes par pagebull Utiliser une vue personnaliseacutee Si la case est cocheacutee laffichage des reacutesultats sera sous forme duntableau avec les champs seacutelectionneacutes dans Champs de la vue personnaliseacutee Sinon la vue classique dePlone est utiliseacutee

bull

Champs de la vue personnaliseacutee permet de speacutecifier les champs agrave afficher si loption Utiliser une vuepersonnaliseacutee est activeacutee

bull

Les critegraveres de recherche

Une fois le smart folder ajouteacute il faut speacutecifier les critegraveres de recherche

Pour cela on clique sur longlet critegraveres

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 43

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 45: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Il suffit ensuit de seacutelectionner les critegraveres de recherche en ajoutant des champs (titre creacuteateur date decreacuteation lieu description type eacutetat )

Certains champs possegravedent plusieurs valeurs possibles Par exemple le champ type a comme valeurs possibles document fichier image dossier lien

Enfin il est possible de speacutecifier lopeacuterateur booleacuteen (etou) permettant dassembler les tests sur chaque valeur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 44

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 46: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

5 Creacuteation dun nouveau type de contenu

Principe

Plone fournit de nombreux types de contenu standards

Imagebull Filebull Linkbull Folderbull Smart Foldersbull Eventbull newsbull

Mais parfois cela nest pas suffisant ou ne convient pas parfaitement agrave ce que lon souhaite faire Il est alorspossible de creacuteer de nouveaux types de contenus en partant de zeacutero ou en heacuteritant de fonctionnaliteacutes de typesexistant

Par exemple si je souhaite disposer dun forum sur mon site je peux limpleacutementer moi-mecircme en creacuteant lestypes suivants

Un type Forum qui aura plus ou moins les mecircmes proprieacuteteacutes quun dossier et qui pourra contenir desobjets de type Thread

bull

Un type Thread correspondant agrave une discussion et qui contiendra donc des objets de type Postbull Un type Post correspondant agrave un message sur le forumbull

51 Preacutesentation dArchetypes

Preacuteliminaire Les produits Zope

Un produit Zope ( Product ) est un ensemble de

Modules pythonbull Ressources (images objets zope)bull Documentationsbull

Il est plutocirct avantageux dutiliser un produit dans les cas suivants

Lorsquon a un problegraveme reacutecurrent dun projet agrave un autrebull Lorsquon veut faire un paquetage dun site ( pour une livraison par exemple )bull Lorsquon veut impleacutementer des solutions techniques complexes telles que

Un site multilinguediams Des algorithmes complexesdiams Des types dobjets personnaliseacutes ( le cas qui nous inteacuteresse ici )diams

bull

Les Caracteacuteristiques principales des Produits sont

Le partage de briques logiciellesbull La reacuteutilisabiliteacute des briquesbull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 45

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 47: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

La maintenabiliteacutebull La seacutecuriteacutebull

Exemple Un produit minimal

Lobjectif de cet exemple deacutefinir un type dobjet qui affiche un message agrave sa publication

Il est donc neacutecessaire davoir les 2 eacuteleacutements suivants

Un script python chargeacute dafficher le messagebull Une vue de preacutesentation en ZPT permettant cet affichagebull

class ZhelloWorld

def getMessage(self) return Hello World

Les produits se placent dans le sous-reacutepertoire Products de linstallation Zope ou de linstance

Ici on aura donc un reacutepertoire MyMinimalProduct avec les fichiers

ZHelloWorldpy la deacutefinition de la classe ZhelloWorldbull skinshelloworldhelloworld_viewpt le template chargeacute de laffichagebull

Le produit Archetypes

Archetypes est un produit Zope qui simplifie la creacuteation de nouveaux types de contenu

Un type de contenu peut ecirctre par exemple un document un eacutevegravenement une image ou nimporte quel autreobjet pouvant ecirctre ajouteacute dans un site Plone

Archetypes a lavantage de neacutecessiter de la part du programmeur moins de deacuteclarations et dinitialisations

Archetypes possegravede des vues par deacutefaut eacutedition vue

Il est possible eacutegalement gracircce agrave Archetypes de geacuteneacuterer automatiquement des types directement agrave partir dediagrammes UML (Unified Modeling Language )

52 Deacutefinition dun type et de ses vues

Le Scheacutema dun type

Dans Archetypes un scheacutema peut se deacutefinir comme une structure dobjets Cette structure speacutecifie quelsattributs existent pour un type de contenu donneacute

Un scheacutema contient de nombreux champs (fields) chaque champ eacutetant un attribut titre une date dexpirationune description un document attacheacute Un champ possegravede un type string text integer

Chaque champ possegravede un widget Un widget est une repreacutesentation visuelle dun champ dans linterfaceutilisateur

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 46

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 48: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Par exemple un champ string peut ecirctre afficheacute sous forme de choix dans une liste deacuteroulante ou dans une listede boutons radios En deacutefinissant un widget pour ce champ on peut deacutefinir exactement laffichage du widget

Le scheacutema suivant repreacutesente les relations entre un scheacutema les champs et les widgets associeacutes

Dans Archetypes le scheacutema de base est BaseSchema Il contient les 2 eacuteleacutements que tout type de contenupossegravede dans Plone

Un titrebull Un IDbull

Les scheacutemas peuvent ecirctre composeacutes avec lopeacuterateur +

Exemple

schema = BaseSchema + Schema(( StringField(acutemessageacute widget = StringWidget(label = acuteMessageacute description = acuteIntroduire un message ici acute ) ) ))

Les Champs dun scheacutema

Un champ est lassociation dun type et de proprieacuteteacutes

Voici quelques proprieacuteteacutes dun champ

name obligatoire un nom unique pour le champbull widget le widget utiliseacute pour afficher le champbull required True ou False Speacutecifie si au moins une valeur dun champ est requisebull searchable True ou False Speacutecifie si le champ est utilisable dans les recherchesbull default default_method Speacutecifie les valeurs par deacutefaut dun champbull vocabulary Une liste de valeurs agrave choisir ex [rouge vert bleu]bull enforceVocabulary True ou False Seules sont accepteacutees les valeurs speacutecifieacutees dans vocabularybull

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 47

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 49: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Les Widgets

Un widget contient les informations concernant la maniegravere dont lobjet sera repreacutesenteacute visuellement

StringWidget Une simple boicircte en HTML permettant de rentrer une chaicircne de caractegraveresbull DecimalWidget idembull IntegerWidget idembull ReferenceWidget Une seacutelection deacuteleacutements en HTML parmi une liste de reacutefeacuterences possiblesbull ComputedWidget Retourne la valeur calculeacutee en HTMLbull TextAreaWidget RichWidget Une zone de texte permettant lupload du contenu dans de nombreuxformats

bull

BooleanWidget Affiche 2 cases agrave cocher pour les valeurs possiblesbull SelectionWidget MultiSelectionWidget KeywordWidget Des widgets de seacutelectionbull FileWidget ImageWidget Un eacuteleacutement permettant duploader un fichierbull LabelWidget IdWidget PasswordWidgetbull

Exemples

StringField(acutefruitacute vocabulary = [Apple Orange Mano Banana] widget = SelectionWidget(label= Favourite Fruit))

ImageField(acuteportraitacute widget = ImageWidget(label= My picture))

TextField(acutebodyacute searchable = 1 primary = 1 default_output_types = acutetexthtmlacute allowable_content_types = (acutetextplainacute acutetextstructuredacute acutetextrestructuredacute acutetexthtmlacute ) widget = RichWidget(label = acuteBodyacute ))

Validation

Il peut saveacuterer tregraves utile deffectuer plusieurs validations afin de tester que les valeurs du type de contenusoient correctes

Pour faire cela il suffit dajouter un paramegravetre de validation au champ

Par exemple si on veut veacuterifier quun champ IntegerField est vraiment un integer on peut proceacuteder ainsi

from ProductsArchetypespublic import IntegerField from ProductsArchetypespublic import IntegerWidget

age = IntegerField(acuteageacute validators = (isInt) widget=IntegerWidget(label=Your age) )

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 48

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 50: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Ci-dessous quelques validations disponibles

isDecimal Sassure que la chaicircne de caractegraveres est un deacutecimal incluant valeurs positives neacutegatives etexponentielles

bull

isInt Sassure quil sagit bien dun entierbull isPrintable Sassure quil sagit bien dune lettre ou dun nombrebull isURL Sassure que lentreacutee commence par http https ou ftpbull isEmail Sassure de la conformiteacute de la syntaxe standard e-mailbull

Remarque il est eacutegalement possible de creacuteer ses propres validations

53 Cas dutilisation RichDocument

Introduction

RichDocument par rapport agrave un type pagedocument standard de Plone apporte les fonctionnaliteacutes suivantes

possibiliteacute dajouter des images ou des fichiers attacheacutes directement agrave linteacuterieur du document agrave partirde longlet edit

bull

geacuteneacuteration automatique de miniatures (thumbnails) agrave partir dimages uploadeacuteesbull

Structure du produit

RichDocument eacutetend la classe ATDocument de ATContentTypes Le contenu du produit RichDocument est lesuivant

___init__py configpy

interfaces interfacesrichdocumentpyltbrgt content content__init__py contentattachmentspy contentrichdocumentpyltbrgt widgets widgets__init__py widgetsattachmentspy widgetsimagespyltbrgt ExtensionsInstallpy Extensionsutilspyltbrgt skins skinsRichDocument skinsattachment_widgets

Remarque la plupart des produits ont la mecircme structure

__init__py

Ce fichier est exeacutecuteacute lorsque Zope charge le produit RichDocument Il contient le code qui initialisera leproduit Il enregistre eacutegalement FileSystemDirectoryViews du dossier skins Cela signifie quune foisRichDocument installeacute portal_skinsRichDocument fera reacutefeacuterence au dossier skinsRichDocument parexemple

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 49

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 51: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

configpy

Ce fichier contient les constantes de configuration incluant le nom du produit et les permissions dajout decontenu agrave utiliser

interfaces folder

Ce dossier contient les interfaces deacutefinies pour ce produit Linterface IRichDocument eacutetend linterfaceIDocument dATContentTypes Deacuteclarer des interfaces nest pas strictement neacutecessaire

content folder

Ce dossier contient les types de contenu en question Le fichier richdocumentpy contient le typeRichDocument tandis que attachementspy contient les types ImageAttachment et FileAttachment Le script__initpy__ charge ces fichiers de telle maniegravere quon puisse importe RichDocument en eacutecrivant

from ProductsRichDocument import RichDocument

widgets folder

Ce dossier contient les widgets quutilise RichDocument dans un module initialiseacute par __initpy__ de la mecircmefaccedilon que content__initpy__ RichDocument utilise deux widgets assez complexes qui utilisent des actionsde controcircle de formulaire (form controller actions) pour supporter lupload et la gestion dimages et de fichiersattacheacutes

Extensions folder

Ce dossier contient les meacutethodes externes dinstallation Le fichier Installpy est lu par loutil QuickInstallerdans Plone Ses meacutethodes install() et uninstall() sont exeacutecuteacutees quand le produit est installeacute ou deacutesinstalleacute Lefichier utilspy contient dautres meacutethodes additionnelles appeleacutees agrave partir de la meacutethode principale install()

skins folder

Le processus dinstallation standard sassure que les dossiers skinsRichDocument et skinsattachment_widgetsont enregistreacutes avec portal_skins

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 50

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 52: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Etendre ATContentTypes

La plupart des choses importantes se trouvent dans le dossier contentfolder

Ci-dessous on peut voir le contenu du fichier contentrichdocument

En premier lieu le scheacutema du document est deacutefini On copie dabord le scheacutema dATDocument Faire unecopie est important car en cas de modifications ulteacuterieures sur le scheacutema il est possible de modifier parinadvertance le scheacutema standard ATDocument

Apregraves la copie on peut ajouter nos propres champs

RichDocumentSchema = ATDocumentschemacopy() + Schema((

BooleanField(displayImages default=False languageIndependent=1 widget=ImagesManagerWidget( description=If selected a list of uploaded images will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayImages i18n_domain=RichDocument label=Display images download box label_msgid=RichDocument_label_displayImages ) )

BooleanField(displayAttachments default=True languageIndependent=1 widget=AttachmentsManagerWidget( description=If selected a list of uploaded attachments will be presented at the bottom of the document to allow them to be easily downloaded description_msgid=RichDocument_help_displayAttachments i18n_domain=RichDocument label=Display attachments download box label_msgid=RichDocument_label_displayAttachments ) )

))

On utilise ici BooleanFields avec les widgets ImagesManagerWidget et AttachementsManagerWidget (situeacutesdans le dossier widgets) Le champ booleacuteen est utiliseacute pour deacuteterminer si une boicircte de download pour lesimages et les fichiers attacheacutes sera afficheacutee en bas de la vue de la template

Apregraves la deacutefinition du scheacutema on appelle la meacutethode finalizeATCTSchema

finalizeATCTSchema(RichDocumentSchema)

Maintenant que le scheacutema est en place deacutefinir la classe de contenu est aiseacute On remarque quelle heacuterite agrave lafois de OrderedBaseFolder et de ATDocument

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 51

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 53: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

class RichDocument(OrderedBaseFolder ATDocument) A document which may contain directly uploaded images and attachments

Standard content type setup portal_type = meta_type = RichDocument archetype_name = Richdocument content_icon = RichDocumentgif schema = RichDocumentSchema typeDescription= Adocument which can contain rich text images and attachments typeDescMsgId =RichDocument_description_edit

Pour sassurer quon soit capable dajouter des images et des fichiers attacheacutes aux documents RichDocument ilest neacutecessaire de preacutevenir Archetypes que ce sont des types de contenu autoriseacutes

Ci-dessous la deacutefinition de ImageAttachement et FileAttachement

allowed_content_types = [ImageAttachment FileAttachment]

Maintenant la deacutefinition de la vue par deacutefaut et des vues suppleacutementaires

default_view = richdocument_view immediate_view = richdocument_view suppl_views = (richdocument_view_preview richdocument_view_float)

Il est neacutecessaire de dire agrave Zope quelles interfaces on impleacutemente On utilise celle dATDocument mais aussiINonStructuralFolder de Plone et IRichDocument deacutefinie dans interfacesrichdocumentpy

__implements__ = ATDocument__implements__ + (IRichDocument INonStructuralFolder)

Les actions dans Plone permettent de deacutefinir des liens Les onglets verts (view edit) correspondent agrave desactions sur un type de contenu Pour sassurer que lon a les mecircmes actions que le type documentpagestandard on fait

actions = ATDocumentactions

Finalement on enregistre le type avec Archetypes

registerType(RichDocument)

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 52

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 54: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Etendre les autres types

Pour sassurer quon puisse controcircler le workflow ainsi que les autres aspects des types images et fichiersattacheacutes indeacutependamment des types Image et Fichier standarts de Plone on fournit les types ImageAttachmentet FileAttachment qui eacutetendent leurs eacutequivalents ATContentTypes

Ces types sont deacutefinis dans le fichier contentatachementspy

class FileAttachment(ATFile) A file attachment portal_type = meta_type = FileAttachment archetype_name = File attachment content_icon = file_icongif typeDescription= A file attached to a document typeDescMsgId = FileAttachment_description_edit global_allow = 0

default_view = fileattachment_view immediate_view = fileattachment_view suppl_views = ()

__implements__ = ATFile__implements__ actions = ATFileactions

registerType(FileAttachment)

class ImageAttachment(ATImage) An image attachment portal_type = meta_type = ImageAttachment archetype_name = Image attachment content_icon = image_icongif typeDescription= An image attached to a document typeDescMsgId = ImageAttachment_description_edit global_allow = 0

default_view = imageattachment_view immediate_view = imageattachment_view suppl_views = ()

__implements__ = ATImage__implements__ actions = ATImageactions

registerType(ImageAttachment)

On deacutesactive la variable global_allow pour sassurer quils puissent ecirctre ajouteacutes uniquement agrave linteacuterieur dunRichDocument

Utilisation de classes combineacutees (Mix-in classes)

En fait il nest pas neacutecessaire deacutetendre un type entier ATContentTypes est diviseacute en classes combineacutees quelon peut utiliser dans nos propres types fournissant les reacuteglages et les meacutethodes pour diffeacuterentes classes detypes de contenu Elles sont deacutefinies dans le fichier ATContentTypescontentbasepy

ATCTMixin

Fournit les reacuteglages FTI (Factory Type Information) standards et les meacutethodes de base pour tous les typesATContentTypes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 53

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 55: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

ATCTContent

Une classe de base pour tous les contenus ATContentTypes Elle combine ATCTMixin et BaseContentdArchetypes

ATCTFileContent

Speacutecialisation dATCTContent qui peut se comporter comme une classe de base pour les fichiers pouvant ecirctreteacuteleacutechargeacutes directement par le navigateur sans en afficher le contenu dans Plone

ATCTFolder

Speacutecialisation dATCTContent pour les types de contenus devant se comporter comme un dossier Plone

ATCTOrderedFolder

Alternative agrave ATCFolder qui autorise lordonnancement manuel de contenus ATFolder utilise cette classe debase

ATCTBTreeFolder

Alternative agrave ATCFolder qui autorise les dossiers agrave contenir un tregraves grand nombres dobjets (des milliers) Lesdossiers Btree sont plus efficaces mais en contrepartie ils perdent certaines fonctionnaliteacutes

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 54

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 56: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

6 Personnalisation de workflowLa gestion de workflow est un des points forts de Plone Il est possible de configurer entiegraverement le workflowpour quil soit adapteacute au flux de publication souhaiteacute

Loutil portal_workflow de Plone permet de tout configurer finement

61 Creacuteation dun nouvel objet workflow deacutefinition des eacutetats ettransitions

La personnalisation ou lajoutsuppression de workflows se fait en ZMI via portal_workflow

Un workflow est en fait un objet Zope

Les workflows standards sont

folder_workflow pour les dossiersbull plone_workflow pour les contenusbull

Un workflow est constitueacute deacutetats et de transitions

eacutetat Un eacutetat possegravede un intituleacute et des permissions associeacutees

transition Une transition possegravede un intituleacute et une condition Une transition deacutefinit ce qui permet de passerdun eacutetat agrave un autre

Ici on a 3 eacutetats et leurs transitions associeacutees repreacutesenteacutees par des flegraveches

Deacutefinition des eacutetats

Pour acceacuteder agrave un workflow particulier dans portal_workflow on utilise longlet Contents

Puis on clique sur le nom du workflow souhaiteacute pour le configurer

Longlet States liste les eacutetats preacutesents pour ce workflow

Un eacutetat repreacutesente un objet agrave un point particulier du temps

Chaque eacutetat a un identifiant unique

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 55

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 57: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

Sous le nom de leacutetat on peut voir la liste des transitions possibles

On peut eacutegalement deacutefinir quel sera leacutetat initial

Deacutefinition des transitions

Les transitions repreacutesentent les changements possibles pour un objet

Longlet Transitions liste les transitions du workflow

Voici les diffeacuterents champs dune transition

Title le titre de la transitionbull Description une description deacutetailleacutee pour la transitionbull Destination state Leacutetat cible pour cette transitionbull Trigger type Indique la faccedilon dont la transition sera effectueacutee Automatic signifie quelle le sera degravesquelle passera dans cet eacutetat Initiated by user action ( le plus couramment utiliseacute ) signifie quunutilisateur a provoqueacute la transition en cliquant sur un lien

bull

Script(before) Exeacutecute le script avant que la transition ait lieubull Script(after) Exeacutecute le script apregraves que la transition ait lieubull Guard La seacutecuriteacute pour cet eacutetatbull Display in actions box La maniegravere dont la transition sera afficheacutee dans Plonebull

Permission associeacutees

Longlet Permissions liste les permissions geacutereacutees par le workflow

Pour ajouter une permission on la seacutelectionne dans le menu deacuteroulant puis on clique sur Add

Attention Apregraves toute modificationajoutsuppression il est neacutecessaire de cliquer sur Update securitysettings agrave partir de longlet Contents Cela aura pour effet de reacutepercuter les changements sur tous les objets dusite

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 56

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57

Page 58: Table des matièresparisson.com/...formation-plone-pilot-systems-v092.pdf · pas un utilisateur déclaré dans le système, vous pouvez en faire la demande à l'adresse mailto:waw@pilotsystems.net

62 Actions automatiques aux transitions

Inteacuterecirct

Les actions automatiques peuvent ecirctre tregraves utiles dans les workflows

Par exemple on peut souhaiter envoyer un mail agrave un utilisateur degraves quun de ses contenus est publieacute Dans cecas on appellera le script denvoi de mail apregraves la transition

En fonction de ce qui est souhaiteacute il est possible dappeler un script avant ou apregraves une transition

Meacutethode

Pour ajouter une transition automatique il est neacutecessaire dajouter au preacutealable un ou plusieurs scripts vialonglet Scripts

Ensuite dans longlet Transitions il faut choisir leacutetat voulu en cliquant sur son nom

Enfin dans lun des 2 menus deacuteroulants Script (before) ou Script (after) il suffit de seacutelectionner le script quiconvient

Pilot Systems - Support de formation Plone - plonepilotsystemsnet - 01 44 53 05 55 57