如何关闭 Liferay 中的弹出窗口?

4
我使用以下代码在弹出窗口中加载WebContent编辑门户:

我使用以下代码在弹出窗口中加载WebContent编辑门户:

<liferay-ui:icon
    image="edit"
    label="true"
    message="news-edit-url"
    url="${oneNews.newsEditUrl}"
    />

编辑链接:

taglibEditURL = "javascript:Liferay.Util.openWindow({dialog: {width: 960}," + 
    "id: '" + renderResponse.getNamespace() + "'," +
    "title: '" + LanguageUtil.format(request.getLocale(), "edit-x", HtmlUtil.escape(assetRenderer.getTitle(request.getLocale()))) + "'," +
    "uri:'" + HtmlUtil.escapeURL(editPortletURLString) + "'});";

当内容被保存或发布时,portlet将在弹出窗口中加载。我希望弹出窗口关闭,并且具有editURL链接的portlet刷新。

对此有任何帮助...

2个回答

8

以下是关闭弹出窗口的代码,此代码应该在打开弹出窗口的父页面中存在:

Liferay 6.1版本

Liferay.provide(
        window,
        '<portlet:namespace />closePopup',
        function(popupIdToClose) {

            var A = AUI();

            A.DialogManager.closeByChild('#' + popupIdToClose);
        },
        ['aui-base','aui-dialog','aui-dialog-iframe']
    );

Liferay 6.2 版本

Liferay.provide(
    window,
    '<portlet:namespace/>closePopup',
        function(popupIdToClose) {

            var popupDialog = Liferay.Util.Window.getById(popupIdToClose);

            popupDialog.destroy();
        },
        ['liferay-util-window']
    );

以下是刷新打开弹出窗口的Portlet的代码。这应该存在于打开弹出窗口的父页面中:

Liferay.provide(
        window,
        '<portlet:namespace />refreshPortlet',
        function() {

            <%-- refreshing the portlet [Liferay.Util.getOpener().] --%>
            var curPortletBoundaryId = '#p_p_id<portlet:namespace />';

            Liferay.Portlet.refresh(curPortletBoundaryId);
        },
        ['aui-dialog','aui-dialog-iframe']
    );

如何调用closePopuprefreshPortlet函数由您决定。一种方法是在请求成功处理后,让弹出窗口刷新并仅从弹出窗口调用closePopup函数,然后也从弹出窗口调用refreshPortlet函数。

以下是一个代码片段,可以帮助您从弹出窗口调用父页面的函数:

Liferay.Util.getOpener().<portlet:namespace />closePopup(popupIdToClose);
Liferay.Util.getOpener().<portlet:namespace />refreshPortlet();

当打开弹出窗口时,popupIdToClose是用来标识该弹出窗口的唯一 id

taglibEditURL = "javascript:"
                +   Liferay.Util.openWindow({"
                +       "dialog: {width: 960},"
                +       "id: '" + renderResponse.getNamespace() + "'," // This is the "popupIdToClose"
                +       "title: '" + LanguageUtil.format(request.getLocale(), "edit-x", HtmlUtil.escape(assetRenderer.getTitle(request.getLocale()))) + "',"
                +       "uri:'" + HtmlUtil.escapeURL(editPortletURLString)
                +       "'}"
                +   ");";

希望这有所帮助。

谢谢您的回答。请问您能否解释一下,我该如何在 /html/portlet/journal/edit_article.jsp 中调用这些方法。我从我的 portlet 中调用此 jsp 进行编辑和发布新闻文章。我不明白如何获得 popupIdToClose… - Sven Bergman
我尝试调用以下函数:AUI().use('event', 'node', function(A) { A.one(<portlet:namespace />publishButton) .on('click', function(e){ Liferay.Util.getOpener().closePopup('<%=renderResponse.getNamespace() %>'); }); }); - Sven Bergman
谢谢您的帮助。我尝试调用以下函数:AUI().use('event', 'node', function(A) { A.one(<portlet:namespace />publishButton) .on('click', function(e){ Liferay.Util.getOpener() .closePopup('<%=renderResponse.getNamespace() %>'); }); }); 我看到错误:Liferay.Util.getOpener().closePopup('<%=renderResponse.getNamespace() %>')不是一个函数。我的代码哪里出了问题? - Sven Bergman
可能有两个问题,或者其中一个或两个都有问题:1)如果您将函数声明为<portlet:namespace />closePopup并且调用为Liferay.Util.getOpener().closePopup,则语法不正确,因此调用应该像这样Liferay.Util.getOpener().<portlet:namespace />closePopup。2)此调用Liferay.Util.getOpener()是为了调用父页面的函数,请检查弹出窗口或父页面中是否声明了closePopup函数。 - Prakash K
closePopup在父页面中声明。这是我的声明:Liferay.provide(window,'<portlet:namespace />closePopup',function(popupIdToClose) {... 这是我的调用:Liferay.Util.getOpener().<portlet:namespace />closePopup('<%=renderResponse.getNamespace() %>'); 函数调用后:TypeError:Liferay.Util.getOpener()._15_closePopup不是一个函数。 - Sven Bergman
显示剩余2条评论

1

针对6.2版本的AUI标签库解决方案。无需额外的JS。

<aui:button cssClass="close-panel" type="cancel" value="close" />

重要的部分是cssClass="close-panel"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接