0

我有一个需要共享的页脚元素。我的计划是在父/主页上设置页脚,但允许子页面覆盖这些属性。

我首先查看当前组件的属性(非常标准),然后获取父页面的路径以查找具有相同名称的组件上的属性。

function getProperty(property, currentPage) {
    var val = null,
        page = currentPage,
        rootPage = page.getAbsoluteParent(2);

    var curNode = currentNode.getPath(),
        nodeStrIdx = curNode.indexOf("jcr:content"),
        nodeStr = curNode.substr(nodeStrIdx + 12);  // Remove 'jcr:content/' too

    while(val == null) {

        // If we've gone higher than the home page, return
        if(page.getDepth() < 3) {
            break;
        }

        // Get the same node on this page
        var resource = page.getContentResource(nodeStr);

        if(resource != null) {
            var node = resource.adaptTo(Node.class);  // *** This is null ***

            // val = node.get(property);
        }

        // Get the parent page
        page = page.getParent();
    }

    return val;
}

我已经看到您可以将内容资源的类型更改为应该允许我获得相同propertyresource.adaptTo(Node.class)返回 null 的节点。

如果不清楚,resource是我要从中提取属性的节点的绝对路径,例如/content/jdf/en/resources/challenge-cards/jcr:content/footer/follow-us

4

1 回答 1

3

假设您使用的是Javascript HTL Use API,您需要使用 Java 类的完全限定名称,如下所示:

var node = resource.adaptTo(Packages.javax.jcr.Node);

然后您可以通过这种方式检索您的值:

if (node.hasProperty(property)) {
    val = node.getProperty(property).getString();
}

当缺少属性时,您需要使用hasProperty每个Node API的方法作为getPropertythrows 。PathNotFoundException您还需要小心示例中的 granite.resource 对象 - 它不是同一个 Resource 对象并且它没有adaptTo方法。要获取组件的原始资源,您需要获取nativeResource属性:

var node = granite.resource.nativeResource.adaptTo(Packages.javax.jcr.Node);

但是,还应该有一种更快的方法来从 JS 中的资源中获取属性:

val = resource.properties[property];

由于这是开发组件属性继承的常见案例,您还可以在实现设计中考虑一些现成的解决方案,例如HierarchyNodeInheritanceValueMap API继承段落系统 (iparsys) 。

由于此 JS 是使用Mozilla Rhino编译的服务器端,因此此处使用的所有这些对象和方法都是 Java 对象和方法,因此您应该也可以通过这种方式使用 HierarchyNodeInheritanceValueMap:

//importClass(Packages.com.day.cq.commons.inherit.HierarchyNodeInheritanceValueMap);
//this import might be needed but not necessarily

var props = new HierarchyNodeInheritanceValueMap(granite.resource.nativeResource);
val = props.getInherited(property, Packages.java.lang.String);

然后它将返回val当前资源的属性值,或者,如果为空,则返回父页面上相同位置的资源的属性值,或者如果为空等。这两行应该完成所有的魔法。

于 2017-08-04T20:19:03.273 回答