2012-02-08 60 views
5

假设门户X Liferay的警告用户将被部署到Liferay的并具有映射一个友好的URL。假设一个用户通过映射URL进入Liferay门户,但portlet中不存在在门户网站 - 它的部署,但不会添加到页面。时的portlet不存在

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

我该如何改变这种情况?我需要某种形式的警告/通知用户...

- 编辑 -

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

最亲切的问候,

回答

4

据我所知,没有做到这一点没有博物方式。一个portlet 不必始终安装在页面上。所以,这种行为是很正常的。

一个相当哈克解决方案,我能想到的:在JSP中ThemeDisplay对象使用<liferay-theme:defineObjects />这将暴露隐含对象themeDisplay在JSP范围

  1. 弄个。使用类型设置字符串

  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. 所以,如果你有ID非instanceable门户foo内WAR文件 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> 
    <% } %> 
    

你可以做上面的步骤,甚至内部的主题,但你必须这样做,在速度而不是Java即可。希望有所帮助。

编辑

您可以添加内这一行你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 2012-02-08 10:48:00

+0

您可以将其添加到主题中,但随着主题用Velocity编写,您必须稍微修改它。 – adarshr 2012-02-08 12:51:53

+0

@Queequeg看到我的更新 – adarshr 2012-02-08 12:54:56

1

是的,你可以做到这一点通过Portlet间的通信,通知用户的门户是否被添加到页面或不是。您需要创建另一个默认位于页面上的portlet(让我们称之为ListenerPortlet)。

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

现在,当您将portlet添加到页面时,您的portlet应该触发客户端JavaScript事件并通知您的侦听器portlet将您的portlet添加到您的页面。

从您的portlet电话,

Liferay.trigger(eventName, data) 

和监听器的portlet绑定到事件

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

这样,你的监听器portlet将知道如果Portlet添加到页面或不是。如果未添加Portlet,则可以向用户显示消息。

更多参考检查IPC

更具体client-side Inter portlet communicaton

+0

谢谢你的回复。问题是我不想要另一个portlet - 它可以像第一个portlet一样简单地关闭。我需要一个通用的警报,而不是Liferay Portal而不是一个单独的Portlet。 – Queequeg 2012-02-08 10:44:20

+0

Liferay没有提供这样的直接方法,它会告诉portlet是否被添加到页面中。 – 2012-02-08 11:42:29

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。

+0

我在哪里添加此代码? – Queequeg 2012-02-08 10:46:32

+0

@sharanbm,这是一个好主意,但这些代码仍然会进入一个portlet,它需要添加到页面中。 – 2012-02-08 11:48:18

+0

@Queequeg您需要创建一个MVCPortlet并将其放入该代码中,并且该Portlet应添加到页面中。 – 2012-02-08 11:49:13