Création du produit landure.viewlets.footersiteactions
Je présente ici la création d'un produit ajoutant le viewlet site_actions (qui contient les liens vers le plan du site, l'article sur l'accessibilité, et le formulaire de contact) au pied de page (footer) d'un site Plone. C'est une action relativement simple a effectuer, et c'est une bonne introduction aux produits Plone.
Création du squelette du produit
Paster est un outil "magique" qui facilite grandement la création d'un produit. Comme dit ci-dessus, à fin d'exemple, nous allons créer un produit contenant le code nécessaire à l'affichage du viewlet des site_actions (plan du site, contact, accessibilité, etc) dans le footer.
Par convention, nous nommons ce produit : landure.viewlets.footersiteactions
Pour créer l'egg de ce produit, appelez Paster avec cette ligne de commande :
./Python-2.4/bin/paster create -t plone_app
L'outil vous pose alors de nombreuses question, voici les réponses à y apporter pour créer notre produit.
- Enter project name: landure.viewlets.footersiteactions
Cette valeur est utilisée pour déterminer le nom du dossier du produit. Évitez d'y mettre des espaces.
- Enter namespace_package (Namespace package (like plone)) ['plone']: landure
La première partie du namespace, avant le premier point. (cette valeur fait partie du project name).
- Enter namespace_package2 (Nested namespace package (like app)) ['app']: viewlets
La seconde partie du namespace, après le premier point, avant le second. (cette valeur fait partie du project name).
- Enter package (The package contained namespace package (like example)) ['example']: footersiteactions
Le nom du produit (la fin du namespace). (cette valeur fait partie du project name).
- Enter zope2product (Are you creating a Zope 2 Product?) [True]: True
Plone 3 utilisant Zope 2, cette valeur doit obligatoirement être à True.
- Enter version (Version) ['1.0']: 1.0
La version de votre produit. Valeur numérique libre :D
- Enter description (One-line description of the package) ['']: Footer Site Actions
Le titre de votre produit. Ce nom permettra de trouver votre paquet dans le portal_quickinstaller.
- Enter long_description (Multi-line description (in reST)) ['']: Add the Plone site_actions viewlet to the portalfooter.
La description de votre produit. Décrivez ici sa fonction.
- Enter author (Author name) ['Plone Foundation']: Prénom Nom
Votre nom et prénom.
- Enter author_email (Author email) ['plone-developers@lists.sourceforge.net']: prenom.nom@domain.com
Votre adresse mél.
- Enter keywords (Space-separated keywords/tags) ['']: plone site_actions footer landure viewlet
Quelques mots clefs aidant à retrouver facilement le produit dans pypi.python.org
- Enter url (URL of homepage) ['http://svn.plone.org/svn/plone/plone.app.example']: http://howto.landure.fr/
L'URL du site officiel de votre produit.
- Enter license_name (License name) ['GPL']: GPL
La license (libre de préférence) de votre travail. GPL ou ZPL sont de bons choix.
- Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: False
tar.gz ou zip ? telle est la question. Pour moi, la réponse est tar.gz.
Paster crée votre produit dans le dossier "landure.viewlets.footersiteactions", qui est la valeur choisie pour le "project name".
Vous disposez maintenant d'un squelette pour votre produit. Nous allons y ajouter le code nécessaire à ses fonctionnalités. Pour ce faire, placez-vous dans le dossier destiné à contenir le code de votre produit : Le dossier de dernier niveau :
cd landure.viewlets.footersiteactions/landure/viewlets/footersiteactions
Mise en place du profil Generic Setup
En premier lieu, nous créons le dossier destiné à contenir les fichiers du profil :
/bin/mkdir --parent profiles/default
Nous créons le fichier profiles.zcml contenant le profile "Generic Setup" de notre produit.
<?xml version="1.0" encoding="UTF-8"?>
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
i18n_domain="landure.viewlets.footersiteactions">
<genericsetup:registerProfile
name="default"
title="Footer site actions"
directory="profiles/default"
description="Make site_actions viewlet available in site footer."
provides="Products.GenericSetup.interfaces.EXTENSION"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
/>
</configure>
Enfin, éditez le fichier configure.zcml et ajouter la ligne suivante avant la balise </configure> pour que le fichier profiles.zcml soit pris en compte :
<include file="profiles.zcml" />
Mise en place d'un "calque"
Afin que les modifications de configuration de Plone contenu dans notre produit ne s'appliquent que dans les sites sur lesquels nous avons installé notre produit, nous créons un "calque", autrement nommé "browser layer". Ce calque contiendra toute les modifications de configuration de notre produit, et ne sera appliqué que si le produit est installé.
La première étape consiste à créer le dossier "browser" destiné à contenir le code python spécifique à notre produit :
/bin/mkdir browser
Nous y créons ensuite le fichier browser/__init__.py qui initialise le dossier comme un "conteneur" python. C'est nécessaire pour que les fichiers .py que nous y ajouterons soient visible par le serveur Zope :
/bin/touch browser/__init__.py
Nous créons le fichier browser/interfaces.py avec le contenu suivant :
from zope.interface import Interface
class IBrowserLayer(Interface):
"""A layer specific to landure.viewlets.footersiteactions"""
pass
Ce fichier ne contient qu'une seule classe sans aucune méthode. Cette classe est une "Interface". Elle permet de "typer" les objets qui en héritent. Ici, notre interface permettra de détecter les "objets" liés à notre produit.
Afin de compléter la mise en place du calque, créez le fichier profiles/default/browserlayer.xml avec le contenu suivant :
<?xml version="1.0" encoding="UTF-8"?>
<layers>
<layer name="landure.viewlets.footersiteactions"
interface="landure.viewlets.footersiteactions.browser.interfaces.IBrowserLayer"
/>
</layers>
Ici, la partie .browser.interfaces désigne le fichier browser/interfaces.py créé plus haut.
Ajout de la configuration plaçant le viewlet site_actions dans le portalfooter.
Nous commençons par créer le fichier browser/configure.zcml qui contient la configuration de notre viewlet :
<?xml version="1.0" encoding="UTF-8"?>
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
>
<!-- Viewlet definition -->
<!-- The footer site_actions -->
<browser:viewlet
name="landure.viewlets.footersiteactions.site_actions"
manager="plone.app.layout.viewlets.interfaces.IPortalFooter"
class="plone.app.layout.viewlets.common.SiteActionsViewlet"
layer=".interfaces.IBrowserLayer"
permission="zope2.View"
/>
</configure>
Remarque : La présence du fichier "configure.zcml" dans le dossier browser fait de ce dossier un "package".
Éditez le fichier configure.zcml et ajouter la ligne suivante avant la balise </configure> pour que le fichier browser/configure.zcml soit pris en compte :
<include package=".browser" />
Mettre en place le produit dans votre instance Zope / Plone
Notre produit est maintenant près à l'emploi. Pour le tester et/ou l'utiliser, installez le en suivant mon guide Ajouter un produit en développement à votre buildout Zope / Plone.
Une fois le produit installé dans votre site, vous verrez que la barre des site_actions est maintenant disponible dans votre pied de page. Pour modifier sa position d'affichage et masquer celle présente dans l'entête, il vous suffit d'afficher la page de gestion des viewlets en ajoutant @@manage-viewlets à votre URL :
http://localhost:8080/mon-site/@@manage-viewlets
Pour aller plus loin
Si votre produit contient un thème (skin) (ce n'est pas le cas de mon exemple ci-dessus), vous pouvez ajouter le fichier profiles/default/viewlets.xml contenant la configuration de l'affichage des viewlets, afin que notre viewlet soit correctement placé dans le PortalFooter :
<?xml version="1.0" encoding="UTF-8"?>
<object>
<hidden manager="plone.portaltop" skinname="Mon Theme Plone">
<viewlet name="plone.site_actions" />
</hidden>
<order manager="plone.portalfooter" skinname="Mon Theme Plone">
<viewlet name="landure.viewlets.footersiteactions.site_actions"
insert-after="plone.footer" />
</order>
</object>