如何在AEM Touch UI对话框中查找页面URL完整路径

如何在AEM Touch UI对话框中查找页面URL完整路径,aem,aem-touch-ui,Aem,Aem Touch Ui,我们的现场结构如下: Site: --Brand --Market --Language --Page1 假设我的自定义组件在第1页拖放。现在在dialog listener中,我想从页面路径中找到市场和语言参数 如何在AEM的TouchUI对话框中实现这一点?我知道有两个选项。一个简单但不健壮,另一个更复杂但也更健壮 选项1:简单的解决方案 在TouchUI中,您可以访问JavaScript中的所谓页面信息。您的对话侦听器可以访问此页

我们的现场结构如下:

Site:
  --Brand
     --Market
         --Language
             --Page1
假设我的自定义组件在第1页拖放。现在在dialog listener中,我想从页面路径中找到市场和语言参数


如何在AEM的TouchUI对话框中实现这一点?

我知道有两个选项。一个简单但不健壮,另一个更复杂但也更健壮

选项1:简单的解决方案 在TouchUI中,您可以访问JavaScript中的所谓页面信息。您的对话侦听器可以访问此页面信息以获取绝对内容路径,然后解析字符串

这可能是这样的:

(function ($, $document, author) {
    "use strict";
 
    $document.on("dialog-ready", function() {
        var path = author.page.path;
    });
 
    
})($, $(document), Granite.author);
import com.day.cq.wcm.api.PageInfoProvider;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.osgi.service.component.annotations.Component;

@Component
public class MyPageInfoProvider implements PageInfoProvider {

    @Override
    public void updatePageInfo(final SlingHttpServletRequest request,
                               final JSONObject pageInfo,
                               final Resource resource) throws JSONException {

        // get market
        // get languagepage

        pageInfo.put("market", market);
        pageInfo.put("languagepage", languagepage);
    }
}
显然,您必须解析path字符串变量以获得您感兴趣的路径部分

我想指出的是,JavaScript变量Granite.author.page包含许多关于当前页面、组件等的有趣信息

现在来看重要的部分:这是解决问题的一种简单方法,但解析字符串始终是一个脆弱的解决方案。就我个人而言,我认为解析字符串应该被视为不好的做法,应该不惜一切代价避免。这就是我想用选项2提出一个更好的解决方案的方式

选项2:更复杂的解决方案 在选项1中,我建议使用TouchUI提供的页面信息获取完整页面路径,然后解析路径。选项2建立在这个基础上,但通过扩展页面信息提供的信息来改进方法

要扩展页面信息,必须创建实现以下接口的OSGi服务:

com.day.cq.wcm.api.PageInfoProvider
每次请求都会调用您的JSONObject,然后可以向提供的JSONObject添加信息

这意味着您可以编写一些业务逻辑:

从提供的请求或资源获取适当的AEM页实例。 从页面获取市场和语言页面。 这方面的代码可能如下所示:

(function ($, $document, author) {
    "use strict";
 
    $document.on("dialog-ready", function() {
        var path = author.page.path;
    });
 
    
})($, $(document), Granite.author);
import com.day.cq.wcm.api.PageInfoProvider;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.osgi.service.component.annotations.Component;

@Component
public class MyPageInfoProvider implements PageInfoProvider {

    @Override
    public void updatePageInfo(final SlingHttpServletRequest request,
                               final JSONObject pageInfo,
                               final Resource resource) throws JSONException {

        // get market
        // get languagepage

        pageInfo.put("market", market);
        pageInfo.put("languagepage", languagepage);
    }
}
我建议您使用专门的资源类型为您的市场和语言页面。通过这种方式,可以很容易地编写另一个OSGi服务,您可以将页面传递给它,然后它将通过遍历内容树来确定页面市场和语言页面,直到找到具有所需资源类型的页面

对话框侦听器现在可能会这样:

(function ($, $document, author) {
    "use strict";
 
    $document.on("dialog-ready", function() {
        var market = author.pageInfo.market;
        var languagepage = author.pageInfo.languagepage;
    });
 
    
})($, $(document), Granite.author);

此解决方案更加健壮,因为不涉及字符串解析,所有Java代码都可以通过适当的单元测试来覆盖。

您到底想做什么?你说“在触摸界面对话”你能扩展吗?你的最终目标是什么?