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

Que*_*ueg 5 java portlet spring-mvc liferay

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

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

我怎么能改变呢?我需要向用户提供某种警报/通知......

- 编辑 -

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

最亲切的问候,

ada*_*shr 4

AFAIK,没有自然的方法可以实现这一点。Portlet并不总是需要安装在页面上。所以,这种行为是很正常的。

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

  1. ThemeDisplay使用 JSP 中的对象来获取JSP 范围内的<liferay-theme:defineObjects />隐式对象。themeDisplay

  2. 使用以下方法获取类型设置字符串:

    String typeSettings = themeDisplay.getLayout().getTypeSettings();
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 因此,如果您有一个不可实例化的 portlet,其 IDfoo位于 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>
    <% } %>
    
    Run Code Online (Sandbox Code Playgroud)

您甚至可以在主题内执行上述步骤,但您必须在 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
Run Code Online (Sandbox Code Playgroud)