[Zope3-dev] Re: How to add objects?
Jeff Rush
jeff at taupro.com
Thu Dec 8 17:51:47 EST 2005
Philipp von Weitershausen wrote:
> Florian Lindner wrote:
>
>> Of course, I've a already defined a addform, but this is only for the
>> ZMI:
>>
>> <addform
>> label="Add CSEvent"
>> name="AddCSEvent.html"
>> schema="..interfaces.IEvent"
>> content_factory="..event.Event"
>> permission="zope.ManageContent"
>> />
>
> In Zope 2, "only for the ZMI" would be correct. In Zope 3, the line
> between the ZMI and a custom user interface has been blurred. Stuff that
> you define for the ZMI can largely be reused in a custom user interface.
> I other words, the ZMI in Zope 3 is just *one* user interface. Take it,
> customize it, and voila, you have your own user interface.
Coming from Zope 2 myself, where you always had to create parallel add/edit
presentation forms if you wanted your objects to be both ZMI and non-ZMI
manipulatable, I see his confusion. I'm wrestling with it now and still see
gaps, perhaps to my newbie understanding of Zope 3.
I'm wondering if, in the Zope 3 world, it's going to become common to expose
the ZMI, in a tightly-controlled, re-skinned way, to the non-technical
end-user. Something we could never do in Zope 2.
>> My questions are:
>>
>> a) How to I configure such a add form?
>
> You already did so (the above addform directive). Your assumption that
> this only works in the "ZMI" is incorrect. It works in any user
> interface (=skin) that you create and that is based on the 'default' layer.
>
>> c) If the form needs a supporting view class, how do the class has to
>> look like?
>
> Most of the time you don't need a class that supports the view unless
> you want to do some very customized stuff.
I was hoping that but I'm not finding this to be true. It seems I need a
view in common cases.
[1] If I want to redirect the user to an "operation completed" page, I must
define a view with a nextURL() method. However if I want to reuse that same
page for ZMI add operations, I must duplicate it so that it goes to
@@contents.html and leave out my view. It seems I want a default nextURL()
that just uses HTTP_REFERER, so that after an add/edit, you are returned to
where you started, ZMI or not ZMI (although the original HTTP_REFERER would
have to be passed thru a sequence of pages related to the view).
Perhaps I could do this with layers/skins, but it doesn't seem to be the
case that ZMI and non-ZMI seamlessly use different skins in which I could
factor such things.
So my solution is, for each object, to define a newblah.html and an
addblah.html, where the former is used for non-ZMI and the latter is placed
on the ZMI add-menu bar. And the only difference in those .html definitions
is one has a class= view defined and the other doesn't. Seems kludgey.
[2] The other use-case that requires views is any filtering at all. Under
Zope 2 it was common here to off-the-cuff (TTW) drop the following into the
index_html of a folder to display a list of items of specific metatypes:
<li tal:repeat="item container/objectValues">
<span tal:condition="python:item.meta_type == 'Folder'">
<a tal:attributes="href string:${item/getId}"
tal:content="item/title_or_id"> Item Title or Id </a>
</span>
</li>
I saw the argument posted elsewhere that TAL should not be used for
filtering, and I agree TAL has been abused for complex logic over the years.
But requiring a view class just to perform something like "item.meta_type
== 'Folder'" (eg. (IFolder.providedBy(item)) seems a bit burdensome.
I've tried doing something like the following but after several hours for
something so simple its not working:
<li tal:define="IVentureSet
modules/webaccountant.ventures.interfaces/IVentureSet"
tal:repeat="item context/values"
tal:condition="python: IVentureSet.providedBy(item)">
<a tal:attributes="href string:${item/@@absolute_url}"
tal:content="python: item.name"></a>
</li>
So a view class it is.
But the main thing for me is object addition, in a flexible manner and
discovering the new philosphy of ZMI versus non-ZMI.
-Jeff
More information about the Zope3-dev
mailing list