CQ API中是否有任何内容允许您从cq:component创建节点?

时间:2014-05-05 21:50:55

标签: cq5

我很好奇CQ API中是否存在允许我基于cq:component创建节点的内容,就像作者将一个组件添加到parsys时会发生的情况一样。

因为我需要完成这件事,所以我继续手动完成。我已经包含了这个解决方案,看看是否有人可以“噢,伙计可以用这个。*方法,你可以用来做到这一点。”

这就是我正在做的事情:

public static Node createFromComponent(Node dstParent, Node srcComponent, String targetName) {
    Node newNode = null;

    try {
        //if there is a template use it
        if (srcComponent.hasNode("cq:template")) {
            newNode = JcrUtil.copy(srcComponent.getNode("cq:template"), dstParent, targetName);
        }
        else {
            newNode = dstParent.addNode(targetName);
        }

        //set the resourceType to the path of the component sent over
        newNode.setProperty("sling:resourceType", srcComponent.getPath());

        newNode.getSession().save();
    }
    catch(Exception e) {
        LOGGER.error("Error creating node from component: ", e);
    }

    return newNode;
}

这很直截了当。我在看JcrUtil Class,但我不认为它有我正在寻找的东西。

2 个答案:

答案 0 :(得分:3)

不幸的是,没有一种内置方法:

  1. 复制cq:template节点或
  2. 的内容
  3. 创建一个新节点
  4. 为节点设置sling:resourceType属性。
  5. 将组件从sidekick拖动到parsys时,浏览器会向Sling发送HTTP POST请求。如果目标组件包含cq:template子节点,则此HTTP请求将包含其他属性:

    ./@CopyFrom:/apps/my/component/cq:template
    

    负责设置默认值。因为您希望通过API而不是HTTP请求执行相同的操作,所以您需要一个自定义方法。

答案 1 :(得分:2)

你可以更高一些&使用Sling API而不是JCR。如果您将cq:template节点调整为ValueMap&然后将其传递给ResourceResolver.create()方法......

E.g。

<%  
    Resource templateAsResource = resourceResolver.resolve("/path/to/cq:template");
    ValueMap templateProperties = templateAsResource.adaptTo(ValueMap.class);
    resourceResolver.create(parentResource, "newResource", templateProperties);
    resourceResolver.commit();
%>

在本地进行了快速测试 - 在验证时它在作者模式下工作。 (如果您在发布实例中运行它或作为非管理员用户运行它,您可能需要一些额外的行来确保您既拥有创建节点的权限,又可以阅读 cq:template < / strong> /apps下的文件)