假设将portlet X部署到Liferay并且映射了友好的URL。假设用户通过映射的URL进入Liferay Portal,但门户网站中没有portlet - 它已部署但未添加到页面中。
我的问题是当用户使用映射的URL时没有任何反应 - 门户网站没有提供视觉反馈,目标 portlet不存在。
我该如何改变?我需要向用户提供某种警报/通知......
- 编辑 -
我不需要使用第二个portlet来检查是否存在另一个portlet。
最诚挚的问候,
答案 0 :(得分:4)
AFAIK,没有 natual 方法来实现这一目标。始终在页面上安装portlet 。所以,这种行为很正常。
我能想到的一个相当 hacky 的解决方案:
使用ThemeDisplay
获取JSP中的<liferay-theme:defineObjects />
对象,这将在JSP范围中公开隐式对象themeDisplay
。
使用以下方法获取类型设置字符串:
String typeSettings = themeDisplay.getLayout().getTypeSettings();
类型设置的值如下所示:
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
因此,如果您在WAR中有一个ID为foo
的不可实例的portlet
文件bar
,布局上的portlet唯一ID
foo_WAR_barportlet
。
一旦你知道你期望出现的portlet 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 :(得分: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
答案 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。