[Product-Developers] Re: portlet rendering in python code

Daniel Widerin daniel.widerin at kombinat.at
Wed May 14 15:54:56 UTC 2008

Martin Aspeli schrieb:
> Daniel Widerin wrote:
>> Martin Aspeli schrieb:
>>> Daniel Widerin wrote:
>>>> Hello,
>>>> I need some portlets to be rendered (i need their rendered html 
>>>> code) in browser view. these portlets expect only one parameter, an 
>>>> object_uid, which i passed to portlet renderer successfully.
>>> Why? :)
>>> It sounds to me like you should just do this with views or 
>>> ViewPageTemplateFiles or viewlets.
>> i want to select portlets in kupu using mediaobjects to make "content 
>> portlets" being rendered in kupu-text.
>> i added some of my custom types (which all have a portlet too) to 
>> mediaobject resource types in kupu configuration to make them 
>> selectable using the place-image-button.
>> i added these types into the action-url table in kupu configuration
>> preview: 
>> string:++resource++gesundesleben.theme.images/contentPluginPreview_${portal_type}.gif?ContentPluginUrl=${object_url} 
>> normal image:
>> string:++resource++gesundesleben.theme.images/contentPlugin_${portal_type}.gif?ContentPluginUrl=${object_url} 
>> now i can add my types using placeholder images into my kupu text, and 
>> give them image-left, image-right classes to make text float around.
>> on save i replace ${object_url} with physicalpath of the selected 
>> object. (sorry, but only portal_type and object_url are available in 
>> kupu resource types configuration).
>> in my browser view, i parse the kupu-text and replace all images with 
>> img-tags which use the 
>> contentPlugin_${portal_type}.gif?ContentPluginUrl=${object_url} scheme 
>> with the rendered portlet code. through the physicalpath i can locate 
>> the object and then get the rendered portlet using an adapter with my 
>> own factory.
>> i hope you understand what i'm trying to do here, i know it's not a 
>> nice way but using the kupu place-image-button makes it very simple 
>> for reviewers to add such content portlets
> Interestingly, this is a lot like something we've talked about doing in 
> Plone proper. See 
> http://limi.net/articles/simplify-plones-editing-experience.
> The way I thought about implementing that would be to have a special 
> contextual portlet manager, much like collective.portletpage does. We'd 
> extend it so that it had a way to render one particular portlet, rather 
> than just looping through all its portlets and rendering them one by one.
> In kupu, you'd actually get an <img /> tag with particular attributes 
> (e.g. rel="widget" if that's allowed, or something similar, and 
> id="some-portlet-id"). Upon rendering of the page, a new transform would 
> replace such img tags with their respective portlets, by asking the 
> portlet manager to render them.
>>>> i tried to call the portlet directly and construct the parameters 
>>>> for the render method, but still failed.
>>> You need to be more specific about what you tried.
>>> The general approach should be to get the portlet assignment, make 
>>> sure it's acquisition-wrapped, and then adapt to IPortletRenderer, 
>>> making sure the portlet renderer is acquisition wrapped in the 
>>> context, and then call update() and then render() on it.
>>> You'll need to look at the portlet manager code, in particular 
>>> _lazyLoadPortlets().
>>>> i get a Unauthorized Exception in DC.Bindings as described here: 
>>>> http://plone.org/documentation/error/unauthorized-not-authorized-to-access-binding-context 
>> i still get the unauthorized exception - but it works if i do a
>> except Unauthorized:
>>      pass
>> instead of raising the UnauthorizedBindingException. I think i have to 
>> search the right context for doing such things...
> Mmm that doesn't sound right. :)

i did it - it works now!

the reason why it did not work for my code is a bug in five described 
here: https://bugs.launchpad.net/zope2/+bug/176566

... i'm posting this here just to save time for people who fight against 
the same problem

> I think you need to use the portlet manager setup code and just extend 
> it (you can register a custom portlet manager) to be able to render just 
> one portlet by id.
> Look at collective.portletpage for some more inspiration.
> Martin

More information about the Product-Developers mailing list