如何在 AEM Touch UI 对话框中找到页面 URL 完整路径
How to find the page URL complete path in AEM Touch UI Dialog
我们的网站结构如下:
Site:
--Brand
--Market
--Language
--Page1
假设我的自定义组件拖放到第 1 页中。现在在对话框侦听器中,我想从页面路径中找到市场和语言参数。
如何在 AEM 的 TouchUI 对话框中实现此功能?
我知道有两种选择。一种简单但不“健壮”,另一种更复杂但也更健壮。
选项 #1:简单的解决方案
在 TouchUI 中,您可以访问 JavaScript 中所谓的“页面信息”。您的对话侦听器可以访问此“页面信息”以获取绝对内容路径,然后 解析 字符串。
这可能是这样的:
(function ($, $document, author) {
"use strict";
$document.on("dialog-ready", function() {
var path = author.page.path;
});
})($, $(document), Granite.author);
显然,您必须解析 path
字符串变量以获取您感兴趣的路径部分。
我要注意,Java脚本“变量”Granite.author.page
包含很多关于当前页面、组件等的有趣信息。
现在进入重要部分:这是解决问题的简单方法,但解析字符串始终是一个脆弱的解决方案。就个人而言,我会说解析字符串应该被认为是不好的做法,应该不惜一切代价避免。这是我想用 Option #2.
提出更好的解决方案的方式
选项 #2:(更)复杂的解决方案
在选项#1中,我建议使用TouchUI提供的“页面信息”来获取完整的页面路径,然后解析路径。选项 #2 以此为基础,但通过扩展“页面信息”提供的信息来改进方法。
要扩展“页面信息”,您必须创建一个实现以下接口的 OSGi 服务:
com.day.cq.wcm.api.PageInfoProvider
您的 PageInfoProvider 将在每次请求时被调用,然后能够将信息添加到提供的 JSONObject
。
这意味着您可以编写一些业务逻辑:
- 从提供的
request
或 resource
中获取正确的 AEM Page
实例。
- 从页面获取市场和语言页面。
此代码可能如下所示:
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 代码都可以通过适当的单元测试进行覆盖。
我们的网站结构如下:
Site:
--Brand
--Market
--Language
--Page1
假设我的自定义组件拖放到第 1 页中。现在在对话框侦听器中,我想从页面路径中找到市场和语言参数。
如何在 AEM 的 TouchUI 对话框中实现此功能?
我知道有两种选择。一种简单但不“健壮”,另一种更复杂但也更健壮。
选项 #1:简单的解决方案
在 TouchUI 中,您可以访问 JavaScript 中所谓的“页面信息”。您的对话侦听器可以访问此“页面信息”以获取绝对内容路径,然后 解析 字符串。
这可能是这样的:
(function ($, $document, author) {
"use strict";
$document.on("dialog-ready", function() {
var path = author.page.path;
});
})($, $(document), Granite.author);
显然,您必须解析 path
字符串变量以获取您感兴趣的路径部分。
我要注意,Java脚本“变量”Granite.author.page
包含很多关于当前页面、组件等的有趣信息。
现在进入重要部分:这是解决问题的简单方法,但解析字符串始终是一个脆弱的解决方案。就个人而言,我会说解析字符串应该被认为是不好的做法,应该不惜一切代价避免。这是我想用 Option #2.
提出更好的解决方案的方式选项 #2:(更)复杂的解决方案
在选项#1中,我建议使用TouchUI提供的“页面信息”来获取完整的页面路径,然后解析路径。选项 #2 以此为基础,但通过扩展“页面信息”提供的信息来改进方法。
要扩展“页面信息”,您必须创建一个实现以下接口的 OSGi 服务:
com.day.cq.wcm.api.PageInfoProvider
您的 PageInfoProvider 将在每次请求时被调用,然后能够将信息添加到提供的 JSONObject
。
这意味着您可以编写一些业务逻辑:
- 从提供的
request
或resource
中获取正确的 AEMPage
实例。 - 从页面获取市场和语言页面。
此代码可能如下所示:
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 代码都可以通过适当的单元测试进行覆盖。