Expand my Community achievements bar.

SOLVED

Need to access JCR Child Nodes after CQ:Include

Avatar

Level 2

I have a component that uses <cq:include> to add multiple child components inside a main component. However, <cq:include> doesn't actually add the child components in the JCR under the parent.

Because of this the parent node, currentNode.getNodes() returns 0 and looking at CRXDE there are no child nodes.  Is there a way to programmatically add child components into the main component so that the nodes will actually appear in the JCR?

I need to access these nodes because I want to be able to create, delete, move, and update the child nodes before any authored content is entered in.
 

1 Accepted Solution

Avatar

Correct answer by
Level 2

Hey,

There is a simple approach for doing this. Just go to your parent component & add a cq:template node with jcr:primaryType  "nt:unstructured". under this node add one more node of primaryType nt:unstructured for your child component.

it will looks like-

<parentComponent>

-----cq:template 

------- <childCompoonent>

<child component > name must be same as you used in your <cq:include path="" > tag path property.

at this node set sling:resourceType with a value of </apps/your/component/path>.

No code change required after doing this as when you drop parent component then child component node will be created under parent node.

 

Happy Coding

View solution in original post

3 Replies

Avatar

Level 10

From within you component - get the parent node. Then pass the Node to an OSGi custom service:

https://helpx.adobe.com/experience-manager/using/passing_nodes.html

Now that you have the node in a Java custom service - you can use the JCR API to add child nodes to it, add props, etc. 

See this article to learn how to use JCR API to add nodes:

https://helpx.adobe.com/experience-manager/using/programmatically-accessing-cq-content-using.html

See this article to learn how to use the JCR API from within an OSGi bundle:

https://helpx.adobe.com/experience-manager/using/querying-experience-manager-data-using1.html

SO from your custom AEM service that manipulates the JCR - you have a lot of flexibility. 

Avatar

Correct answer by
Level 2

Hey,

There is a simple approach for doing this. Just go to your parent component & add a cq:template node with jcr:primaryType  "nt:unstructured". under this node add one more node of primaryType nt:unstructured for your child component.

it will looks like-

<parentComponent>

-----cq:template 

------- <childCompoonent>

<child component > name must be same as you used in your <cq:include path="" > tag path property.

at this node set sling:resourceType with a value of </apps/your/component/path>.

No code change required after doing this as when you drop parent component then child component node will be created under parent node.

 

Happy Coding

Avatar

Level 5

I had the same situation in Slider Component. I used the custom tag to create a node with little trick. Below is the snippet :

<c:forEach var="grid" items="${gridCollection}" varStatus="theCount"> <c:if test = "${grid.value eq 'grid1'}"> <div class="slide"> <c:forEach var="cssclass" items="${grid1}" varStatus="theCount"> <createcss1:createcssclass1 path="${grid.key}" nodename="${cssclass}" /> <cq:include path="${grid.key}/${cssclass}" resourceType = "mysite/components/content/gridfeature" /> </c:forEach> </div> </c:if> </c:forEach>