Liferay предупреждает пользователя, когда портлет отсутствует - PullRequest
5 голосов
/ 08 февраля 2012

Предположим, что портлет X развернут в Liferay и имеет дружественный URL-адрес.Предположим, пользователь входит в портал Liferay через сопоставленный URL-адрес, но портлет отсутствует на портале - он развернут, но не добавлен на страницу.

Моя проблема заключается в том, что когда пользователь использует сопоставленный URL-адрес, ничего не происходит- портал не дает визуальной обратной связи, что портлет target отсутствует.

Как я могу это изменить?Мне нужно какое-то предупреждение / уведомление для пользователя ...

- edit -

Мне не нужно использовать второй портлет для проверки наличия еще одного портлета.

С наилучшими пожеланиями,

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

AFAIK, естественный способ сделать это не существует.Портлет не обязательно должен быть установлен на странице .Итак, поведение вполне нормальное.

Одно довольно хакерское решение, которое я мог бы придумать:

  1. Получить объект ThemeDisplay вJSP, использующий <liferay-theme:defineObjects />, который предоставит неявный объект themeDisplay в области JSP.

  2. Получите строку настроек типа, используя:

    String typeSettings = themeDisplay.getLayout().getTypeSettings();
    
  3. Параметры типа будут иметь следующие значения:

    layout-template-id=foobar_2column
    sitemap-include=1
    column-1=foo_WAR_barportlet,abc_WAR_barportlet,56_INSTANCE_K4Vv,
    column-2=baz_WAR_xyzportlet,
    sitemap-changefreq=daily
    
  4. Так что если у вас есть не экземплярный портлет с идентификатором foo внутри файла WAR barуникальный идентификатор портлета в макете будет foo_WAR_barportlet.

  5. Как только вы узнаете, какой ID портлета вы ожидаете, это просто проверка строки содержит проверку.

    <% if(!typeSettings.contains("foo_WAR_barportlet")) { %>
        <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3>
    <% } %>
    

Вы можете выполнить вышеуказанные шаги даже внутри темы, но тогда вам придется делать это в Velocity вместо Java.Надеюсь, что это поможет.

РЕДАКТИРОВАТЬ

Вы можете добавить эту строку в вашем portal_normal.vm

#if(!$layout.getTypeSettings().contains("foo_WAR_barportlet"))
    <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3>
#end
1 голос
/ 08 февраля 2012

Да, вы можете добиться этого с помощью связи между портлетами, чтобы уведомить пользователя, добавлен ли портлет на страницу или нет. вам нужно создать еще один портлет (давайте назовем его ListenerPortlet), который по умолчанию находится на странице.

вы можете добавить портлет Listener в тему, чтобы он по умолчанию добавлялся на каждую страницу.

Теперь, когда вы добавляете свой портлет на свою страницу, ваш портлет должен вызвать событие javascript на стороне клиента и уведомить ваш портлет Listener о том, что ваш портлет добавлен на вашу страницу.

Из вашего вызова портлета,

Liferay.trigger(eventName, data)

и привяжите ваш портлет Listener к событию

 Liferay.bind(eventName, function, [scope]) //make the scope as page

Таким образом ваш портлет прослушивателя будет знать, добавлен ли ваш портлет на страницу или нет. и вы можете отобразить сообщение пользователю, если портлет не добавлен.

Для дальнейшего ознакомления проверьте МПК

и, более конкретно, Связь между портлетами на стороне клиента

0 голосов
/ 08 февраля 2012

Было бы лучше, если мы попробуем это,

ThemeDisplay themeDisplay = request.getAttribute(WebKeys.THEME_DISPLAY);

Layout layout = LayoutLocalServiceUtil.getLayout(themeDisplay.getLayout().getPlid());
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();

List allPortletIds = layoutTypePortlet.getPortletIds();

Если список пуст, то на странице нет портлетов.

Получение LayoutTypePortlet гарантирует, что страница, на которую был перенаправлен пользователь, является портлетом типа макета.

...