0

我们的网站结构如下:

Site:
  --Brand
     --Market
         --Language
             --Page1

假设我的自定义组件在 Page1 中拖放。现在在对话侦听器中,我想从页面路径中找到市场和语言参数。

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

4

1 回答 1

1

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

选项#1:简单的解决方案

在 TouchUI 中,您可以访问 JavaScript 中所谓的“页面信息”。您的对话侦听器可以访问此“页面信息”以获取绝对内容路径,然后解析字符串。

这可能看起来像这样:

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

显然,您必须解析path字符串变量以获取您感兴趣的路径部分。

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

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

选项#2:(更)复杂的解决方案

在 Option #1 中,我建议使用 TouchUI 提供的“页面信息”来获取完整的页面路径,然后解析路径。选项#2 以此为基础,但通过扩展“页面信息”提供的信息来改进方法。

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

com.day.cq.wcm.api.PageInfoProvider

您的PageInfoProvider将在每个请求上被调用,然后能够将信息添加到提供的JSONObject.

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

  1. Page提供的requestresource.
  2. 从页面获取市场和语言页面。

代码可能如下所示:

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 服务,您可以将其传递Page给它,然后它会通过向上遍历内容树直到找到具有所需资源类型的页面来确定页面市场语言页面。

对话侦听器现在可以这样:

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

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

于 2018-07-22T12:16:55.020 回答