我一直在研究这个问题,现在我一直在努力。我认为我很接近,但我认为在SO的土地上有人可能会有更深入的见解,如果不是更好的方式来做我想做的事情。
基本上让我们来看看这个场景。我有一个带有一些文字的徽标,可以从几个不同的地方设置。如果我们看一下这里的设置就是它的样子。
Hiearchy:
Homepage [has designPath]
- Child Microsite Page [has designPath]
- Logo Component
Logic Flow (in logo component):
if properties.get("logoText") {
use this
} else if currentStyle.get("logoTextFromStyle") {
use this
} else if parentStyle.get("logoTextFromGlobal") {
use this
} else {
be blank
}
我的查询是如何获取此页面的“parentStyle”。查看此处的文档:http://dev.day.com/docs/en/cq/5-5/javadoc/com/day/cq/wcm/api/designer/Style.html
我已经能够提出这样一个事实:我可以从通过defineObjects提供的“designer”对象中获取一个Style对象。这是使用其他实用程序对象定义的,如“pageManager,resourceUtil,resource,currentPage等”。
据说这似乎不起作用。
//assuming we have getting homePage earlier and it is a valid cq Page resource
Resource homePageResource.slingRequest.getResourceResolver().getResource(homePage.getPath());
Style homePageStyle = designer.getStyle(homePageResource);
此时homePageStyle为null。为了做更多测试,我尝试传递currentPage.getPath()而不是homePage.getPath()。我假设这将给我currentPage资源,并最终将产生currentStyle对象。这也导致了一个null Style对象。由此我想我可以安全地断定我传递的资源类型不正确。
我试图将cq:designPath加载到资源中,希望获得Designer资源类型,但无济于事。
我很好奇是否有人之前遇到过这个问题。如果我进入太多细节,我会道歉,但我想在我的问题中列出“为什么”,以防万一有更好的方法来完成这个。
答案 0 :(得分:2)
我已经想出如何归还这种风格。这是我所做的事情的简要说明。
//get your page object
Page targetPage = pageManager.getPage("/path/to/target");
//get the Design object of the target page
Design homePageDesign = designer.getDesign(homePage);
//extract the style from the design using the design path
Style homePageStyle = homePageDesign.getStyle(homePageDesign.getPath());
非常有趣的是“getStyle”的定义与designer.getStyle与Design.getStyle略有不同。 designer.getStyle请求资源,而Design.getStyle将获取设计“单元格”的路径并返回相应的样式。
我做了一些测试,看起来它确实适用于继承的样式/设计。因此,如果我的cq:designPath设置为1级,并且我在2级查找页面,则它们将返回设置为1级的cq:designPath的设计/样式。
我希望这可以帮助其他人。
答案 1 :(得分:0)
我尝试了这种方法,但没有在Style对象中获取样式。 当我们这样做时:
设计homePageDesign
= designer.getDesign(homePage);
在这个Design对象中,我们得到了直到项目节点的路径,即etc / design / myproject
在此之后,如果我们尝试从设计路径中提取Style,我们就不会得到它。
但是我以不同的方式实现了它。
在设计对象中,我们还获得了(etc / design / myproject)设计的完整JSON。
获取目标网页的sling:resourceType并获取“/".