Zope3: Inhaltsobjekt nur innerhalb bestimmter Container zulassen

Anleitung, um ein Inhaltsobjekt nur innerhalb eines bestimmten Container-Typs zuzulassen und für einen Container die zugelassenen Unterobjekte zu beschränken.

by Michael Howitz posted at 2006-01-30 11:50 last modified 2006-01-30 11:50

Definition der Interfaces

interfaces.py:

from zope.app.container.constraints import containes, containers


class IChild:
"Interface für die Kind-Klasse."

class IParent:
"Interface für die Eltern-Klasse."
contains(IChild)

class IChildContained:
"""Interface welches besagt, dass Objekte, die es
implementieren bestimmte Bedingungen erfüllen."""
containers(IParent)

Die Klasse, die IChild implementiert, muss auch IChildContained implementieren, damit Objekte dieser Klasse nur in IParent implementierenden Objekten angelegt werden können.

Die Auftrennung in die Interfaces IChild und IChildContained ist nicht zwingend erforderlich, da die Funktionen contains und containers auch Strings als Argumente annehmen. Das sähe dann so aus:

from zope.app.container.constraints import containes, containers


class IChild:
"Interface für die Kind-Klasse."
containers('.IParent')

class IParent:
"Interface für die Eltern-Klasse."
contains(IChild)

Allerdings wird so durch containers ein Feld __parent__ im Schema von IChild erzeugt, welches zu einem PageError führt, wenn man für das Interface mit zope.formlib die Benutzungsoberfläche erzeugen will. (Für das Feld __parent__ gibt es kein Widget.)

Einbindung mit ZCML

Damit das ZMI die ferstgelegten Constraints korrekt wiederspiegelt, müssen  browser:containerViews für IParent registriert werden, sowie ein browser:addMenuItem für IChild existieren:

<!-- Hinzufügen von Child -->
<browser:addMenuItem
factory="mypackage.Child"
title="Kind"
description="Ein Kind."
/>

<!-- Anzeige von IChild zum Anlegen in IParent -->
<browser:containerViews
for=".interfaces.IParent"
add="zope.ManageContent"
/>
Category(s)
Zope 3
The URL to Trackback this entry is:
http://blog.gocept.com/zope3-inhaltsobjekt-nur-innerhalb-bestimmter-container-zulassen/tbping