[Zope-CMF] [dev] add view traversal
Martin Aspeli
optilude at gmx.net
Sun Sep 14 07:30:54 EDT 2008
Jens Vagelpohl wrote:
>> b) for URLs like http://www.example.org/guestbook/+/Message
>>
>> The '+' view already implements IPublishTraverse, so we can't change
>> traversal using an adapter. The only solution I can see is to replace
>> the '+' view by a customized version.
>
> This looks like a good solution. I believe Zope 3 uses the same or a
> similar style.
I don't think we can do this. The + view implements IAdding which has
special semantics. Existing types are likely to rely on + being an
IAdding view.
Zope 3 does use IAdding for zope.app.form/zope.formlib based add views;
With z3c.form, IAdding support is optional, but the preference is to
just use views like @@add-foo.html (note: I hate the .html convention;
it is superfluous and looks weird, IMHO).
I think it's better to use a different name. For plone.dexterity, I've
done this:
http://dev.plone.org/plone/browser/plone.dexterity/trunk/plone/dexterity/browser/add.py
The add view traverser is called @@add-dexterity-content. It's
deliberately framework-specific since I want particular semantics (a
default add view based on FTI information only if no type-specific add
view is registered). That's all fine, though, since we look up the exact
URL for add view in an action anyway. We don't need a one-size-fits all
traverser (which the + view had to be).
I'm monkey patching the TypesTool to backport the changes Yuppie already
made to CMF trunk to support folder/add actions.
For CMF, how about a simple @@add or maybe @@add-content?
>> 3.) For which context should we register the add views?
>> -------------------------------------------------------
>>
>> The add views will depend on special portal type handling done by the
>> traverser. So we register the add views for traverser?
No. That's how IAdding works, and it's basically what we're trying to
avoid. If the context of the view is the IAdding view, then self.context
is not a content item, which makes for all kinds of self.context.context
type lookups, messes with vocabulary factories, makes security tricky in
some cases, and generally is confusing.
(If you *do* want this, then we should just use CMFAdding form
Products.Five, by the way).
The add view should be registered for IContainerish, unless it's a type
addable only in one particular type of container.
The add view needs to do some checking that adding is allowed, too; see
the pasted file above.
>> Or should all views have a default portal type that is used if we
>> access
>> add views directly? In that case we would register the add view for
>> the
>> container.
I think if you access @@add directly, you get an error. I can't see
there being a use case for a default type.
>> plone.dexterity[3] uses an @@add-dexterity-content traverser, but I
>> don't think product names like dexterity or cmf should be visible in
>> URLs. Those are implementation details that should be transparent
>> for users.
>
> I agree.
I agree with that sentiment, but it doesn't really matter, I don't
think. Users never type add view URLs anyway, do they - they come from
actions :)
My preference is actually @@add. However, that's very generic. Like I
said, Dexterity needs its own version to have its own semantics, which
means it needs its own name. I didn't want to do an @@add "override" or
anything like that, since not all content is going to be Dexterity-managed.
So, in summary:
+1 for http://site.com/folder/@@add/PortalType
-1 for anything with .html
...and + is probably not going to work.
One last thing to note: You need to put the portal type in the URL, but
portal types can have spaces and the like in the name. That's probably
not a problem, but there may be a case for some kind of normalisation.
Cheers,
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-CMF
mailing list