Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write Pagination logic?

Can anyone provide some idea/logic to write the pagination logic for the search page i am working on? The information i have is total number of pages for that search- 10 records per page also i am been sent the both the previous and next page number(no problem writing the logic all i need to do i pull that info and populate. I am also getting the info which page i am on. I can only display 10 pages like below

<previous 1 |2 |3 | 4| 5 | 6 | 7 | 8 | 9 | 10 next>

Say if total pages are 15 and when user click next then i need to display like this

<previous 2 |3 |4 |5 |6 |7 |8 |9 |10 |11 next>

At any time i just need to show then 10 pages in the pagination.

 #set($start = 1)
 #set($end = $Integer.parseInt($searchTO.getPagination().getNumberofPages()))
 #set($range = [$start..$end])

#set($iter = 1)
            #foreach($i in $range)
              #foreach($link in $searchTO.getPagination().getDirectPageLinks())
                    #if($i == $iter)
                        #if ($Integer.parseInt($searchTO.getPagination().getPageNumber())==$iter)
                            <a class="search_current" href="/?_page=SEARCH&_action=SEARCH$link">$i &nbsp|</a>
                        #else
                            <a href="/?_page=SEARCH&_action=SEARCH$link">$i &nbsp|</a>
                        #end
                        #set($iter = 1)
                        #break
                    #else
                        #set($iter=$iter+1)
                    #end

                 #end

            #end
like image 510
pushya Avatar asked Oct 19 '11 12:10

pushya


People also ask

How do you describe pagination?

Pagination is the process of separating print or digital content into discrete pages. For print documents and some online content, pagination also refers to the automated process of adding consecutive numbers to identify the sequential order of pages.

How pagination works in JS?

JavaScript Pagination concept is applied for moving among the pages with First, Next, Previous and Last buttons or links. Pagination's main motto is to move among the content immediately by clicking links or buttons. Pagination has multiple links or buttons provided for access First, Next, Previous and Last content.

What are pagination rules?

Pagination consists of the first and last page of the article. If the pagination is continuous, separate pages by a hyphen. If the pagination is discontinuous, separate groupings of page numbers by a comma and space. If the publication has no page numbers, leave out pagination.


2 Answers

Here is how I would implement it: It is generally a good idea to create a Filter class that filters data and contains pagination related information for you. I use something like this:

public abstract class Filter{

     /** Member identifier for the current page number */
     private int currentPageNo;

     /** Member identifier for the current start page number in the page navigation */
     private int currentStartPageNo;

     /** Member identifier for the current end page number in the page navigation */
     private int currentEndPageNo;

     /** Member identifier for the number of elements on a page */
     private int elementsPerPage;

     /** Member identifier for the number of pages you have in the navigation (i.e 2 to  11 or 3 to 12 etc.) */      
     private int pageNumberInNavigation;

     public abstract Query createCountQuery();

     public abstract Query createQuery();

     public void setCurrentPageNo(){
         //Your code here
         //Validation, variable setup
     }

     public Long getAllElementsCount(){
          //Now this depends on the presistence framework you use, this code is
          //just for guidance and has Hibernate-like syntax
          Query query = createCountQuery();
          List list = query.list();
          return !list.isEmpty() && list.get(0) != null ? query.list().get(0) : 0;
     }

     public List getElements(){
          //Now this depends on the presistence framework you use, this code is
          //just for guidance and has Hibernate-like syntax
         Query query = createQuery();
         int from = ((currentPageNo - 1) * elementsPerPage);
         query.setFirstResult(from);
         query.setMaxResults(elementsPerPage);
         //If you use Hibernate, you don't need to worry for null check since if there are no results then an empty collection is returned
         return query.list();
     }

     public List getAllElements(){
         Query query = createQuery();
         return query.list();
     }

     public void refresh(){
         //Your code here
     }

     public List next(){
         //Move to the next page if exists
         setCurrentPageNo(getCurrentPageNo() + 1);
         getElements();
     }

     public List previoius(){
         //Move to the previous page if exists
         setCurrentPageNo(getCurrentPageNo() - 1);
         getElements();
     }

}

You could have special subclasses of filters (depending on what you want to retrieve) and and each subclass would implement it's createCountQuery() and createQuery().

You would put then your Filter to the Velocity context and you could retrieve all the information you need from this class.

When you set the current page pf course you update all the other information that you need (i.e. currentStartPageNo, currentEndPageNo).

You could also have a refresh() method to put the filter back to its initial state.

And of course you should keep the instance of the same filter on the session (I mean you web framework like Struts, Turbine etc.) while the user navigates on the search page to which the Filter belongs.

This is just a guideline, an idea, it is not fully written executable code, just an example to get you started in a direction.

I would also recommend you a jQuery plugin called jqGrid that has pagination support (although you have to have a backed to retrieve data) and a lot more cool stuff. You can use it to display your data in a grid. I use it together with Velocity with no problem. It has a lot of very nice and useful features like filter toolbar, editable cells, data transfer in JSON, XML etc. Honestly, I do not know if it has pagination like you need (I use it with only one page displayed in the navigation and you can not click on a page just use the next a prev buttons to navigate), but it may have support for that.

like image 115
Atticus Avatar answered Sep 23 '22 02:09

Atticus


Server side pagination In order to show all data in one page, Split into parts to attract the users attention. I am using display-tag (To use this maintain one field in POJO class to stare all records data)

<form:form commandName="empdto" action="" method="post"> 
    <h2 align="center">Employee List</h2>                       
    <display:table id="row_id" export="false"  name="empdto.empList" requestURI="/list.form" pagesize="15" cellpadding="2px;" cellspacing="2px;"  >  <!-- class="its" -->
        <display:column property="id" title="ID" sortable="false"  style="border:1;"  />
        <display:column property="name" title="Name" sortable="true" style="border:1;"   /> <!-- sortProperty="name.firstname" -->
        <display:column property="age" title="Age" sortable="true"  style="border:1;" />
        <display:column property="salary" title="Salary" sortable="true"  style="border:1;" />
        <display:column property="address" title="Address" sortable="true" style="border:1;"  />  <!-- style="width:100px" -->

        <display:column title="Edit">        
            <c:set var="clm_id" value="${row_id.id}" />
            <a href="${pageContext.request.contextPath}/editemp.form?id=${clm_id}" >Edit</a> 
        </display:column>
        <display:column title="Delete">        
            <c:set var="clm_id" value="${row_id.id}" />
            <a href="${pageContext.request.contextPath}/deleteEmp.form?id=${clm_id}" onclick="selectobjID(${clm_id})">Delete </a> 
        </display:column>    
    </display:table>                
</form:form>
<%@taglib uri="http://displaytag.sf.net" prefix="display" %>
like image 25
Yash Avatar answered Sep 26 '22 02:09

Yash