1

我看到自己面临着一项可能很容易的任务,我觉得自己走错了方向。当用户访问默认登录页面时,我需要有一个弹出窗口。此弹出窗口应在 iframe 左右显示一个外部网页(一些我们无法通过单点登录绕过的登录内容)。由于只有部分用户必须使用此对话框,我们希望有机会不再出现此弹出窗口(通过 cookie 或 DB,如果必须由管理员手动重置此选项,则可以)。所以基本上我们需要一个带有 iframe 的“不再询问”弹出窗口。

我们决定在没有大小的登陆页面上放置一个 MVC portlet;只有弹出窗口。我所拥有的是一个带有 iframe 的 AlloyUI 弹出窗口,一个复选框,并且感觉这是错误的方式,因为当弹出窗口关闭时我无法从该复选框获取信息。

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui" %>
<portlet:defineObjects />

<aui:script>

    AUI().ready('aui-dialog', 'aui-overlay-manager', 'dd-constrain', 'console',
        function(A) {

            var bodyNode = A.Node.create('<div><iframe src="http://www.dummysite.com"></iframe> </div>');
            var footerNode = A.Node.create('<input name="donotaskagain" type="checkbox"></input> <label for="donotaskagain">Do not ask again</label>');

            var dialog = new A.Dialog({
                title: 'DISPLAY CONTENT',
                centered: true,
                modal: true,
                resizable: false,
                width: 510,
                height: 430,
                bodyContent: bodyNode,
                footerContent: footerNode
            });
            dialog.render();
        }
    );
</aui:script>

我希望你能帮我解决这个问题。非常感谢有关如何在该上下文中正确使用 JSP、AlloyUI 和 Java 的所有背景信息。

4

1 回答 1

0

我们通过为弹出窗口的页脚引入一个表单来规避这个问题,当用户点击保存按钮时将提交该表单。它不是最佳的,因为页面需要刷新,但由于弹出窗口不再出现,因此可以接受。也许其他人可以发布使用 AJAX 的解决方案,因此这种行为更加流畅。

首先我们有 view.jsp:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui" %>
<portlet:defineObjects />

<portlet:actionURL name="storeDoNotAskAgain" var="storeDoNotAskAgainURL"></portlet:actionURL>

<!-- Check here whether or not the popup should be shown. We used JSP tags (an "if" around the script) 
    and a JAVA helper class to access the Expandobridge to get a variable from the Liferay DB 
    to decide whether or not the user had chosen not to display the popup again.
<!--  Create Alloy UI dialog with iframe pointing to the specified site as a body and form as footer.
    The form can be submitted to store the "do not ask again"-checkbox value in DB. 
    It is connected with an action from of the portlet. -->
<aui:script>

    AUI().ready('aui-dialog', 'aui-overlay-manager', 'dd-constrain',
        function(A) {

            var bodyNode = A.Node.create('<div><iframe src="http://www.dummysite.com"> </iframe> </div>');
            var footerNode = A.Node.create('<form action="<%= storeDoNotAskAgainURL%>" method="post"><input type="submit" value="Save" class="submit"><input name="donotaskagain" type="checkbox"></input> <label for="donotaskagain">Do not ask again.</label></form>');

            var dialog = new A.Dialog({
                title: "Title",
                bodyContent: bodyNode,
                footerContent: footerNode
            });
            dialog.render();
        }
    );
</aui:script>

然后我们创建了一个新的 portlet 主类来处理表单引用的存储操作。

package com.example.portlet;

import ...

public class MyPortlet extends MVCPortlet {

    @ProcessAction(name = "storeDoNotAskAgain")
    public void storeDoNotAskAgain(ActionRequest request, ActionResponse response) throws Exception {
        boolean val = ParamUtil.getBoolean(request, "donotaskagain", false);
        // store boolean in db or a file
    }
}

形式:您需要调整 portlet.xml 以将 portlet 主类指向新的 portlet 类

<portlet-class>com.example.portlet.MyPortlet</portlet-class>
于 2013-07-11T09:50:28.477 回答