Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
Bedrock Mission!

Learn more

View all

Sign in to view all badges

[AEM Gems Webinar] Accelerating Experience Manager as a Cloud Service development with Rapid Development Environments
SOLVED

Child Pages Not Showing

Avatar

Level 5

Screenshot (14).pngI'm trying to fetch the child pages when I enter the path in the link. But it's not working

 

Below is the java code:

 

@Model(adaptables = Resource.class,defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Test {

@ValueMapValue

private String filePath;

@OSGiService
private ResourceResolver resourceResolver;

@Inject

Resource items;

public Resource getItems() {
Resource resource=resourceResolver.getResource("/content/second/us/en/jcr:content/root/container/container/testone");
filePath=resource.getValueMap().get("filePath",String.class);
items= resourceResolver.getResource(filePath);
return items;
}
}

Below is the html code:

<sly data-sly-use.model="com.secondsite.core.models.Test"></sly>
<pre data-sly-test="${properties.linkdetails==dynamic}">

<ul data-sly-list.item="${model.items.listChildren}">
<li>${item.title}</li>


</ul>
</pre>

<pre data-sly-test="${properties.linkdetails==manual}">
<a href="${properties.pagelink @ extension='html'}">${properties.pagetitle}</a>
</pre>

 Please help

1 Accepted Solution

Avatar

Correct answer by
Level 4

Please check the path field(dialog name) given in the component dialog and change the code accordingly.

View solution in original post

6 Replies

Avatar

Community Advisor

Hi,

There are so many problems with above code. I would recommend you to go through with Sling Model and HTL documentation to understand sling model injection and htl comparison.

https://sling.apache.org/documentation/bundles/models.html

https://github.com/adobe/htl-spec/blob/master/SPECIFICATION.md 

Avatar

Level 4

Hi @Sanjana12 ,

You have to improve your code quality with the help of the document provided by @arunpatidar .

For your use case, Please refer to the below sample code.

Test Class:

import com.adobe.learning.core.bean.TestBean;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageFilter;
import com.day.cq.wcm.api.PageManager;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.SlingObject;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Test {

//Injecting the filePath authored in component dialog
@Inject
private String filePath;

@SlingObject
private ResourceResolver resourceResolver;

List<TestBean> pageList;

@PostConstruct
protected void init() {
PageManager pageManager = resourceResolver.adaptTo(PageManager.class);
assert pageManager != null;
Page rootPage = pageManager.getPage(filePath);
//Fetching all child page
Iterator<Page> rootPageIterator = rootPage.listChildren(new PageFilter(false, false), true);
pageList = new ArrayList<>();
//Getting path of all child pages
while (rootPageIterator.hasNext()) {
TestBean testBean = new TestBean();
testBean.setTitle(rootPageIterator.next().getTitle());
testBean.setPagePath(rootPageIterator.next().getPath());
pageList.add(testBean);
}
}

//Getting the list of pages
public List<TestBean> getPageList() {
return pageList;
}
}

TestBean Class :

public class TestBean {

private String title;
private String pagePath;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getPagePath() {
return pagePath;
}

public void setPagePath(String pagePath) {
this.pagePath = pagePath;
}
}

Sightly Code :

<sly data-sly-use.model="com.secondsite.core.models.Test"></sly>
<div data-sly-list.pageDetails="${model.pageList}">
<a href="${pageDetails.pagePath @ extension='html'}">${pageDetails.title}</a>
</div>

You can also check out this article for the list of child pages - https://aeminmyway.blogspot.com/p/how-to-display-list-of-children-under.html 

Hope this could help you !!!

Thanks

Shiv

Avatar

Level 5

the above java code is throwing error. I need to fetch all the child pages on entering the link in the pagefield. That's my requirement.

Avatar

Correct answer by
Level 4

Please check the path field(dialog name) given in the component dialog and change the code accordingly.

Avatar

Community Advisor

Hi @Sanjana12 ,

 

The one @Shiv_Prakash_Patel gave would absolutely work.
I find that you are new to AEM development and I would like to have you the following code snippets respectively.

 

Dialog:

<filePath
  jcr:primaryType="nt:unstructured"
  sling:resourceType="granite/ui/components/coral/foundation/form/pathbrowser"
  fieldLabel="Parent Page"
  name="./filePath"/> 

Component Html:

 

<sly data-sly-use.model="com.secondsite.core.models.Test"/>
<ul data-sly-list.xyz="${model.childrenWithRootPage}">
   <li> ${xyz.getTitle} </li>
</ul>

Sling model:

 

 

import com.day.cq.wcm.api.Page;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.annotations.Default;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.SlingObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Test {

    @Inject
    @Default(values = "/content/second/us/en")
    private String filePath;

    @SlingObject
    ResourceResolver resourceResolver;

    private static final Logger logger = LoggerFactory.getLogger(Test.class);

    
    public List<Page> getChildrenWithRootPage() {
        Page parentPage = resourceResolver.getResource(filePath).adaptTo(Page.class);
        logger.info("Parent page is ::" + parentPage.getPath());
        List<Page> children = new ArrayList<>();
        Iterator<Page> childPages = parentPage.listChildren();
        while (childPages.hasNext()){
            Page childPage = childPages.next();
            children.add(childPage);
            logger.info("Child page is added to list::" + childPage.getPath());
        }
        return children;
    }
}

I made this as simple as possible, so that you understand without any extra java knowledge.

Please note that, this wouldn't be a production level code, the key here is to make you understand the flow.
In order to see what is happening in the back end as well, I strongly recommend you to run your instance on debug mode.

 

command to start in debug: 

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar <your-jar-name>.jar