AEM:如何将当前页面路径从 jsp 传递到对话框

AEM: how to pass current page path from jsp to dialog

我有一个国家/地区选择下拉列表,我使用选择器从 servlet 填充它:

目前我正在将语言环境作为请求参数传递。

options="/bin/services/dropdownservlet.GET_DROPDOWN_VALUES.json?locale=$PATH"

现在我想将语言环境作为另一个选择器传递。为此,我正在考虑一种从 jsp 获取 currentPage.path 到对话框并将其作为第二个选择器传递的方法。我该怎么做?

options="/bin/services/dropdownservlet.GET_DROPDOWN_VALUES.CURRENTPATH"

有没有一种方法可以让我在我的 servlet 中获取页面路径作为一个字符串,我可以用它来触发 servlet

以下是获取页面页面的方法,无论是客户端还是服务器端:

Java脚本:

var currentPagePath = null;
/* if accessed via siteadmin */
if(CQ.wcm.SiteAdmin.hasListSelection()) {
    var grid = CQ.wcm.SiteAdmin.getActiveGrid();
    var selections = grid.getSelectionModel().getSelections();

    /*Assuming that you are selecting only one page at a time. */
    currentPagePath = selections[0].id;
} else { /* accessed via page */
    currentPagePath = CQ.WCM.getPagePath();
}

Java:

PageManager pageManager = resourceResolver.adaptTo(PageManager.class);    
String callingPage = request.getParameter("callingPage");
String callingPagePath = pageManager.getPage(callingPage).getPath();

How to get currentPagePath in Slingservlet?

假设您的 servlet returns JSON 例如:

[{"text" : "first option", "value" : "alpha"}, {"text" : "second option", "value" : "bravo"}]

您可以使用 optionsProvider 来 运行 一个 JavaScript 函数,您可以在其中动态设置您的请求:

<product
    jcr:primaryType="cq:Widget"
    name="./product"
    fieldLabel="Product"
    type="select"
    xtype="selection"
    optionsProvider="function() {
        var selectors = ['GET_DROPDOWN_VALUES', 'myselector'];
        var url = CQ.shared.HTTP.addSelectors('/bin/services/dropdownservlet.json', selectors);
        return CQ.Util.formatData(CQ.shared.HTTP.eval(CQ.shared.HTTP.noCaching(url)));
    }"/>

要回答您的问题,您可以使用以下方法在您的 optionsProvider 函数中获取当前页面的路径:

CQ.shared.HTTP.getPath()

但是,我不会使用路径作为选择器。通过页面路径中的斜杠,Sling 会将页面路径视为扩展名和后缀,而不是选择器。我可能会像您当前所做的那样将路径作为后缀或查询参数传递。

请注意,我不会将 JavaScript 函数留在您的 dialog.xml 文件中,而是会将其移动到外部 JS 文件中。