如何让 Liferay 的 Javascript PortletURL 模块使用友好的 URL 映射?

How do I get Liferay's Javascript PortletURL module to work with friendly URL mappings?

我已经为我的 Liferay portlet 设置了友好的 URL 路由,当我生成带有标准 JSP 标记的 URL 时,它工作正常,如下所示:

1
2
3
<portlet:renderURL var="resetUrl">
    <portlet:param name="start" value="5" />
</portlet:renderURL>

根据我的映射,它会生成一个可爱的 URL,例如:

1
localhost:8080/web/guest/welcome/-/myportlet/5

但是当我使用 JavaScript PortletURL 模块生成 URL 时,我得到了完整的不友好 URL。例如:

1
2
3
4
var filterUrl = Liferay.PortletURL.createRenderURL();
filterUrl.setPortletId("<%= portletDisplay.getId() %>");
filterUrl.setParameter("start","5");
location.href = filterUrl;

会生成

1
localhost:8080/web/guest/welcome?p_p_id=myportlet_WAR_MyPortletportlet&p_p_lifecycle=0&myportlet_WAR_MyPortletportlet_start=5

所以我的问题是:
如何从 JavaScript 生成友好的 URL?


你可以试试这个方法,有点棘手 -

1
2
3
4
5
                <portlet:actionURL var="copyNavigationPointURL">
                    <portlet:param name="myaction" value="copy-navigation-point"></portlet:param>
                    <portlet:param name="objectTypeId" value="changeObjType"></portlet:param>
                    <portlet:param name="navigationPointId" value="changeNavPointId"></portlet:param>
                </portlet:actionURL>

然后编写 javascript 并像这样替换参数值 -

1
2
3
4
5
6
7
8
9
10
11
12
function copyNavigationPoint(copyNavigationPointURL) {
    var copyNavId = document.getElementById("navigationPointId").value;
    if (copyNavId==null || copyNavId=='null'){
        alert('error');
        return;
    }
    var objectTypeId = document.getElementById("objectTypeId").value;
    copyNavigationPointURL = copyNavigationPointURL.replace(/changeObjType/i,objectTypeId);
    copyNavigationPointURL = copyNavigationPointURL.replace(/changeNavPointId/i,copyNavigationPointId);

    submitForm(document.hrefFm, copyNavigationPointURL);
}

你有你的友好网址。


没有简单的方法可以做到这一点。您将不得不重写portal_url.js 和PortletURLAction.java。
另一种选择是编写自己的 portlet,可以根据需要生成 URL 并通过 AJAX 访问它。