我正在开发一个portlet来显示来自多个RSS源的内容,并在特定超时后定期更新它们。所以我正在研究plone的RSS portlet(plone.app.portlets.portlets.rss)。
它使用IDeferredPortletRenderer接口,看起来很棒。他们有一个方法deferred_update(),它“刷新KSS事件上的portlet数据(并且只有那时)”,这似乎是我正在寻找的。我无法找到的是KSS电话。
更新RSS portlet的KSS调用在哪里?这是正确的方法还是我应该使用jQuery定期更新portlet片段?
感谢。
答案 0 :(得分:2)
您可以调用特殊的KSS视图@@refreshPortlet
来通过AJAX加载portlet。响应是一个XML文档,其中<param name="html">
元素包含新的HTML片段。您可以在站点根目录或当前上下文中调用此方法,无论哪种方法更适合您的可达性。
以下内容取自生产网站,并不完整,但应该给您一个想法:
// $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);
}
});
变量$wrapper
引用portletWrapper
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存储在某个数据属性中的包装器上,以确保我在正确的上下文中检索portlet,否则它将显示错误的信息。