在Liferay 6.2 Hook中获取portlet类型

时间:2016-12-08 11:08:08

标签: liferay-6.2 liferay-hook

Inside Liferay 6.2 hook 我想知道portlet类型(资产发布者/网页内容显示)。 Portlet名称不会帮助我,因为用户可能使用了自定义标题,在这种情况下,“Asset Publisher”/“Web Content Display”将无法访问。

我希望Portlet类型的精确挂钩文件位置是: /html/portlet/portlet_css/view.jsp

2 个答案:

答案 0 :(得分:0)

您可以从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();

答案 1 :(得分:0)

没有挂钩Liferay的其他部分你就无法得到它(在java代码中)。 Portlet“Portlet CSS”通过javascript填充,因此显然不需要发送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 已添加。

之后你可以把它挂钩/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格式保存,并且所有修改都是使用javascript进行的。

在页面加载XHR请求到服务器并且呈现“/html/portlet/portlet_css/view.jsp”之后第一次打开“外观”时。 第二次(对于同一页面上的另一个portlet),javascript为另一个(或相同的)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和浏览器缓存。