2012-02-08 4 views
5

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

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

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

- редактировать -

мне не нужно использовать второй портлет, чтобы проверить наличие еще одного окна портала.

сердечным приветом,

ответ

4

AFAIK, нет Natual способ, чтобы это произошло. Портлет не обязательно всегда должен быть установлен на странице. Таким образом, поведение вполне нормально.

Один довольно Hacky решения, которое я мог думать:

  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. Так что, если у вас есть не-instanceable портлет с идентификатором foo внутри WAR файл bar, уникальный идентификатор портлета на макете будет foo_WAR_barportlet.

  5. После того, как вы знаете идентификатор портлета, который вы ожидаете присутствовать, это всего лишь вопрос о том, что строка содержит проверку.

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

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

EDIT

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

#if(!$layout.getTypeSettings().contains("foo_WAR_barportlet")) 
    <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3> 
#end 
+0

где я могу добавить этот код? – Queequeg

+0

Вы можете добавить это в тему, но тогда вам придется немного изменить его, поскольку темы написаны в Velocity. – adarshr

+0

@Queequeg см. Мое обновление – adarshr

1

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

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

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

С вашего портлетом вызова

Liferay.trigger(eventName, data) 

и связать ваш Приёмник портлет к событию

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

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

Для получения дополнительной справочной чеки IPC

и более конкретно client-side Inter portlet communicaton

+0

Благодарим вас за ответ. Дело в том, что я не хочу другого портлета - его можно отключить так же просто, как и первый портлет. Мне нужен универсальный сигнал, отображаемый скорее Liferay Portal, чем отдельный портлет. – Queequeg

+0

Существует такой прямой метод, предоставляемый liferay, который будет определять, добавлен ли портлет на страницу или нет. –

0

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

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

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

List allPortletIds = layoutTypePortlet.getPortletIds(); 

Если список пуст, то страница оленья кожа содержат портлет ,

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

+0

Где я могу добавить этот код? – Queequeg

+0

@sharanbm, это хорошая идея, но этот код пойдет в портлет, который нужно добавить на страницу. –

+0

@Queequeg вам нужно создать MVCPortlet и поместить этот код внутри него, и этот портлет должен быть добавлен на страницу. –

Смежные вопросы