当portlet不存在时,Liferay警告用户

时间:2012-02-08 09:42:38

标签: java spring-mvc liferay portlet

假设将portlet X部署到Liferay并且映射了友好的URL。假设用户通过映射的URL进入Liferay Portal,但门户网站中没有portlet - 它已部署但未添加到页面中。

我的问题是当用户使用映射的URL时没有任何反应 - 门户网站没有提供视觉反馈,目标 portlet不存在。

我该如何改变?我需要向用户提供某种警报/通知......

- 编辑 -

我不需要使用第二个portlet来检查是否存在另一个portlet。

最诚挚的问候,

3 个答案:

答案 0 :(得分:4)

AFAIK,没有 natual 方法来实现这一目标。始终在页面上安装portlet 。所以,这种行为很正常。

我能想到的一个相当 hacky 的解决方案:

  1. 使用ThemeDisplay获取JSP中的<liferay-theme:defineObjects />对象,这将在JSP范围中公开隐式对象themeDisplay

  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. 因此,如果您在WAR中有一个ID为foo的不可实例的portlet 文件bar,布局上的portlet唯一ID foo_WAR_barportlet

  5. 一旦你知道你期望出现的portlet ID, 这只是字符串包含检查的问题。

    <% if(!typeSettings.contains("foo_WAR_barportlet")) { %>
        <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3>
    <% } %>
    
  6. 你甚至可以在主题中执行上述步骤,但是你必须在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 :(得分:1)

是的,您可以使用Portlet间通信实现该目的,以通知用户是否将portlet添加到页面中。你需要创建另一个portlet(让我们称之为ListenerPortlet),它默认位于页面上。

您可以将Listener portlet添加到主题中,以便默认情况下将其添加到每个页面。

现在,当您将portlet添加到页面时,portlet应该触发客户端javascript事件并通知Listener portlet您的portlet已添加到页面中。

从您的portlet调用,

Liferay.trigger(eventName, data)

并将您的Listener portlet绑定到事件

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

这样,您的Listener portlet将知道您的portlet是否已添加到页面中。如果未添加portlet,则可以向用户显示消息。

如需进一步参考,请查看IPC

,更具体地说是client-side Inter portlet communicaton

答案 2 :(得分:0)

如果我们尝试这样做会更好,

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

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

List allPortletIds = layoutTypePortlet.getPortletIds();

如果列表为空,则页面不包含任何portlet。

获取LayoutTypePortlet可确保用户已重定向到的页面是布局类型portlet。