
charlie at begeistert
Dec 2, 2009, 6:31 AM
Post #2 of 14
(1316 views)
Permalink
|
Am 01.12.2009, 07:52 Uhr, schrieb Jens Vagelpohl <jens [at] dataflake>: > Reminder: After this week (probably this coming Sunday) I plan on doing > the first CMF 2.2 beta, and creating the 2.2 release branch. My CSS stuff won't make it into the beta. I would like to contribute some documentation on Yuppie's new add views but also continue the discussion. As things currently stand Yuppie has implemented some very flexible add views that are almost entirely type definition-based. If a type definition has something in the new add view URL field then it will automatically be picked up for folder actions: atool = getToolByName(self.context, 'portal_actions') actions = atool.listFilteredActionsFor(self.context) return actions.get("folder/add", {}) A really nice thing is support for schemaless, default add views that only require this URL of the form string:${folder_url}/++add++Document This will get you a form with just a single field for the id. Dedicated schema-based add views are trivial to add: from zope.formlib import form from Products.CMFDefault.formlib.form import ContentAddFormBase from MyApp.interfaces import IMyContentType class MyAddView(ContentAddFormBase): form_fields = form.FormFields(IMyContentType) May be all you need. Otherwise there are examples for CMF Link and CMF Favourite. We have a use case where we need the object creation without any kind of fields (id's are automatically assigned) and this is easy to implement def __call__(self): self.createAndAdd({}) You need to remember to return a new view or a redirect from the call which in this case is likely to be something other than an object's inital view. For example, returning self.request.response.redirect(self.request.HTTP_REFERER) lets you create lots of objects in a folder one after the other. Hooking everything together is, however, a bit clunky: <adapter name="myproduct.content_type_factory" factory=".myproduct.MyAddView" /> <class class=".myproduct.MyAddView"> <require permission="cmf.AddPortalContent" interface="zope.formlib.interfaces.IPageForm" /> </class> For the sake of clarity it would be nice to have a directive that ties this together. Particularly the juxtaposition of the adapter name (which has to be the same as the named content type factory utility) and the view acting as a factory is a definite possible source of confusion. And, while I much prefer the security declaration outside of the view class, the combination is a bit unintuitive. I would find something like: <cmf:addView factory="myproduct.content_type_factory" class=".myproduct.MyAddView" permission="cmf.AddPortalContent" required-inteface="zope.formlib.interfaces.IPageForm" /> easier to work with. I'm also not sure if the add view URL couldn't be simpler because the ++add++ContentTypeId is a must, why this can't be interpolated either on type registration or in the add_action look-up. Is there any reason why this couldn't or shouldn't be the case? *** Having finally taken the plunge into buildout I've been able to upgrade one of our projects onto Zope 2.12 and CMF 2.2 with no real problems just the odd "surprise". Thank you all very much for your help with Zope + CMF! Charlie -- Charlie Clark Helmholtzstr. 20 Düsseldorf D- 40215 Tel: +49-211-938-5360 GSM: +49-178-782-6226 _______________________________________________ Zope-CMF maillist - Zope-CMF [at] zope https://mail.zope.org/mailman/listinfo/zope-cmf See https://bugs.launchpad.net/zope-cmf/ for bug reports and feature requests
|