如何使用Extjs创建一个新的jcr:content节点?

时间:2014-02-05 19:49:04

标签: extjs cq5

我的CQ5.5应用程序中的某些页面没有'jcr:content'节点。由于节点不存在,因此这些特定页面的属性不存在,用户无法修复。我想添加一个按钮,允许用户添加缺少的节点。我已经能够添加一个“Fix Properties”按钮,它附带了一个自定义函数,可以检索现有节点,并且我能够检查是否存在jcr:content节点。我无法在任何地方找到有关如何从头开始创建节点的文档。我认为这是一件很平常的事情,但很难找到它。

我总体上发现了这个节点的文档,大部分功能都可以使用,但到目前为止还没有骰子:http://dev.day.com/docs/en/cq/current/widgets-api/index.html?class=CQ.Ext.data.Node

到目前为止还有这个功能。每次尝试都是单独完成的:

CQ.wcm.SiteAdmin.createProperties = function() {
   var path = this.getCurrentPath();
   var tree = CQ.Ext.getCmp(this.id + "-tree");
   //var nodet = tree.getSelectionModel().getSelectedNode(); //gets the selected node
   //nodet.childNodes[i] skips over jcr:content nodes
   var nodej = CQ.Util.eval(path + '.2.json'); //am currently using this to get the node data instead
   if(typeof nodej['jcr:content'] == 'undefined')  //If the jcr:content node does not exist
   {
     //Attempt 1: 
       nodej['jcr:content'] = new CQ.wcm.Node({ 
           jcr:primaryType: "cq:PageContent",
           jcr:title: "title"});
     //Attempt 2: 
       nodej['jcr:content'] = new Node({  //Note no 'CQ.wcm'
           jcr:primaryType: "cq:PageContent",
           jcr:title: "title"});
     //Attempt 3:
     nodej.appendChild( new CQ.wcm.Node({ 
           jcr:primaryType: "cq:PageContent",
           jcr:title: "title"}));
     //Attempt 4:
     nodej.appendChild( new CQ.wcm.Node({ 
           Name : "jcr:content",              
           jcr:primaryType: "cq:PageContent",
           jcr:title: "title"}));
    }

};

上述尝试都没有做任何事情,但这是我能想到的最接近的事情。

我确实发现了这个问题:How to add new property to JCR node through CQ.extjs?但它没有显示任何内容,它也是关于添加到现有节点的。

1 个答案:

答案 0 :(得分:2)

您的所有尝试都会修改Javascript对象nodej,但没有机制可以自动在存储库中反映这些更改。这就是为什么没有保存更改的原因。要创建新节点,您需要发送HTTP POST请求:

CQ.HTTP.post(path + "/jcr:content", null, {
  "jcr:primaryType" : "cq:PageContent",
  "jcr:title" : "Title"
});

此请求将由Sling framework(更确切地说,由SlingPostServlet)处理,这将创建新资源。

旁注:请注意,如果Javascript关联数组中包含一个特殊字符,例如:,则需要引用该关键字名称。因此,以下代码将起作用:

console.log({
    "jcr:primaryType" : "cq:PageContent"
});

但是这个会导致语法错误:

console.log({
    jcr:primaryType : "cq:PageContent"
});