[Zope-dev] proposal: Custom schema properties

Martin Aspeli optilude+lists at gmail.com
Sat Oct 31 23:30:09 EDT 2009


Adam Groszer wrote:
> Hello,
> 
> After quickly glancing over plone.behavior it seems more like
> something to extend a schema, and does it solve the problem of "new
> properties -- new schema -- change everything around it"?
> 
> What I need is to be able to change schema properties per site. And
> skipping the need to fix the forms or whatever concerned with that
> changed schema.

I'm not sure I really understand your problem (from reading the original 
email), but I maybe offer a few suggestions.

plone.behavior is a way to create re-usable chunks of functionality. A 
behavior may or may not include a schema with form fields, and/or an 
adapter factory. When the behaviour is "enabled" for an instance (how it 
is enabled is application-specific: in Plone/Dexterity we list enabled 
behaviours against each content type), it will be possible to adapt an 
instance to the behaviour interface, and to look up the schema interface 
for form rendering, say.

There is also a package called plone.autoform, which provides a base 
class for z3c.form-type forms and enables schemata to be self-describing 
(e.g. "this field goes before that field", or "this field is only shown 
if the user has this permission"). plone.autoform interprets these 
"schema hints" to set up a suitable form.

Now, in Dexterity (a content type framework for Plone) we use 
plone.autoform in such a way that standard add/edit forms are 
constructed by looking at a type's canonical schema interface + the 
schema interfaces (if any) of any behaviours enabled on that type. This 
means that we can compose types from a number of behaviours (e.g. 
locking, versioning, staging, multi-lingual support etc) and other 
things fall into place: add/edit forms, views, viewlets and so on.

For your use case, I think the lessons are:

  - by using some kind of inversion of control on the forms and other 
schema-dependent things, you may be able to avoid the "re-register 
everything" problem

  - try to separate out the parts of the schema that are truly 
re-usable, and the ones that are application specific

  - register views/forms/whatever for the most generic schema feasible 
and ensure that this is provided by your instances

As for your specific proposal, I'd definitely keep it in a separate 
package: zope.schema needs to stay simple. We also need to be very 
careful about the possible side-effects of mutating schemata that may be 
used by other things. If the code you read (interfaces.py) is out of 
sync with the code that's executed, we end up with confusion.

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 Zope-Dev mailing list