Utiliser la ZCA avec Grok

Introduction

Grok est un composant qui permet de simplifier et d'accélérer considérablement l'écriture de code utilisant la Zope Component Architecture. C'est principalement un ensemble de directive permettant de diminuer l'utilisation du ZCML et d'écrire davantage de choses directement dans le code python.

Installation de five.grok

Modifiez votre buildout.cfg comme ceci :

[zope2]
skip-fake-eggs =
    zope.app.publisher
    zope.component
    zope.i18n
    zope.interface
    zope.testing

[instance]
eggs =
    # ...
    five.grok

zcml =
    # ...
    five.grok-meta
    five.grok

Et ajoutez ces versions dans votre fichier versions.cfg :

five.grok = 1.0
grokcore.annotation = 1.1
grokcore.component = 1.7
grokcore.formlib = 1.4
grokcore.security = 1.2
grokcore.site = 1.1
grokcore.view = 1.12.2
grokcore.viewlet = 1.3
five.localsitemanager = 1.1
martian = 0.11.1
zope.app.publisher = 3.5.1
zope.app.zcmlfiles = 3.4.3
zope.component = 3.4.0
zope.i18n = 3.4.0
zope.interface = 3.4.1
zope.schema = 3.4.0
zope.securitypolicy = 3.4.1
zope.testing = 3.7.6

Vous pouvez retrouver les dernières versions des packages qui fonctionnent bien ensemble dans le buildout de five.grok pour Zope 2.10/Plone 3, pour Zope 2.12/Plone 4.

Utiliser Grok

Créez un package formation.transforms avec le template paster plone :

$ cd /tmp
$ paster create -t plone formation.transforms \
  --svn-repository=http://devagile/Formation/packages
$ cd formation.transforms
$ svn rm --force formation.transforms/formation.transforms.egg-info
$ svn ci -m"Added skel of formation.transforms"

Dans votre buildout, éditez le fichier sources.cfg, ajoutez formation.transforms dans l'option auto-checkout et indiquez l'url suivante dans [sources] :

formation.transforms = svn http://devagile/Formation/packages/formation.transforms/trunk

Dans buildout.cfg, ajoutez formation.transforms dans l'option eggs.

Relancez bin/buildout pour récupérer le product dans le dossier src.

éditez src/formation.transforms/setup.py pour déclarer le produit comme plugin plone :

entry_points="""
[z3c.autoinclude.plugin]
target = plone
"""

Relancez bin/buildout pour regénérer les métadonnées de formation.transforms.

Créez un fichier formation/transforms/interfaces.py :

from zope.interface import Interface

class IReplaceLetter(Interface):
    def getText(letter1, letter2):
        """Return a modified text, replace letter1 by letter2.
        """

Créez un fichier adapters.py :

from five import grok
from formation.transforms.interfaces import IReplaceLetter
from Products.ATContentTypes.interface.document import IATDocument

class ReplaceLetter(grok.Adapter):
    grok.implements(IReplaceLetter)
    grok.context(IATDocument)
    def getText(self, letter1, letter2):
        return self.context.getText().replace(letter1, letter2)

Créez un module views.py :

from five import grok
from formation.transforms.interfaces import IReplaceLetter
from Products.ATContentTypes.interface.document import IATDocument

grok.templatedir('templates')

class TransformedDocument(grok.View):
    grok.name("my-view")
    grok.context(IATDocument)

    def update(self, letter1=None, letter2=None):
        self.letter1 = letter1
        self.letter2 = letter2

    def getAuthenticatedUser(self):
        user = self.request.AUTHENTICATED_USER
        return user.getProperty('fullname', user.getId())

    def getContent(self):
        if self.letter1 is None or self.letter2 is None:
            return self.context.getText()
        return IReplaceLetter(self.context).getText(self.letter1, self.letter2)

Créez le répertoire templates/ et créez dedans un fichier transformeddocument.pt :

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="formation.transforms">
    <div metal:fill-slot="content"
         tal:content="structure view/getContent">
    </div>
</html>

Dans formation/transforms/configure.zcml, ajoutez l'espace de nom grok et la ligne :

<grok:grok package=".adapters" />
<grok:grok package=".views" />

Vous pouvez également faire :

<grok:grok package="." />

qui va rechercher l'ensemble des packages et modules qui comportent des classe héritant de grok.

Dans Plone, créez un Document et accédez à la vue @@transformeddocument.

Ressources

Viewlets avec grok

Table des matières

Sujet précédent

Pour aller plus loin

Sujet suivant

Modélisation UML

Cette page


blog comments powered by Disqus