Java: получение идентификатора статьи из портлета веб-материалов - PullRequest
1 голос
/ 26 декабря 2011

На моей веб-странице есть два портлета:

Первый - это портлет веб-контента, который позволяет выбрать статью и отобразить ее.

Другой - это портлет I 'Я работаю над (Struts MVC).Во втором портлете я хочу получить идентификатор статьи, используемый для отображения веб-содержимого в первом портлете.

Возможно ли это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 сентября 2012

Вы можете сделать это, используя некоторые специфичные для Liferay API, хотя этот подход не идеален, но он будет работать.

Вы можете использовать Liferay API для получения списка портлетов, доступных в данный момент на странице. Затем вы можете определить по идентификаторам портлетов, какие портлеты имеют тип WebContentDisplay. Затем вы можете прочитать их настройки и там будет идентификатор статьи WebContent, которую они отображают.

Обратите внимание, что могут быть случаи, когда у вас есть более одного портлета WebContent Display на странице, или у вас нет ни одного из них. Вы можете либо прочитать список портлетов на странице каждого рендера, либо создать страницу конфигурации, где вы можете отобразить поле выбора для администратора сайта, чтобы выбрать, из какого экземпляра WebContent Display Portlet следует брать значение.

Позвольте мне показать вам код для первого варианта и второго варианта, если он вам понадобится. Полагаю, вы определите, как его реализовать, из данного примера кода (обратите внимание на комментарии):

import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.PortletConstants;
import com.liferay.portal.model.PortletPreferences;
import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portlet.PortletPreferencesFactoryUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

import java.io.IOException;
import java.util.List;

import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * Portlet implementation class WCDPrefReaderPortlet
 */
public class WCDPrefReaderPortlet extends MVCPortlet {

    public void doView(RenderRequest request, RenderResponse response)
            throws IOException, PortletException {
        // Obtain Liferay's ThemeDisplay object (typical operation in Liferay)
        ThemeDisplay themeDisplay = (ThemeDisplay) request
                .getAttribute(WebKeys.THEME_DISPLAY);

        // Get ID of current page
        long plid = themeDisplay.getPlid();
        try {
            // Obtain portlets on current page as list of
            // com.liferay.portal.model.PortletPreferences
            List<PortletPreferences> pagePortlets = PortletPreferencesLocalServiceUtil
                    .getPortletPreferencesByPlid(plid);
            for (PortletPreferences portlet : pagePortlets) {
                // Portlet ID
                String portletId = portlet.getPortletId();
                // WebContent Display portlet has ID 56. Also it's instanceable,
                // so we expect instance ID to be present, i.e.
                // 56_INSTANCE_NWWDuJPL64xa
                // 56_INSTANCE_N1m7pQGwcScG
                // would be IDs of WebContent Display portlet

                // PortletConstants.getRootPortletId(portletId) will return
                // portlet ID part without instance ID. I.e. we expect just "56"
                if ("56".equals(PortletConstants.getRootPortletId(portletId))) {
                    // If we would have portlet ID stored, we could load it's
                    // preferences using this code:
                    // PortletPreferencesLocalServiceUtil.getPortletPreferences(plid,
                    // portletId);
                    // Not needed for now, since we already have the
                    // corresponding
                    // com.liferay.portal.model.PortletPreferences object

                    // Here we get portlet preferences as XML -
                    // Liferay stores them that way
                    String prefsAsXml = portlet.getPreferences();

                    // Parsing XML and creating Portlet API PortletPreferences
                    // object
                    javax.portlet.PortletPreferences prefs = PortletPreferencesFactoryUtil
                            .fromDefaultXML(prefsAsXml);

                    // Read preference named "articleId" - WebContent Display
                    // Portlet uses this preference to store articleId
                    String articleId = prefs.getValue("articleId", null);

                    // Do something with the articleId value
                    System.out.println(articleId);
                }
            }
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        super.doView(request, response);
    }

}
1 голос
/ 27 декабря 2011

Да, вы можете обмениваться данными между двумя разными портлетами, устанавливая их в сеансе. Установите идентификатор статьи, отредактировав код портлета (1-го портлета), установите его в сеансе и загрузите в свой портлет.

Для установки и получения значений (пример связи между портлетами) -> Проверьте это

...