.. -*- coding: utf-8 -*- .. _grok: ========================= 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 :term:`ZCML` et d'écrire davantage de choses directement dans le code python. Installation de five.grok ========================= Modifiez votre :file:`buildout.cfg` comme ceci : .. code-block:: cfg [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 :file:`versions.cfg` : .. code-block:: 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 :mod:`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 : .. code-block:: sh $ 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 :file:`sources.cfg`, ajoutez ``formation.transforms`` dans l'option ``auto-checkout`` et indiquez l'url suivante dans ``[sources]`` : .. code-block:: cfg formation.transforms = svn http://devagile/Formation/packages/formation.transforms/trunk Dans :file:`buildout.cfg`, ajoutez formation.transforms dans l'option ``eggs``. Relancez :command:`bin/buildout` pour récupérer le product dans le dossier :file:`src`. éditez :file:`src/formation.transforms/setup.py` pour déclarer le produit comme plugin plone : .. code-block:: python 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 :file:`formation/transforms/interfaces.py` : .. code-block:: python from zope.interface import Interface class IReplaceLetter(Interface): def getText(letter1, letter2): """Return a modified text, replace letter1 by letter2. """ Créez un fichier :file:`adapters.py` : .. code-block:: python 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 :file:`views.py` : .. code-block:: python 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 :file:`templates/` et créez dedans un fichier :file:`transformeddocument.pt` : .. code-block:: xml
Dans :file:`formation/transforms/configure.zcml`, ajoutez l'espace de nom ``grok`` et la ligne : .. code-block:: xml Vous pouvez également faire : .. code-block:: xml 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 ------------------ - http://grok.zope.org/documentation/how-to/understanding-viewlets - Création d'une viewlet qui affiche un Avertissement lorsque le document est expiré : http://vincentfretin.ecreall.com/articles/creating-a-viewlet-with-grok