在单个请求中将节点与子节点一起替换

时间:2014-03-27 14:21:42

标签: cq5 sling

我有一个小部件,它创建一个POST请求,创建一个节点和一个动态数量的子节点,如:

./sling:resourceType:app/component
_charset_:utf-8
:status:browser
./data:data
./a/a:one
./a/b:two
./b/a:one
./b/b:two

第一次这很好用。我得到一个节点以及子节点a和b。 问题出在后续请求中。我需要在创建新子节点之前删除所有子节点。因此,如果之前我创建了子节点a,b,c和d,则先前的请求将仅在子节点a和b中保留。

我知道@ Delete的后缀,但我需要提前知道哪些子节点需要删除,我不知道。

使用Sling Post Servlet可以实现OOTB吗?

问候。

2 个答案:

答案 0 :(得分:0)

如果您使用的是CQ 5.6或5.6.1,则可以通过在其值中传递尾随星,使用单个请求将“:applyTo ”请求参数用于delete multiple items。 / p>

例如,要删除'/ content / foo'的所有子项,请使用':operation'='delete'和':applyTo'='/ content / foo / *'发出POST请求。

$ curl -F":operation=delete" -F":applyTo=/content/foo/*" http://host/content/sample

这是在Sling 2.1.2中引入的,因此在CQ 5.5及以下版本中不可用,因为5.5在2.1.1上运行。

对于5.5,我怀疑你可能需要获取子列表,然后在添加新节点之前将绝对URL传递给:applyTo作为删除它们的值。

答案 1 :(得分:0)

我使用的解决方案是使用@Delete后缀。 它的问题是您需要为要删除的每个节点添加一个带@Delete后缀的参数。我正在做的是提前查询节点,检查节点I的所有子节点是否更新并为每个节点添加@Delete参数。

所以,如果JCR最初有

-node
 \node1
 \node2
 \node3

我将首先获得http://example.com/content/node.json并遍历json。最后,我将发送一个请求

./sling:resourceType:app/component
./value:value
./node1@Delete
./node2@Delete
./node3@Delete
./node1/value:value1
./node2/value:value2

将在同时删除node3的同时更新node1和node2。