Как периодически обновлять содержимое портлета?
Я разрабатываю портлет, чтобы показать содержимое из нескольких RSS-каналов и периодически обновлять их после определенного времени ожидания. Поэтому я изучаю RSS-портлет plone (plone.app.portlets.portlets.rss).
Он использует интерфейс IDeferredPortletRenderer, который выглядит великолепно. У них есть метод deferred_update(), который "обновляет данные портлета о событиях KSS (и только потом)", который, похоже, и является тем, что я ищу. То, что я не могу найти, это вызов KSS.
Где находится вызов KSS, обновляющий портлет RSS? Это правильный подход или я должен использовать jQuery для периодического обновления фрагмента портлета?
Благодарю.
1 ответ
Вы можете вызвать специальный вид KSS @@refreshPortlet
для загрузки портлетов через AJAX. Ответ представляет собой документ 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 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
атрибут, который как KSS @@refreshPortlet
view умеет отображать только портлет.
Я храню базовый URL-адрес портлета в оболочке в атрибуте данных в определенном виде, чтобы убедиться, что я получаю портлеты в правильном контексте, так как в противном случае он отображал бы неверную информацию.