[Zope3-Users] zope.schema.Object - Object of Objects
Christian Lueck
christian.lueck at ruhr-uni-bochum.de
Thu Aug 25 21:14:24 EDT 2005
Hi!
I want to define add- and edit-views for objects of objects with
zope.schema.Object and zope.app.form.browser.ObjectWidget. Roger
Ineichen and Andreas Reuleaux explained (on this list) howto write
custom widgets for objects. I was trying to define a widget for objects
of objects (objects which's attributes are objects again), but didn't
get it for days. Tonight I got it! Since there is not yet a posting on
this problem on the list I decided to post it. Maybe this is a
zope3-newbie problem, but maybe this list is the right place for these
kinds of problems.
Instead of using the subwidget directive I defined a kind of 'medium'
class which inherits zope.app.form.browser.ObjectWidget and in
which--again--ObjectWidgets are defined. I don't know if this is good
zope3 style but it works fine. See file widget.py below...
Christian
----------------------------------------------------
file: interfaces.py
from zope.interface import Interface
from zope.schema import TextLine, Int, Object
class IPerson(Interface):
lastname = TextLine(
title=u"Lastname",
description=u"Please give the lastname.",
required=False)
firstname = TextLine(
title=u"Firstname",
description=u"Please give the firstname.",
required=False)
class IPages(Interface):
start = Int(
title=u"Start page",
description=u"Please give the start page.",
required=False)
end = Int(
title=u"End page",
description=u"Please give the end page.",
required=False)
class IArticle(Interface):
author = Object(
schema=IPerson,
title=u"Author",
description=u"The author of the article.",
required=False)
title = TextLine(
title=u"Article title",
description=u"Please give the title of the article.",
required=False)
pages = Object(
schema=IPages,
title=u"Pages",
description=u"Start and end page of the article.",
required=False)
class INonsens(Interface):
article = Object(
schema=IArticle,
title=u"Article",
description=u"A (nonsens) article",
required=False)
----------------------------------------------------
file: article.py
from zope.interface import implements
from objectsofobjects.interfaces import IPerson, IPages, IArticle, INonsens
from zope.schema.fieldproperty import FieldProperty
class Person:
"""The Person object."""
implements(IPerson)
class Pages:
"""The Pages object."""
implements(IPages)
class Article:
"""The article object."""
implements(IArticle)
class Nonsens:
"""The nonsens object."""
article = FieldProperty(INonsens['article'])
implements(INonsens)
----------------------------------------------------
file: widget.py
from zope.app.form.browser.editview import EditView
from zope.app.form import CustomWidgetFactory
from zope.app.form.browser import ObjectWidget, TextWidget
from zope.schema import TextLine
from objectsofobjects.interfaces import INonsens
from objectsofobjects.article import Person, Pages, Article
class Article_w(ObjectWidget):
"""This is the 'medium' class which inherits ObjectWidget
and in which ObjectWidgets are defined."""
author_widget = CustomWidgetFactory(ObjectWidget, Person)
# (Note that you don't have do define a custom widget for the simple
TextLine 'title'!)
pages_widget = CustomWidgetFactory(ObjectWidget, Pages)
class NonsensEditView(EditView):
"""This is the customized EditView class."""
__used_for__ = INonsens
#Give the 'medium' class Article_w as an argument to the contructor
of CustomWidgetFactory.
article_widget = CustomWidgetFactory(Article_w, Article)
----------------------------------------------------
file: configure.zcml
<configure
xmlns='http://namespaces.zope.org/zope'
xmlns:browser='http://namespaces.zope.org/browser'>
<content class=".article.Person">
<require
permission="zope.View"
interface=".interfaces.IPerson"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IPerson"
/>
</content>
<content class=".article.Pages">
<require
permission="zope.View"
interface=".interfaces.IPages"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IPages"
/>
</content>
<content class=".article.Article">
<require
permission="zope.View"
interface=".interfaces.IArticle"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IArticle"
/>
</content>
<content class=".article.Nonsens">
<require
permission="zope.View"
interface=".interfaces.INonsens"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.INonsens"
/>
</content>
<browser:editform
label="Change nonsens article data"
name="edit.html"
schema=".interfaces.INonsens"
class=".widget.NonsensEditView"
menu="zmi_views"
title="Edit"
permission="zope.ManageContent"
/>
<browser:addform
label="Add a nonsens article"
name="AddNonsensArticle.html"
schema=".interfaces.INonsens"
class=".widget.NonsensEditView"
content_factory=".article.Nonsens"
permission="zope.ManageContent"
/>
<browser:addMenuItem
title="NonsensArticle"
class=".article.Nonsens"
permission="zope.ManageContent"
view="AddNonsensArticle.html"
/>
</configure>
More information about the Zope3-users
mailing list