在 Liferay 6.2 Hook 中获取 portlet 类型
Get portlet type in Liferay 6.2 Hook
Liferay 6.2 内部 hook 我想了解 portlet 类型(资产 Publisher/Web 内容显示)。 Portlet 名称对我没有帮助,因为用户可能使用了自定义标题,在这种情况下,我将无法访问 "Asset Publisher"/"Web Content Display"。
我想要 Portlet-type 的确切挂钩文件位置是:/html/portlet/portlet_css/view.jsp
您可以从 ThemeDisplay 上下文对象中获取 PortletDisplay 对象,从 PortletDisplay 中,您可以获取 Title、PortletName 等。
请注意,themeDisplay 已经可用并在您的 jsp /html/portlet/portlet_css/view 中使用。jsp
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
String title=portletDisplay.getTitle();
String portletName=portletDisplay.getPortletName();
好吧,如果不挂钩 Liferay 的其他部分,您将无法到达那里(在 java 代码中)。 Portlet "Portlet CSS" 是通过 java 脚本填充的,因此显然不需要将 portletid 作为参数发送。
要获取 portletId,您还应该挂钩 /html/js/liferay/look_and_feel.js
autoLoad: false,
showLoading: false,
data: {
p_l_id: themeDisplay.getPlid(),
p_p_id: 113,
p_p_state: EXCLUSIVE,
doAsUserId: themeDisplay.getDoAsUserIdEncoded()
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'
修改成这样
autoLoad: false,
showLoading: false,
data: {
p_l_id: themeDisplay.getPlid(),
p_p_id: 113,
p_p_state: EXCLUSIVE,
doAsUserId: themeDisplay.getDoAsUserIdEncoded(),
_113_portletId: instance._portletId
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'
逗号 和 _113_portletId: 添加了 instance._portletId。
之后你可以输入hooked /html/portlet/portlet_css/view.jsp
String portletId = (String) renderRequest.getParameter("portletId");
资产发布者的 portletId 类似于 101_INSTANCE_reKokSN3aDaL
Web 内容显示的 portletId 类似于
56_INSTANCE_dxNxXuQ7ZuvB
因此您可以测试 portletId 是否以 101、56、...
开头
您还可以通过
获取 Portlet 对象
PortletLocalServiceUtil.getPortletById(portletId);
更新(评论中问题的答案):
此 portlet 不适合此类用途,加载后它会在 html 中呈现,所有修改均使用 java 脚本进行。
在向服务器发出页面加载 XHR 请求并呈现“/html/portlet/portlet_css/view.jsp”后首次打开 "Look and feel" 时。
第二次(对于同一页面上的另一个 portlet),java脚本为另一个(或相同的)porlet 准备模态,“/html/portlet/portlet_css/view.jsp”将不会再次呈现。
强制重新渲染“/html/portlet/portlet_css/view.jsp”再次修改“/html/js/liferay/look_and_feel.js”.
之后(在我的源代码中是第 136 行)
if (!content) {
content = A.Node.create('<div class="loading-animation" />');
}
添加这个
if (instance._currentPopup) {
A.one("#" + instance._currentPopup.get("id")).remove()
instance._currentPopup = null;
}
应该早于
if (!instance._currentPopup) {
instance._currentPopup = Liferay.Util.Window.getWindow(
...
清除 Liferay 和浏览器缓存。
Liferay 6.2 内部 hook 我想了解 portlet 类型(资产 Publisher/Web 内容显示)。 Portlet 名称对我没有帮助,因为用户可能使用了自定义标题,在这种情况下,我将无法访问 "Asset Publisher"/"Web Content Display"。
我想要 Portlet-type 的确切挂钩文件位置是:/html/portlet/portlet_css/view.jsp
您可以从 ThemeDisplay 上下文对象中获取 PortletDisplay 对象,从 PortletDisplay 中,您可以获取 Title、PortletName 等。
请注意,themeDisplay 已经可用并在您的 jsp /html/portlet/portlet_css/view 中使用。jsp
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
String title=portletDisplay.getTitle();
String portletName=portletDisplay.getPortletName();
好吧,如果不挂钩 Liferay 的其他部分,您将无法到达那里(在 java 代码中)。 Portlet "Portlet CSS" 是通过 java 脚本填充的,因此显然不需要将 portletid 作为参数发送。
要获取 portletId,您还应该挂钩 /html/js/liferay/look_and_feel.js
autoLoad: false,
showLoading: false,
data: {
p_l_id: themeDisplay.getPlid(),
p_p_id: 113,
p_p_state: EXCLUSIVE,
doAsUserId: themeDisplay.getDoAsUserIdEncoded()
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'
修改成这样
autoLoad: false,
showLoading: false,
data: {
p_l_id: themeDisplay.getPlid(),
p_p_id: 113,
p_p_state: EXCLUSIVE,
doAsUserId: themeDisplay.getDoAsUserIdEncoded(),
_113_portletId: instance._portletId
},
uri: themeDisplay.getPathMain() + '/portal/render_portlet'
逗号 和 _113_portletId: 添加了 instance._portletId。
之后你可以输入hooked /html/portlet/portlet_css/view.jsp
String portletId = (String) renderRequest.getParameter("portletId");
资产发布者的 portletId 类似于 101_INSTANCE_reKokSN3aDaL
Web 内容显示的 portletId 类似于 56_INSTANCE_dxNxXuQ7ZuvB
因此您可以测试 portletId 是否以 101、56、...
开头您还可以通过
获取 Portlet 对象PortletLocalServiceUtil.getPortletById(portletId);
更新(评论中问题的答案):
此 portlet 不适合此类用途,加载后它会在 html 中呈现,所有修改均使用 java 脚本进行。
在向服务器发出页面加载 XHR 请求并呈现“/html/portlet/portlet_css/view.jsp”后首次打开 "Look and feel" 时。 第二次(对于同一页面上的另一个 portlet),java脚本为另一个(或相同的)porlet 准备模态,“/html/portlet/portlet_css/view.jsp”将不会再次呈现。
强制重新渲染“/html/portlet/portlet_css/view.jsp”再次修改“/html/js/liferay/look_and_feel.js”.
之后(在我的源代码中是第 136 行)
if (!content) {
content = A.Node.create('<div class="loading-animation" />');
}
添加这个
if (instance._currentPopup) {
A.one("#" + instance._currentPopup.get("id")).remove()
instance._currentPopup = null;
}
应该早于
if (!instance._currentPopup) {
instance._currentPopup = Liferay.Util.Window.getWindow(
...
清除 Liferay 和浏览器缓存。