使动态添加的portlet与调用portlet具有相同的scopeGroupId

时间:2014-12-11 15:29:46

标签: liferay ipc liferay-6 portlet

问题

当通过另一个portlet中的链接(例如abc-portlet)弹出窗口中显示portlet(比如test-portlet)时,test-portlet中显示的scopeGroupId始终是groupId而不是页面-scope-id或scopeGroupId,为abc-portlet配置。

如果问题不明确,请参阅更多详细信息。

基本上我所做的就是这个answer中提到的内容。将在下面给出简要说明。

我们做了什么

  1. 创建了自定义portlet - test-portlet
  2. 使该portlet具有范围<scopeable>true</scopeable>
  3. 还添加了 - <add-default-resource>true</add-default-resource>
  4. 即使使用页面范围
  5. ,这也可以正常工作
  6. 我们有另一个portlet - abc-portlet
  7. 与test-portlet相同的配置
  8. 这个portlet也可以正常工作
  9. 我们正在做什么以及发生了什么

    1. 我们在abc-portlet的弹出窗口中调用test-portlet
    2. 此作品
    3. 现在我们将abc-portlet的范围更改为page(比如Home)
    4. 现在,当我们访问test-portlet时,test-portlet中显示的范围仍然是Liferay(即Guest组),而不是abc-portlet中设置的Home。
    5. 问题

      1. 是否还有其他配置,以便test-portlet能够像abc-portlet一样获取scopeGroupId
      2. 有什么可能我可以改变代码,它可以告诉test-portlet使用abc-portlet的scopeGroupId,即让test-portlet知道abc-portlet的范围?
      3. 任何指示方向都会有很大的帮助。

        环境:与Tomcat捆绑的Liferay 6.2 EE

        由于

        注意:还要在Liferay Developer Forum上交叉发布此内容。

1 个答案:

答案 0 :(得分:1)

所以经过一番搜索后终于找到了liferay是如何做到的。该提示来自ServicePreAction中的源代码:

if (!group.isControlPanel()) {
    doAsGroupId = 0;
}

Liferay在Related Assets中使用此功能在添加或编辑资源时添加博客,wiki,文档,文件夹等,因此请检查JSP /html/portlet/asset_browser/toolbar.jsp 以查看如何网址已经完成。

Liferay的步骤与我想做的相似:

  1. 提供链接以打开资产portlet(例如:Blog)以添加条目。
  2. 打开的弹出窗口具有与底层portlet相同的scopeGroupId(例如:Documents and Media)
  3. 有人会认为属性doAsGroupId恰好适合这种情况。是的,它是必不可少的,但它是不够的,令人惊讶的是,其他必要的属性是plid。默认情况下,plid将是用户所在的当前页面/布局,并且将针对当前页面创建URL,但此默认值无效。

    plid需要设置为Control Panel

    的plid

    以下是我们在abc-portlet中编写的示例renderURL,用于在弹出窗口中打开test-portlet,注意doAsGroupId="<%=scopeGroupId %>" and plid="<%=controlPanelPlid %>"的属性<liferay-portlet:renderURL

    <%
    long controlPanelPlid = PortalUtil.getControlPanelPlid(company.getCompanyId());
    %>
    
    <liferay-portlet:renderURL var="testPortletURL" portletName="test_WAR_testportlet" windowState="<%=LiferayWindowState.POP_UP.toString() %>"
            doAsGroupId="<%=scopeGroupId %>" plid="<%=controlPanelPlid %>" refererPlid="<%=plid %>">
        <liferay-portlet:param name="referringPortletResource" value="abc_WAR_abcportlet" />
    </liferay-portlet:renderURL>
    
    <%
    String testPortletURLJavascript = "javascript:Liferay.Util.openWindow({dialog: {destroyOnHide: true}, id: 'test', title: 'Test Portlet View', uri: '" + HtmlUtil.escapeJS(testPortletURL) + "'});";
    %>
    
    <h4><a href="<%=testPortletURLJavascript%>">Click here to open test portlet in pop-up</a></h4>
    

    不知道为什么liferay会考虑使用plid="<%=controlPanelPlid %>"而不仅仅是doAsGroupId,而这似乎很简单。

    注意:我还发现,如果我们使用plid="<%=controlPanelPlid %>",我们就不需要在<add-default-resource>true</add-default-resource>liferay-portlet.xml,这对资源非常重要需要动态添加。

    希望这有助于某人。