如何定期更新组件内容



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

它使用IDeferredPortletRenderer接口,看起来很棒。他们有一个方法 deferred_update() 它"刷新 KSS 事件上的 portlet 数据(然后才刷新)",这似乎是我正在寻找的。我找不到的是KSS呼叫。

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

谢谢。

您可以调用特殊的 KSS 视图@@refreshPortlet,用于通过 AJAX 装入 Portlet。响应是一个 XML 文档,其中包含一个包含新 HTML 代码段的 <param name="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 是指portletWrapperdiv:

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

相关内容

  • 没有找到相关文章

最新更新