[Grok-dev] What would a megrok.z3cform (and a Zope2/plone.z3cform equivalent) look like?

Martin Aspeli optilude at gmx.net
Mon Aug 4 18:34:59 EDT 2008


Hi,

I'm interested in support page forms, add forms and edit forms based on 
z3c.form and plone.z3cform in Zope 2/CMF/Plone. I am not really able to 
work on a "pure Grok" megrok.z3cform, mainly since I don't have any Grok 
applications to test with or much experience with plain Grok, but I 
think it'd be preferable if, at the very least, the same patterns would 
be applied to plain Grok and Zope 2 use case and, if possible, the two 
shared code.

I think it'd be good to support:

  - AddForm
  - EditForm
  - Form (full page form)

and maybe also:

  - EditSubForm
  - Groups (actually, I'm not sure we need this)
  - Locating per-form templates with Grok template semantics

(Note that it's also possible to register default form layout templates 
with adapters, to get a common look and feel, which I think is actually 
the most common use case).

Looking at the canonical examples from 
http://pypi.python.org/pypi/z3c.form, I think this should be pretty 
straightforward. I could imagine a simple case where we just have 
grokkers for these base classes, and support the usual view directives 
from grokcore.view, specifically name(), require(), layer() and context().

I am not sure if we need a Grok-specific base class. The 
grokcore.view.components.View base class does a few things, like support 
the 'static' resource directory, give a 'response' property, and does 
some template rendering. I think z3c.form already provides a lot of 
convenience APIs and hooks, and I don't think we necessarily need to 
provide specific support for bespoke templates in the way that Grok's 
standard View does.

Now, z3c.form also has a number of namespaced entities and conventions 
of its own, such as support for defining buttons and actions, layout 
templates and so on. These are pretty sensible. One question is whether 
we want to provide convenience imports for most of them, as Grok's 
formlib support does for things like actions. I'm less inclined to do 
so, because it may cause confusion with published z3c.form 
documentation. However, I'm not sure what others would prefer.

Finally, there's an added complexity with plone.z3cform in that it 
relies on a wrapper view that wraps the "plain" z3c.form Form to provide 
the Zope 2 integration. In a way, that's nice, because it keeps custom 
forms "vanilla" z3c.form entities. However, it does mean that it's 
actually this wrapper view that gets registered. There are two ways to 
use it:

  class MyForm(Form):
      fields = field.Fields(IMyForm)
      ...

  class MyFormView(FormWrapper):
      form = MyForm

or:

  MyFormView = wrap_form(MyForm)

The latter approach creates a class on the fly. The key here is that in 
Zope 2 with plone.z3cform, it's actually the MyFormView that needs to be 
registered as the view, not the form class itself.

I would propose that we hide this with plone.z3cform specific grokkers 
that create the wrapper view class and registers it.

Thus, (shared) pattern may be:

  from z3c.form import form, field
  from my.package.interfaces import IFoo

  class FooForm(IFoo):
     grok.name('foo')
     grok.context(IFoo)
     grok.require('zope.View')

     fields = field.Fields(IFoo)

     @button.buttonAndHandler(u"OK")
     def handleOk(self, action):
         print 'ok'

Opinions? Suggestions?


Cheers,
Martin

-- 
Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book



More information about the Grok-dev mailing list