Démarrer avec Zope
Zope est une technologie de gestion de contenu et de mise en
uvre de sites dynamiques qui a maintenant conquis de nombreux développeurs, et est utilisé pour des projets de toute taille. Zope est maintenant bien documenté, mais du fait de la rapidité d'évolution de cette technologie et du spectre étendu de ses applications, vous aurez besoin d'un guide pour savoir par où commencer.
A qui s'adresse Zope ?
Zope s'adresse en premier aux gestionnaires de contenu, un nouveau terme désignant les producteurs de contenu des sites : graphistes, web-marketeurs et responsables métiers qui mettent en
uvre l'entreprise sur le Web.
Mais une fois Zope installé, un intégrateur Web doit bâtir l'architecture et les fonctionnalités du site. Celui-ci doit utiliser les techniques HTML, CSS et XSL pour la partie présentation, et les langages de scripting de Zope, DTML et Python, pour parler avec l'API de Zope. Aujourd'hui, Zope compte parmi ses utilisateurs probablement beaucoup plus d'intégrateurs. Ils utilisent différentes briques, les produits ou modules d'extensions de Zope, et des scripts Python ou Perl pour bâtir les fonctionnalités sous-jacentes du site. Ils doivent ensuite former les gestionnaires de contenu à l'utilisation de site.
La dernière catégorie d'utilisateurs est celle des programmeurs, venant souvent du monde Perl, PHP ou Python. Ces derniers arrivent rapidement à la connaissance de l'API de Zope, le `` Zen of Zope '' dans le jargon Zopien, et contribuent au support et à l'évolution de Zope via des patchs. Ils développent des modules d'extension à Zope, appelés Produits, qui packagent un ensemble de fonctionnalités d'un site. Tous les modules d'extension de Zope sont disponibles en téléchargement à l'adresse http://www.zope.org/Products.
Installation et configuration
Pour installer Zope à partir du code source, vous devez préalablement avoir installé Python sur votre machine. Jusqu'à Zope 2.3.3, la version 1.5 au moins de Python est requise, mais à partir de la version 2.4 de Zope, Python 2.0 est requis. Vérifiez bien que vous avez également les librairies de développement de Python, sinon Zope ne pourra pas être compilé. En effet, souvent le RPM de l'interpréteur Python est installé par défaut, mais pas celui des librairies de développement. J'utilise la Mandrake 8 et cela n'a pas été très compliqué de trouver et d'installer les RPM Python et Python-devel sur les CDs fournis, grâce à RPMDrake, et de les installer.
Ensuite, téléchargez la dernière version stable du code source de Zope à partir de l'adresse http://www.zope.org/Products/Zope. Il est probable que ce soit la version 2.3.3. Utilisez par exemple la procédure d'installation suivante :
$ su root
$ [votre mot de passe root]
# tar xvf Zope-2.3.3-src.tgz ; mv Zope-2.3.3-src Zope
# cd Zope
# python wo_pcgi.py
A la fin de la compilation, le script d'installation crée le compte de l'utilisateur d'administration de Zope, le compte `manager', et vous affiche le mot de passe automatique qu'il a généré. Ce mot de passe est généralement compliqué à retenir. Il est recommandé de le modifier immédiatement en utilisant le script Python zpasswd.py fourni par Zope :
# python zpasswd.py p [votre mot de passe] access
Maintenant, vous pensez probablement avoir terminé l'installation. Mais si vous exécutez le script de démarrage de Zope, `start', vous obtenez une erreur. La raison de cette erreur est un problème de permissions Linux sur les fichiers de Zope. Ceci est spécifique à Zope. En effet, au démarrage, le processus serveur de Zope s'exécute en tant que `root' avant de changer de contexte pour le compte `nobody'. Par conséquent, ce compte doit avoir les permissions d'écriture sur le répertoire de données de Zope, nommé `var'. D'où les trois commandes suivantes pour ajuster les permissions :
# chgrp -R nobody var; chmod -R g+rw var; chmod g+s var
Vous pouvez maintenant démarrer Zope avec `./start', puis pointer votre navigateur Netscape ou Mozilla sur l'URL http://localhost :8080/manage afin d'accéder à l'interface de management. Vous devez vous authentifier grâce au compte `manager' qui a été créé pendant la phase d'installation. Voilà, vous pouvez admirer l'interface de management `` via le Web '' de Zope.
En fait le compte `manager' (ou super user) est un compte système qui ne vous sert qu'à accéder à l'interface de management de Zope et à créer les comptes utilisateurs ``normaux'' de Zope. Contrairement à ceux-ci, l'utilisateur `manager' ne peut pas créer des objets de contenu. Vous tomberez sur un message d'erreur. Ceci est dû à un mécanisme de sécurité appelé `` Ownership '' qui permet à un utilisateur de prendre la responsabilité d'un objet. Ainsi tout objet doit avoir un ``Owner''. Or le ``super user'' par conception, ne peut pas prendre la responsabilité d'un objet, et n'est pas autorisé à en créer. En conclusion, la première chose à faire après vous être connecté pour la première fois à Zope en tant que `manager' est de créer votre compte (ou vos comptes) de travail pour la suite.
Cliquez sur le dossier de type `UserFolder' nommé `acl_users', puis utilisez le bouton `Add' pour créer votre compte personnel en ayant sélectionné le type d'objet `User'. Vous devez entrer les informations suivantes : un nom qui servira d'identifiant, par exemple `kamon', le mot de passe choisi, et sélectionner les deux rôles `Manager' et `Owner'. Validez en cliquant sur le bouton `Add'. Si vous travaillez en équipe, vous pouvez tout de suite créez les comptes de vos collègues.
Fermez votre navigateur afin d'effacer le cookie d'authentification, puis reconnectez-vous sur http://localhost:8080/manage, mais cette fois authentifiez-vous avec votre identifiant et votre mot de passe personnels. Voilà. Vous pouvez maintenant développer dans l'interface de management de Zope.
Les objets de Zope
Dans Zope comme dans le language Python, tout est objet. Zope fourni des objets similaires à des fonctions permettant d'exécuter du code Python, Perl, ou SQL. On parle généralement de `` méthodes '' ou de `` scripts ''. Les méthodes s'appliquent à d'autres objets qui servent à stocker du contenu (texte, images, etc). Tous ces objets disposent d'un mécanisme qui permet de les publier sur le Web, c'est-à-dire de publier les pages correspondantes s'il s'agit de contenu ou de les exécuter s'il s'agit de scripts.
Les objets de scripting de Zope sont les DTML Methods, les SQL Methods et les Python Scripts. Cet article ne présente que les premiers et les plus utilisés, les DTML Methods.
Les objets de contenu sont les DTML Documents et les Folders (ou Dossiers). Les DTML Documents permettent de stocker des propriétés de type texte, et typiquement de rendre une simple page Web. Les Folders, qui eux-mêmes peuvent contenir d'autres objets, Documents, Methods, ou Scripts, permettent d'architecturer son site de contenu et de publier des pages dynamiques complexes.
Les objets Zope ont des interfaces, c'est-à-dire des méthodes Python qui permettent de les manipuler ou d'en obtenir des informations. Par exemple, title_or_id() donne le titre ou à défaut l'identifiant de tout objet, et objectIds() fournit la liste des identifiants de tous les objets contenus dans un Folder. Comme Zope est extensible, le développeur peut créer et définir de nouveaux objets répondant à ses spécifications. Mais nous n'en sommes pas encore là.
Les mécanismes de base : Conteneur, contexte et acquisition
Le système d'objets de Zope est organisé comme un système de fichiers avec des objets `` conteneurs '' appelés Folders, qui peuvent contenir du code, des données et d'autres objets. Grâce à cette approche contenu-conteneur et à une technologie appelée `Acquisition', tout objet peut obtenir ou acquérir des services des objets qui le contiennent. Ces services peuvent être l'accès à des données (attributs ou propriétés des objets acquis), ou de la logique produite par des scripts, ou des méthodes.
Une application typique de l'acquisition est que l'on peut faire référence à un objet contenu dans un dossier appelé DossierC, qui est contenu dans un dossier DossierB, à son tour contenu dans un dossier DossierA, en utilisant la notation Python en point (.) ``DossierA.DossierB.DossierC``, tant que vous vous trouvez dans le contexte d'acquisition de l'objet DossierA, comme c'est le cas dans les trois situations de ``contenance`` suivantes (ma_page étant l'objet où vous vous trouvez) :
1. DossierA contient ma_page
2. DossierB contient ma_page
3. DossierC contient ma_page
4. DossierA contient DossierD qui contient ma_page
5. DossierA contient DossierD qui contient DossierE qui contient ma_page
etc…
Dans tous ces cas, vous pouvez référencer l'objet DossierC dans le document `ma_page' en écrivant le code DTML suivant :
<dtml-var expr= ``DossierA.DossierB.DossierC.title_or_id()''>
Cet exemple a surtout pour but de montrer le mécanisme de manière globale. Certains parmi vous l'auront déjà compris, il y a des cas où cette expression est plus simple.
Par exemple, les cas 2 et 3. Dans le cas 2, DossierB est le conteneur direct à la fois de ma_page et de DossierC, et dans le cas 3, DossierC est le conteneur direct de ma_page. Dans ces deux cas, l'expression Python devient tout simplement ``DossierC.title_or_id()''.
Définir l'architecture du site
En accédant pour la première fois à Zope, avec l'interface de management Web, vous avez surement remarqué une méthode appelée index_html. C'est la méthode standard de Zope pour l'index global de votre site. Vous pouvez concevoir la structure de index_html de la manière suivante :
standard_html_header
html_left_bar | html_content | html_right_bar
standard_html_footer
Les methodes standard_html_header et standard_html_footer fournissent les header et footer d'une page HTML standard. Ils existent par défaut à la racine de Zope et ne peuvent être supprimés. Ils sont disponibles dans le contexte d'acquisition de tous les objets du site. Toujours d'après le principe de l'acquisition, index_html n'existera qu'une seule fois, à la racine, mais sera utilisé à travers le site pour afficher toutes les pages. Ainsi si vous avez la structure de contenu suivante pour votre site (ce sera le site exemple de cet article),
(Racine)
index_html
standard_html_header
standard_html_footer
+ news
+ produits
les URLs http://localhost :8080 ou http://localhost :8080/index_html (la page d'accueil), http://localhost :8080/news/ ou http://localhost :8080/news/index_html, et http://localhost :8080/produits ou http://localhost :8080/produits/index_html, s'afficheront toutes de la même manière.
Complétez la méthode index_html avec le code HTML/DTML suivant :
<dtml-var standard_html_header>
<TABLE WIDTH=100% BORDER=0>
<TR>
<TD WIDTH= 15%><dtml-if html_left_bar><dtml-var html_left_bar></dtml-if> </TD>
<TD WIDTH=70%><dtml-if html_content><dtml-var html_content></dtml-if></TD>
<TD WIDTH= 15%><dtml-if html_right_bar> <dtml-var html_right_bar> </dtml-if> </TD>
</TR>
</TABLE>
<dtml-var standard_html_footer>
L'intérêt d'utiliser la balise conditionnelle dtml-if dans votre code est que les pages qui s'affichent grâce à cette méthode s'afficheront sans générer d'erreur dans tous les cas, même s'il arrive que la méthode testée (html_left_bar par exemple) n'existe pas dan le contexte de la page. C'est une bonne habitude de développeur à prendre pour écrire du code sécurisé.
Créez maintenant les deux méthodes html_left_bar et html_right_bar à la racine de Zope, de manière à ce qu'ils soient acquis à travers tout le site. Pour l'instant, n'y mettez aucun code.
Organiser et gérer le contenu
Créez les différents dossiers Zope du site : news, produits, ...
Nous allons nous intéresser au dossier `news' qui va jouer le rôle de contenant pour toutes les brèves et les annonces du site. Vous pourrez ensuite appliquer la même démarche au dossier `produits'. Dans ce dossier, créez plusieurs objets de type `DTML Document', en spécifiant pour chacun d'eux les propriétés suivantes :
id : entrez une chaine du type news001, puis news002, ainsi de suite…
title : entrez le titre de votre brève ou annonce
Dans le deuxième champ de contenu, entrez le texte de la brève en format `texte brut'.
Vous avez maintenant votre contenu, mais il vous reste à le publier pour les visiteurs du site. Créez un objet de type DTML Method dans `news', nomméé `html_content', et mettez-y le code suivant :
<dtml-in expr="news.objectValues('DTML Document')" sort=id reverse>
<B><dtml-var title><B> <BR>
<dtml-var expr="this()" > <BR><BR>
</dtml-in>
Référez-vous au `` Récapitulatif des interfaces Zope utilisées '' pour comprendre plus en détails comment fonctionne cette méthode DTML. Essentiellement, elle boucle sur les sous-objets de type `DTML Document' du dossier `news', et affiche leur contenu (titre, texte…). L'attribut `sort' de la balise dtml-in permet de trier la liste en fonction de l'identifiant (news001, news002, …), et le mot-clé `reverse' permet d'afficher les brèves dans l'ordre décroissant d'arrivée. Une alternative est d'utiliser sort=bobo_modification_time pour trier par la date de modification des objets.
Cliquez sur l'onglet `View' pour pré-visualiser votre page de news. Vous venez de publier votre première page Web dynamique avec Zope. Au-delà de l'aspect technique, l'intérêt de cette démonstration est qu'avec Zope, vous bâtissez une organisation de site simple permettant à des personnes ne connaissant même pas le HTML de publier du contenu. Tout ce que vous devez faire, c'est leur créer un compte utilisateur avec les droits de mise à jour du contenu souhaité.
Ergonomie du site
L'ergonomie d'un site est basé sur le visuel et la facilité de navigation dans le site. Vous allez utiliser les méthodes html_left_bar et html_right_bar pour bâtir cette ergonomie de manière simple et extensible.
html_left_bar : Pour afficher les liens vers les principaux dossiers du site afin de permettre la navigation dans ces dossiers, vous avez besoin d'une interface standard de Zope appelé PARENTS. Pour tout objet `objet', l'expression Python objet.PARENTS renvoie la liste de tous ses objets parents, c'est-à-dire ses conteneurs, dans l'ordre de remontée de l'arbre d'objets de Zope. Ainsi le premier objet de la liste, PARENTS[0], est le dossier conteneur immédiat, et le dernier objet, PARENTS[-1], est l'objet `Racine' de Zope.
Il suffit donc, quelque soit l'endroit de l'arborescence Zope où vous vous trouvez, de parcourir la liste des sous-objets de type `Folder' (les rubriques) de l'objet PARENTS[-1], et d'afficher leur titre avec un lien sur leur page index. Ceci revient au code DTML suivant à injecter dans html_left_bar :
<dtml-in expr= "PARENTS[-1].objectValues(`Folder') ">
<A HREF= "<dtml-var expr="this().absolute_url()">" >
<B><dtml-var title></B>
</A> <BR>
</dtml-in>
html_right_bar : Habillez la partie droite du site en faisant apparaître une rubrique `News' avec une sélection des trois dernières news. Le code suivant, similaire à celui utilisé dans le méthode `html_content' de `news' fera apparaître la sélection :
<dtml-in expr= "news.objectValues(`DTML Document') " size=3 sort=''id'' reverse>
<A HREF= "<dtml-var expr="this().absolute_url()">" >
<B><dtml-var title size= 100></B>
</A> <BR>
</dtml-in>
<BR> <A HREF= "<dtml-var expr="news.absolute_url()">" > <B>Toutes les news</B> </A>
Qu'avons nous appris ?
A utiliser les objets standards de Zope, Folders, DTML Documents et DTML Methods, pour gérer et publier du contenu pour un petit site.
Récapitulatif des interfaces de Zope utilisées
Interface
Description
Objets
title_or_id()
Permet d'afficher le contenu de la propriété `titre' si elle n'est pas vide, sinon l'identifiant.
Tous
absolute_url()
Fournit l'URL absolue permettant d'accéder à un objet via le web.
Tous
ObjectsValues()
Fournit la liste des sous-objets d'un objet. Voir aussi objectsIds() pour la liste des identifiants des sous-objets.
Folders uniquement
PARENTS
Fournit la liste des objets parents de l'objet
Tous
Kamon Ayeva
Liens
Page de download de Zope
http://www.zope.org/Products
Zope Book, le guide officiel Zope
http://www.zope.org/Members/michel/ZB
Page de ressources de Kamon Ayeva
http://www.zope.org/Members/Kemalus