Bernd Dorn a écrit :
On 06.03.2007, at 18:54, Christophe Combelles wrote:
I'm playing again with the notion of categories of objects.
I have two main goals:
1) I must let the user choose the category of an object added to the
zodb. For this, I must be able to retrieve the list of categories and
present them in a form field managed by a vocabulary (or in a
2) I must have different behaviours for categorized objects:
objects of different categories would have different views, different
addMenuItems (if they are containers), etc.
the first requirement would tell me to define categories as objects,
while the second one would tell me to define them as interfaces.
The possible solutions I see:
1) The simplest solution is to store the categories as text strings
into the annotations of the object. So categories actually are just tags.
2) The second solution is to do the same, but replace text strings
with category objects, that implement ICategory. And categories can be
stored separately in a category container, or in a registered utility
that gives the list of available categories. This is a bit better, but
this way I don't know how to easily let my categorized objects behave
differently according to their categories.
3) The third solution is to define categories as interfaces extending
ICategory. I can retrieve the list of categories with
But to present them in a form, I must have a pretty name for each
interface. Should I store them in a Tagged Value?
4) The fourth solution I see, is to define an interface type,
ICategoryType, extending IInterface just like IContentType. Then my
categories would be interfaces whose type is ICategoryType. But with
IContentType, is there a way to retrieve the list of all available
imho 4) is the best solution, just take a look at zope.app.content to
see how to get the vocabulary and the inspection implementation of objects
you can then set the interface on objects by using
But with 4), I guess I won't be able to assign two categories onto an object,
An object can have only one ContentType
I feel that 3) is easier, but I don't know how to assign an retrieve a display
name to interfaces.
A real example is the following:
I want to define objects that represent Companies.
A company can be either a client, or a provider, or both,
or in the future it could be of another type.
When the user creates a company, it must choose "client", "provider", or both.
The choice would assign a different interface to the object:
IClient, or IProvider, and this would lead to different views for these objects.
So "client" and "provider" are categories of companies.
So I would tend to have:
This is simple, but now how do I assign a name to these interface, so that the
user will choose between "Client" and "Provider", and not between "IClient" and
Is it feasible with Tagged Value ? Or with the "name" attribute in the
zope:interface ZCML declaration?
Do you have some advice on the subject? Am I asking the wrong
questions? Is there an obvious solution I've not seen? Am I going too
far and should I rather keep it simple and stupid?
Zope3-users mailing list
Zope3-users mailing list