我很好奇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,但我不认为它有我正在寻找的东西。
答案 0 :(得分:3)
不幸的是,没有一种内置方法:
cq:template
节点或sling:resourceType
属性。将组件从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
下的文件)