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.
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