[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