以编程方式获取由项目显示动态视图显示的portlet的portlet分配

时间:2013-03-19 18:06:54

标签: ajax plone portlet

在ajax回调浏览器视图中更新文件系统开发的自定义portlet我有以下代码来检索生成ajax请求的portlet的关联portlet分配:

def getPortletById(self, content, portletManager, key, name):
    manager = getUtility(IPortletManager, name=portletManager, context=content)
    retriever = getMultiAdapter((content, manager,), IPortletRetriever)

    print "getPortletById:  ",content, portletManager, key, name
    print "iterating portlet assignements:"
    for assignment in retriever.getPortlets():
        print assignment["key"], assignment["name"]
        if assignment["key"] == key and assignment["name"] == name:
            return assignment["assignment"]
    return None

def getPortletManager(self, column):
    manager = getUtility(IPortletManager, name=column)
    return manager

def render(self):
    print "refreshment of moonphase portlet"
    content = self.context.aq_inner

    print self.context
    name = self.request.form.get("portletName")
    managername = self.request.form.get("portletManager")
    key = self.request.form.get("portletKey")

    print name, managername, key
    portlet = self.getPortletById(content, managername, key, name)
    manager = self.getPortletManager(managername)
    managerRenderer = manager(content, self.request, self)
    renderer = managerRenderer._dataToPortlet(portlet.data)
    renderer.update()
    return renderer.render()

只要生成请求的portlet直接分配给内容或其父文件夹并显示,这就可以正常工作。但是当我设置文件夹的默认视图时 对于分配了portlet的内容项,迭代不会找到在页面上呈现的portlet作为默认文件夹视图的一部分。

<PloneSite at naturfreundeskreis>
moonphase-portlet plone.rightcolumn /naturfreundeskreis/naturfreundeskreis
getPortletById:   <PloneSite at naturfreundeskreis> plone.rightcolumns /naturfreundeskreis/naturfreundeskreis moonphase-portlet
iterating portlet assignements
/naturfreundeskreis calendar
2013-03-19 13:48:31 ERROR Zope.SiteErrorLog 1363715311.150.739587723624 http://midgard.user.openhosting.com:8280/naturfreundeskreis/@@refreshMoonphase
Traceback (innermost last):
Module ZPublisher.Publish, line 126, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 46, in call_object
Module kuehnel.portlets.moonphase.moonphaseview, line 21, in __call__
Module kuehnel.portlets.moonphase.moonphaseview, line 59, in render
AttributeError: 'NoneType' object has no attribute 'data'

初始portlet呈现过程以某种方式找到了portlet,因为它显示并生成请求。但是我不能。我错了什么?

使用浏览器视图提供ajax请求的内容片段是一种好习惯吗?

我会在一天结束时在https://github.com/tdkuehnel/kuehnel.portlets.moonphase更新整个portlet的github repo,以反映当前的开发状态。

Plone 4.2.4在Centos上的扩建

1 个答案:

答案 0 :(得分:0)

好的,我遇到了问题。

portlet呈现机制被踢了两次它看起来像来呈现

  • a:当前文件夹的portlet

  • b:文档的portlet设置为该文件夹的default_page

不知何故。我不确切知道机器如何避免在此过程中再次呈现 portlet,但是这条信息本身足以在浏览器视图中调整我的ajax回调例程,如下所示:

def render(self):
    ...
    portlet = self.getPortletById(content, managername, key, name)
    if not portlet:
        # let's try to find it assigned on the default_page view
        defaultpage = getattr(content,getattr(content,"default_page",None),None)
        if defaultpage:
            portlet = self.getPortletById(defaultpage, managername, key, name)
            content = defaultpage
        else:
            logger.warn('cannot find an assignment for a portlet of type %s in ajax update request' % name)
            return None
    ...

现在可以使用了。但我想知道它是否真的需要开发人员在他们的代码中处理这些特殊情况,并且应该处理所有内容的所有适配器和接口。 我怎么知道有人开发什么PortletManagers和/或Retrievers来显示我的portlet。我无法处理特殊情况甚至没有开发,所以我想我错过了一些东西在我的发现中到我的portlet代码。希望它。或者需要调整portlet机制。有人请对此有所了解。