如何定期更新portlet内容?

时间:2012-05-16 15:14:51

标签: jquery plone kss

我正在开发一个portlet来显示来自多个RSS源的内容,并在特定超时后定期更新它们。所以我正在研究plone的RSS portlet(plone.app.portlets.portlets.rss)。

它使用IDeferredPortletRenderer接口,看起来很棒。他们有一个方法deferred_update(),它“刷新KSS事件上的portlet数据(并且只有那时)”,这似乎是我正在寻找的。我无法找到的是KSS电话。

更新RSS portlet的KSS调用在哪里?这是正确的方法还是我应该使用jQuery定期更新portlet片段?

感谢。

1 个答案:

答案 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,否则它将显示错误的信息。