Expand my Community achievements bar.

SOLVED

Parent node using jcr.node

Avatar

Level 4

Hi,

How to get the parent node (first parent node with specific primary type ex: cq:Page) for the child node.

Ex:

/content/dam/page(cq:Page)/jcr:content/root/property

Node node = till property.

how to get the cq:page node from property node.
I used node.getParent(); ---  that place might vary.

Thanks in Advance,

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Get first ancestor with a given template

$(resource).closest("cq:Page[jcr:content/cq:template=/apps/geometrixx/templates/homepage]") 

List siblings of the current page which can be displayed in the navigation

$(resource).closest("cq:Page").siblings("cq:Page[jcr:content/hiddenInNav=false]") 

Get the first sibling of the current page

$(resource).closest("cq:Page").siblings("cq:Page").first() 

Get page ancestor closest to the root

$(resource).parents("cq:Page").last()

View solution in original post

5 Replies

Avatar

Community Advisor

The recommended way to find resources in the Sling repository is using tree-traversal methods, like listChildren() and getParent() rather than JCR queries. The latter are great for listing resources with given properties, but we can't leverage the repository tree structure with such queries. On the other hand, using tree-traversal method is quite verbose. Consider following code that takes an resource and returns its first ancestor, being cq:Page, with given jcr:content/cq:template attribute:

Resource resource = ...; while ((resource = resource.getParent()) != null) { if (!resource.isResourceType("cq:Page")) { continue; } Resource template = resource.getChild("jcr:content/cq:template"); if (template != null && "my/template".equals(template.adaptTo(String.class))) { break; } } if (resource != null) { // we've found appropriate ancestor } 

SlingQuery is a tool that helps creating such queries in a more concise way. Above code could be written as:

import static org.apache.sling.query.SlingQuery.$; // ... $(resource).closest("cq:Page[jcr:content/cq:template=my/template]") 

Dollar sign is a static method that takes the resource array and creates SlingQuery object. The closest() method returns the first ancestor matching the selector string passed as the argument.

SlingQuery is inspired by the jQuery framework. jQuery is the source of method names, selector string syntax and the dollar sign method used as a collection constructor.

For more details pls check-

https://sling.apache.org/documentation/bundles/sling-query.html

Avatar

Level 4

Thanks for you comment,

using iteration we able to get the parent node. Is there any other way to get the parent node (specific primaryType) using SQL2 or any other function.

Avatar

Correct answer by
Community Advisor

Get first ancestor with a given template

$(resource).closest("cq:Page[jcr:content/cq:template=/apps/geometrixx/templates/homepage]") 

List siblings of the current page which can be displayed in the navigation

$(resource).closest("cq:Page").siblings("cq:Page[jcr:content/hiddenInNav=false]") 

Get the first sibling of the current page

$(resource).closest("cq:Page").siblings("cq:Page").first() 

Get page ancestor closest to the root

$(resource).parents("cq:Page").last()

Avatar

Community Advisor

is it resolved?if yes pls mark it as correct..