[Product-Developers] Re: Traversing from a z3c.form action handler

cewing cewing at u.washington.edu
Mon Feb 15 06:29:22 UTC 2010


Thanks for the tips.

Based on the input I got from Carsten and you, I've come up with this as an
override of the plone.z3cform FormWrapper class:

class HydraCrudFormWrapper(FormWrapper):
    """ subclass the formwrapper so that we can hide the green frame
        on all CRUD-based forms
    def __init__(self, context, request):
        """ hide the green frame
        super(HydraCrudFormWrapper, self).__init__(context, request)
        self.request.set('disable_border', 1)
    def update(self):    
        z2.switch_on(self, request_layer=self.request_layer)

        return_path = getattr(self.form_instance, '_return_other', None)
        if return_path:
            base_path = self.context.absolute_url_path()
            path = base_path + return_path
            view = self.context.restrictedTraverse(path)
            if view:
                self._contents = view()
            self.contents = self.form_instance.render()
    def __call__(self):
        rp = getattr(self.form_instance, '_return_other', None)
        if rp:
            return self._contents
            return self.render()

By combining this with a bit of stuff in the button handlers that sets a
path-ending string for the redirect above and I've got a mix that allows me
to create buttons that either process their own form values or pass them
along to some pre-built plone script.  Pretty nifty! 

    def handle_state_change(self, action):
        """ traverse to the content_status_share form for processing
        true_context = self.context.context
        selected = self.selected_items()
        if not selected:
            IStatusMessage(self.request).add("No items have been selected",
        paths = [item.absolute_url_path() for id, item in selected]
        self.request.form['paths'] = paths
        self.context._return_other = "/content_status_history"

It was especially interesting to try to accomplish since the forms in
question are all based on the plone.z3cform CRUD form.  That sure added a
bit of fun.

Anyway, here's a pointer to a solution in case someone else comes along
later and needs a similar trick.

Thanks again Martin, and Carsten.  
View this message in context: http://n2.nabble.com/Traversing-from-a-z3c-form-action-handler-tp4569560p4573146.html
Sent from the Product Developers mailing list archive at Nabble.com.

More information about the Product-Developers mailing list