Получить тип портлета в Liferay 6.2 Hook

Внутри Liferay 6.2 ловушка Я хочу узнать тип портлета (публикатор активов/отображение веб-контента). Имя портлета мне не поможет, поскольку пользователь мог использовать настраиваемый заголовок, и в этом случае «Asset Publisher»/«Отображение веб-контента» не будут доступны для меня.

Точное расположение файла ловушки, где я хочу использовать тип портлета: /html/portlet/portlet_css/view.jsp


person Dhruv Pandey    schedule 08.12.2016    source источник


Ответы (2)


Ну, без подключения других частей Liferay вы не можете получить его там (в java-коде). Портлет «Portlet CSS» заполняется с помощью javascript, поэтому, по-видимому, нет необходимости отправлять идентификатор порта в качестве параметра.

Чтобы получить portletId, вы также должны подключить /html/js/liferay/look_and_feel.js

autoLoad: false,
showLoading: false,
data: {
    p_l_id: themeDisplay.getPlid(),
    p_p_id: 113,
    p_p_state: EXCLUSIVE,
    doAsUserId: themeDisplay.getDoAsUserIdEncoded()
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'

изменить его, чтобы было что-то вроде этого

autoLoad: false,
showLoading: false,
data: {
    p_l_id: themeDisplay.getPlid(),
    p_p_id: 113,
    p_p_state: EXCLUSIVE,
    doAsUserId: themeDisplay.getDoAsUserIdEncoded(),
    _113_portletId: instance._portletId
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'

Были добавлены запятая и _113_portletId: instance._portletId.

После этого вы можете добавить к нему /html/portlet/portlet_css/view.jsp

String portletId = (String) renderRequest.getParameter("portletId");

portletId для издателя активов будет примерно таким: 101_INSTANCE_reKokSN3aDaL

portletId для отображения веб-контента будет выглядеть примерно так: 56_INSTANCE_dxNxXuQ7ZuvB

поэтому вы можете проверить, начинается ли portletId со 101, 56,...

Вы также можете получить объект Portlet с помощью

PortletLocalServiceUtil.getPortletById(portletId);

ОБНОВЛЕНИЕ (ответ на вопрос в комментарии):

Этот портлет не предназначен для такого использования, после загрузки он остается в формате html, а все изменения выполняются с помощью javascript.

Когда «Внешний вид» открывается в первый раз после загрузки страницы, делается запрос XHR на сервер и отображается «/html/portlet/portlet_css/view.jsp». Во второй раз (для другого портлета на той же странице) javascript подготавливает модальное окно для другого (или того же) портлета, "/html/portlet/portlet_css/view.jsp" больше не будет отображаться.

Чтобы принудительно выполнить повторную визуализацию "/html/portlet/portlet_css/view.jsp", снова измените "/html/js/liferay/look_and_feel.js".

после (в моем исходнике это строка 136)

if (!content) {
    content = A.Node.create('<div class="loading-animation" />');
} 

Добавь это

if (instance._currentPopup) {
    A.one("#" + instance._currentPopup.get("id")).remove()
    instance._currentPopup = null;
}

Это должно быть до

if (!instance._currentPopup) {
    instance._currentPopup = Liferay.Util.Window.getWindow(
    ...

Очистите Liferay и кэш браузера.

person Martin Gamulin    schedule 08.12.2016
comment
Спасибо. но почему я получаю одинаковые идентификаторы портлетов для всех портлетов. когда я обновляю страницу, только я получаю новый идентификатор - person Dhruv Pandey; 13.12.2016

Вы можете получить объект PortletDisplay из контекстного объекта ThemeDisplay, а из PortletDisplay вы можете получить Title, PortletName и т. д.

Обратите внимание, что themeDisplay уже доступен и используется в вашем jsp /html/portlet/portlet_css/view.jsp PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); String title=portletDisplay.getTitle(); String portletName=portletDisplay.getPortletName();

person Pankaj Kathiriya    schedule 08.12.2016