2013-03-19 66 views
1

在ajax回調瀏覽器視圖中更新文件系統開發的定製portlet我有以下代碼來檢索生成ajax請求的portlet的關聯portlet分配:以編程方式獲取按顯示項目顯示的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請求的內容片段是不是很好的做法?

我將在一天結束時更新整個portlet的github回購,日期爲https://github.com/tdkuehnel/kuehnel.portlets.moonphase,以反映當前的發展狀態。在CentOS

回答

0

的Plone 4.2.4擴建,我有這個問題。

的Portlet呈現機械獲取兩次它看起來像踢來呈現

  • 一:當前文件夾的門戶

  • B:該文件設置爲DEFAULT_PAGE上的portlet該文件夾

不知何故。我不知道機器究竟是如何避免在這個過程中再次的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 
    ... 

現在它可以工作。但是,我想知道它是否真的需要開發人員在代碼中處理這種特殊情況,並且所有的適配器和接口的東西都應該在應該照顧一切。 我怎麼知道某人開發Portlet管理器和/或檢索器來顯示我的portlet。我無法處理特殊情況甚至沒有開發,所以我想我錯過了一些東西在我找到的路上運動代碼。希望它。或者門戶機器需要適應。有人請說明這一點。