Search and Pagination Component | Community
Skip to main content
New Participant
October 17, 2023
Solved

Search and Pagination Component

  • October 17, 2023
  • 2 replies
  • 703 views

Hi,

I am a beginner in AEM,I want to implement the following function as in screenshot. This site has a paging function. How can I implement it.

Best regards!

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by Sady_Rifat

Hi @krist_wang ,

From your Ajax call, call the servlet,

 

bin/public/aem-demo/blog?page=2

 

Where the page params will be the page number.

Try with the following Java code and change them according to your logic.

 

@Component(service = Servlet.class, property = { Constants.SERVICE_DESCRIPTION + "= Servlet", ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET, ServletResolverConstants.SLING_SERVLET_PATHS + "=bin/public/aem-demo/blog" }) public class PaginationServlet extends SlingAllMethodsServlet { @Reference private QueryBuilder queryBuilder; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { String pageNumber = request.getParameter("page") != null ?request.getParameter("page") : "1"; Map<String, String> searchPredicates = searchPredicates("10", pageNumber); Query query = queryBuilder.createQuery(PredicateGroup.create(searchPredicates), request.getResourceResolver().adaptTo(Session.class)); SearchResult searchResult = query.getResult(); // Convert search results to a list of pages List<MyModel> items = new ArrayList<>(); for (Hit hit : searchResult.getHits()) { try { Page page = hit.getResource().adaptTo(Page.class); // Put necessary Items into your model MyModel model = new MyModel(page.getTitle(), page.getPath()); items.add(model); } catch (RepositoryException e) { log.error("Error Happened {}", e, e.getMessage()); } } response.setHeader("content-type", "application/json;charset=UTF-8"); response.setStatus(response.SC_OK); response.getWriter().write(new ObjectMapper().writeValueAsString(items)); } private Map<String, String> searchPredicates(String itemPerPage, String pageNum) { Map<String, String> predicateMap = new HashMap<>(); predicateMap.put("path", "/content/aem-demo/master"); predicateMap.put("property", "cq:Page"); predicateMap.put("p.limit", itemPerPage); predicateMap.put("p.offset", pageNum); return predicateMap; } }

 

Hope this helps you.

2 replies

kautuk_sahni
Employee
October 19, 2023

@krist_wang Did you find the suggestions from Sady helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.

Kautuk Sahni
Sady_Rifat
Sady_RifatAccepted solution
New Participant
October 17, 2023

Hi @krist_wang ,

From your Ajax call, call the servlet,

 

bin/public/aem-demo/blog?page=2

 

Where the page params will be the page number.

Try with the following Java code and change them according to your logic.

 

@Component(service = Servlet.class, property = { Constants.SERVICE_DESCRIPTION + "= Servlet", ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET, ServletResolverConstants.SLING_SERVLET_PATHS + "=bin/public/aem-demo/blog" }) public class PaginationServlet extends SlingAllMethodsServlet { @Reference private QueryBuilder queryBuilder; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { String pageNumber = request.getParameter("page") != null ?request.getParameter("page") : "1"; Map<String, String> searchPredicates = searchPredicates("10", pageNumber); Query query = queryBuilder.createQuery(PredicateGroup.create(searchPredicates), request.getResourceResolver().adaptTo(Session.class)); SearchResult searchResult = query.getResult(); // Convert search results to a list of pages List<MyModel> items = new ArrayList<>(); for (Hit hit : searchResult.getHits()) { try { Page page = hit.getResource().adaptTo(Page.class); // Put necessary Items into your model MyModel model = new MyModel(page.getTitle(), page.getPath()); items.add(model); } catch (RepositoryException e) { log.error("Error Happened {}", e, e.getMessage()); } } response.setHeader("content-type", "application/json;charset=UTF-8"); response.setStatus(response.SC_OK); response.getWriter().write(new ObjectMapper().writeValueAsString(items)); } private Map<String, String> searchPredicates(String itemPerPage, String pageNum) { Map<String, String> predicateMap = new HashMap<>(); predicateMap.put("path", "/content/aem-demo/master"); predicateMap.put("property", "cq:Page"); predicateMap.put("p.limit", itemPerPage); predicateMap.put("p.offset", pageNum); return predicateMap; } }

 

Hope this helps you.