Как периодически обновлять содержимое портлета?

Я разрабатываю портлет, чтобы показать содержимое из нескольких 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-адрес портлета в оболочке в атрибуте данных в определенном виде, чтобы убедиться, что я получаю портлеты в правильном контексте, так как в противном случае он отображал бы неверную информацию.

Другие вопросы по тегам