gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:30:13 25 4
gpt4 key购买 nike

问题

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

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

基本上我所做的就是这个answer中提到的内容.下面将作简要介绍。

我们做了什么

  1. 创建了一个自定义 portlet - test-portlet
  2. 已使该 portlet 可作用域 <scopeable>true</scopeable>
  3. 还添加了 - <add-default-resource>true</add-default-resource>
  4. 即使在页面范围内也能正常工作
  5. 我们还有另一个 portlet - abc-portlet
  6. 与 test-portlet 相同的配置
  7. 这个 portlet 也能正常工作

我们在做什么以及正在发生什么

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

问题

  1. 是否有任何更多的配置,以便 test-portlet 可以获取与 abc-portlet 相同的 scopeGroupId
  2. 我是否可以更改代码,告诉测试 portlet 使用 abc-portlet 的 scopeGroupId,即让测试 portlet 知道 abc-portlet 的范围?

方向上的任何指示都会有很大帮助。

环境:Liferay 6.2 EE 与 Tomcat 捆绑在一起

谢谢

注意:还在Liferay Developer Forum上交叉发布了这个.

最佳答案

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

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

Liferay 在 Related Assets 中使用此功能用于在添加或编辑 Assets 时添加博客、wiki、文档、文件夹等,因此检查了 JSP /html/portlet/asset_browser/toolbar.jsp 查看 URL 是如何制作的。

Liferay的步骤和我想做的差不多:

  1. 提供打开 Assets portlet(例如:博客)以添加条目的链接。
  2. 打开的弹出窗口与底层 portlet 具有相同的 scopeGroupId(例如:文档和媒体)

人们会认为属性 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如果需要动态添加资源,这是必不可少的。

希望这对某人有帮助。

关于liferay - 使动态添加的 portlet 具有与调用 portlet 相同的 scopeGroupId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com