Outils personnels
Vous êtes ici : Accueil Plone 3 Créer un produit Plone Création du produit landure.viewlets.footersiteactions
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Création du produit landure.viewlets.footersiteactions

Par Pierre-Yves Landuré - Dernière modification 10/10/2009 17:46

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>

Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio