2012-05-16 32 views
0

我正在開發一個portlet,以顯示來自多個RSS源的內容,並在特定超時後定期更新它們。所以我正在學習Plone的RSS portlet(plone.app.portlets.portlets.rss)。如何定期更新portlet內容?

它使用IDeferredPortletRenderer接口,它看起來不錯。他們有一個方法deferred_update(),它可以「刷新KSS事件(並且只有這樣)」的portlet數據,這似乎是我正在尋找的。我無法找到的是KSS電話。

更新RSS portlet的KSS調用在哪裏?這是正確的方法還是應該使用jQuery來定期更新Portlet片段?

謝謝。

回答

2

您可以調用特殊的KSS視圖@@refreshPortlet來通過AJAX加載Portlet。響應是一個包含新HTML片段的<param name="html">元素的XML文檔。您可以在網站根目錄或當前上下文中調用此功能,無論哪種方法對您的可玩性更好。

從生產現場採取以下,並且還沒有完全完成,但應該給你一個想法:

// $wrapper is the portlet wrapper div 
var portlethash = $wrapper.attr('id').split('-')[1]; 
var base = $wrapper.data('baseurl') || $('link[rel=kss-base-url]').attr('href'); 
$.ajax({url: base + '/@@refreshPortlet', type: 'GET', dataType: 'xml', 
    data: { portlethash: portlethash }, 
    success: function(data) { 
     var contents = $('dd.portletItem', $(data).find('param[name="html"]').text()); 
     $wrapper.find('dd.portletItem') 
      .replaceWith(contents); 
    } 
}); 

變量$wrapperportletWrapper DIV:

<div id="portletwrapper-[long string of characters]" 
    class="portletWrapper kssattr-portlethash-[long string of characters]"> 
    <dl class="portlet portletSpecificClass"> 
    <dt class="portletHeader"> 
     ... 
    </dt> 
    <dd class="portletItem"> 
     ... 
    </dd> 
    <dd class="portletFooter"> 
     ... 
    </dd> 
    </dl> 
</div> 

注我們使用id屬性中的portlet散列,這是KSS @@refreshPortlet視圖如何知道如何僅呈現portlet。

我將portlet基礎url存儲在某個data屬性的wrapper中,以確保我在正確的上下文中檢索portlet,否則它會顯示錯誤的信息。