我们的网站结构如下:
Site:
--Brand
--Market
--Language
--Page1
让我们说一下我的自定义组件已拖放到Page1中。现在,在对话框侦听器中,我想从页面路径中找到市场和语言参数。
如何在AEM的TouchUI对话框中实现此目的?
答案 0 :(得分: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 提出更好的解决方案的方式。
在选项1中,我建议使用TouchUI提供的“页面信息”来获取完整的页面路径,然后解析路径。选项#2以此为基础,但是通过扩展“页面信息”提供的信息来改进方法。
要扩展“页面信息”,您必须创建一个实现以下接口的OSGi服务:
com.day.cq.wcm.api.PageInfoProvider
您的PageInfoProvider将在每次请求时被调用,然后能够将信息添加到所提供的JSONObject
中。
这意味着您可以编写一些业务逻辑,
Page
或request
中获取适当的AEM resource
实例。此代码可能如下所示:
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
传递给它,然后通过遍历内容来确定 market 和 languagepage 页面直到找到具有必需的资源类型的页面。
对话框侦听器现在可以这样:
(function ($, $document, author) {
"use strict";
$document.on("dialog-ready", function() {
var market = author.pageInfo.market;
var languagepage = author.pageInfo.languagepage;
});
})($, $(document), Granite.author);
该解决方案更加健壮,因为不涉及字符串解析,并且所有Java代码都可以通过适当的单元测试来覆盖。