在 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 和浏览器缓存。