• Save
Grok in Plone
Upcoming SlideShare
Loading in...5

Grok in Plone



These are the slides for the talk I gave at the PloneSA group meeting in Cape Town on Wednesday 6 July 2011

These are the slides for the talk I gave at the PloneSA group meeting in Cape Town on Wednesday 6 July 2011



Total Views
Views on SlideShare
Embed Views



1 Embed 1 1



Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

    Grok in Plone Grok in Plone Presentation Transcript

    • Using Grok in Plone with Five.Grok
      • JC Brand
      • [email_address]
      • http://opkode.com
    • What is Grok?
      • Web application framework built on Zope 3
        • Inspired by Ruby on Rails
          • Convention over configuration
          • Don't repeat yourself
        • Aims avoid the need for ZCML
      • http://grok.zope.org
    • What is Grok?
      • Both Grok/Plone uses Zope Toolkit (ZTK)
      • ZTK uses Zope Component Architecture (ZCA)
      • ZCA also used by Pyramid/Pylons
      • Distinguishing Grok features (also in Plone):
        • Component Architecture (ZCA)
        • Object Database (ZODB)
        • Object publishing and traversal
    • Zope Component Architecture
      • Allows developers to create reusable components
      • Components are objects with Interfaces
      • Many-to-one mapping between objs and Interfaces, can be interchanged.
      • ZCA has roughly 2 kinds of components:
        • Adapters extend other components or models/content types.
        • Utilities, standalone (config, db connect, mail etc.)
      • ZCA allows extending 3rd party code without direct/edit access to it
    • Grok does away with ZCML
      • In ”plain” Zope, developer writes component in Python and registers it for ZCA in ZCML.
      • ZCML = glue or wiring
      • Grok lets you use python statements instead of ZCML
      • Keeps glue and code together
      • Makes it easier to see what registrations are in effect
      • Reduces need to context switch files/syntaxes
    • Using Five.Grok in Plone
      • BrowserViews
        • Common display technology in Zope
        • In use in Plone, BlueBream, Grok, Pyramid
        • BrowserView is a multi-adapter (i.e ZCA component)
        • Python class containing ”display logic”, registered as a multi-adapter for Request and content-type.
        • Normally has template, but not required (i.e Ajax)
        • Doesn't always return anything (i.e redirects)
        • See: plonesa.grok/browser/*
    • Using Five.Grok in Plone
      • Adapters
        • Most powerful concept of ZCA
        • Adapts an object of specific Interface, to also provide functionality specified by the adapter's interface.
        • Analogous to Type Casting
        • Real world analogy: Wall plug adapters
        • plonesa/grok/adapter.py
    • Using Five.Grok in Plone
      • Viewlets
        • Snippets of reusable HTML for rendering as part of a page (not the whole page).
        • Similarities with BrowserViews
        • Render inside ViewletManagers
        • plonesa/grok/browser/viewlet.py
    • Event subscribers
      • Event subscribers
        • Also called event listeners
        • Zope provides an events system
        • Components notify the subscribers of a particular event.
        • Code execution is blocked until all subscribers are done.
        • plonesa/grok/events.py
    • Other Five.Grok functionality
      • Annotations
        • Grok's Annotations are Adapters with attributes that persist (i.e can be stored).
        • Plone uses IAnnotations from zope.annotation which has a dict-like API.
        • Grok's pattern can cause problems when code is moved or uninstalled (which happens often in Plone)
        • http://pypi.python.org/pypi/grokcore.annotation
    • Other Five.Grok functionality
      • Defining Permissions
        • Grok uses grok.Permission
        • In Plone we define permissions in GS-XML configuration files rather than code.
        • See: http://pypi.python.org/pypi/grokcore.security
      • Utilities
        • Global (Zope-wide) or local utilities (Plone or folder-wide)
        • For local, Grok uses grokcore.site
        • In Plone we use componentregistry.xml GS-XML
    • Other Five.Grok functionality
      • Resource directories
        • Grok has an implicit static directory
        • Can also use grok.DirectoryResource instead of <browser.resourceDirectory/> directive.
        • See http://pypi.python.org/pypi/grokcore.view
    • Other Five.Grok functionality
      • Browser Layers
        • Can use grok.skin()
        • In Plone we use browserlayer.xml in GenericSetup
        • Alternatively SkinLayers via plone.theme package and configure.zcml
    • Other Five.Grok functionality
      • Forms
        • Grok uses grokcore.formlib
          • Megrok.z3cform
        • Plone still uses/supports formlib but momentum is moving towards z3c.form (i.e Dexterity )
          • collective.z3cform.grok
    • Other Five.Grok functionality
      • Content Types
        • Grok uses grok.Model
        • Plone uses Dexterity and Archetypes
      • Ordering Viewlets
        • Grok uses g rok.order() to order viewlets based on integer weighting.
        • Plone uses plone.app.viewletmanager and GS-XML instead.
    • Other Five.Grok functionality
      • Static resources dir
        • Grok has a special dir static for static resources (JS and CSS)
        • Can be accessed via TAL: view/static/stylesheet.css
        • In Plone this will always be relative to the context, rather than relative to site navigation root, which means it doesn't cache well.
        • Construct URL manually instead.
        • See: http://pypi.python.org/pypi/grokcore.view
    • Thanks and Credits
      • Carlos de la Guardia
        • Grok 1.0 Web Development
        • http://bit.ly/lf7sci
      • Martin Aspeli
        • http://bit.ly/iyESUB