Expand my Community achievements bar.

Guidelines for the Responsible Use of Generative AI in the Experience Cloud Community.
SOLVED

Child Pages Not Showing

Avatar

Level 7

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
Community Advisor

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

Shiv Prakash

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 



Arun Patidar

Avatar

Community Advisor

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

Shiv Prakash

Avatar

Level 7

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
Community Advisor

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

Shiv Prakash

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