Question

Next N Function - Paging

Asked by: jturkington

Having a few issues trying to get my paging solution a little sleaker. What i am trying to accomplish is making the page links display 5 links left and right of the currently viewed page link eg..

<< 5 6 7 8 9 [10] 11 12 13 14 15 >>

Blow is my current NEXTN function which i use: -
<!--- Next-N() method --->
<cffunction name="nextN"
      displayname="Next-N Method"
      hint="Returns a structure containing row (next/back/end/totalrows)"
      access="public"
      returntype="struct"
      output="false">
                        
      <cfargument name="rowsPerPage" type="numeric" required="no" default="10">
      <cfargument name="startRow" type="numeric" required="no" default="1">
      <cfargument name="qryRecordCount" type="numeric" required="yes">
      <cfargument name="cgiRequestMethod" type="string" required="yes">
            
      <!--- Setup nextN structure --->
      <cfset var nextN = structnew()>
            
      <!--- Setup rowsPerPage Default --->
      <cfset nextN.rowsPerPage = arguments.rowsPerPage>
            
      <!--- What row to start at? Assume first by default --->
      <cfset nextN.startRow = arguments.startRow>
            
      <!--- If form is posted set start row to 1 --->
      <cfif NOT CompareNoCase(arguments.cgiRequestMethod,"post")>
                  <cfset nextN.startRow = 1>
      </cfif>
            
      <!--- We know the total number of rows from query --->
      <cfset nextN.totalRows = arguments.qryRecordCount>
            
      <!--- Last row is 10 rows past the starting row, or total number of query rows, whichever is less --->
      <cfset nextN.endRow = Min(nextN.startRow + nextN.rowsPerPage - 1, nextN.totalRows)>
            
      <!--- Next button goes to 1 past current end row  --->
      <cfset nextN.startRowNext = nextN.endRow + 1>
            
      <!--- Back button goes back N rows from start row --->
      <cfset nextN.startRowBack = nextN.startRow - nextN.rowsPerPage>

      <cfreturn nextN>
</cffunction>

Example of current page links: -
<!--- Pagination --->
<div class="pagination">
        <cfoutput>
            <!--- Simple "Page" counter, starting at first "Page" --->
            <cfset ThisPage = 1>
            Page
           
            <!--- Back button --->
            <cfif nextN.startRowBack GT 0>
                <a href="#cgi.script_name#?startrow=#nextN.startRowBack#&orderby=#url.orderBy#&order=#url.order#&#variables.urlString#" title="Back #nextN.rowsPerPage# records" tabindex="7">
                    <span>&laquo;</span>
                </a>
            </cfif>
           
            <!--- Loop thru row numbers, in increments of RowsPerPage --->
            <cfloop from="1" to="#nextN.totalRows#" step="#nextN.rowsPerPage#" index="pageRow">
                <!--- Detect whether this "Page" currently being viewed --->
                <cfset IsCurrentPage = (pageRow gte nextN.startRow) AND (pageRow lte nextN.endRow)>
         
                <!--- If this "Page" is current page, show without link --->
                <cfif IsCurrentPage>
                    <b>#thisPage#</b>  
                <cfelse>
                    <!--- Otherwise, show with link so user can go to page  --->  
                    <a href="#cgi.script_name#?startrow=#pageRow#&orderby=#url.orderBy#&order=#url.order#&#variables.urlString#" tabindex="6">#thisPage#</a>  
                </cfif>
               
                <!--- Increment ThisPage variable --->
                <cfset thisPage = thisPage + 1>
            </cfloop>
           
             <!--- Next button --->
            <cfif nextN.startRowNext LTE nextN.totalRows>
                <a href="#cgi.script_name#?startrow=#nextN.startRowNext#&orderby=#url.orderBy#&order=#url.order#&#variables.urlString#" title="Next #nextN.rowsPerPage# records" tabindex="8">
                    <span>&raquo;</span>
                </a>
            </cfif>
        </cfoutput>      
    </div>

Thanks

Jonathan

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2008-09-18 at 14:07:42ID23744014
Tags

coldfusion

Topics

Cold Fusion Markup Language

,

ColdFusion Application Server

Participating Experts
1
Points
500
Comments
7

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. cfif inside a function
    i am getting an error message , can i put cfif inside a function tag? liek this? <CFCOMPONENT> <CFFUNCTION access="remote" name="list_vendors" returntype="string" hint="Getting the list of vendors"> ...
  2. nesting <cfif> and <cfset>
    This Code won't work...why? I've tried different combinations of nesting <cfif> and <cfelseif> and it either skips to the last if statement and executes that (whether it is true or not) or if I use <cfelseif> it stops on the second <cfelseif> statement...
  3. <CFScript> Vs <CFSet> and <CFIF>
    Is <CFScript> faster than <CFSet> and <CFIF> Example <CFScript> if(1=1){ foo=true; } </CFScript> vs <cfif 1 is 1> <cfset foo=true/> </cfif> Which one is better proformace wise???????
  4. if null cfset
    Simple question.... I have some nulls returning from a query and I'd like to set the values equal to something. I've tried it a few different ways. <cfif #something# eq NULL> <cfset something = "NA"> </cfif> ...with this I get an error <...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: gdemariaPosted on 2008-09-19 at 10:41:25ID: 22523563

what are the issues?
I am curious why you are looping through row numbers at the bottom when it seems you just need to loop through the pages 1..2...3  

<cfloop index="pageNo" from="1" to ="#totalPages#">

 

by: jturkingtonPosted on 2008-09-19 at 13:05:06ID: 22524992

There are no issues, just want to visually improve the page links display. You can imagine if 20000 recordcount is returned and using the above function this can produce alot of page links !!

Dont worry im not returning all 20000 records, using a stored procedure with a CTE expression to bring back the currently displayed x records...........

Thanks for the loop tip...

Any ideas on how to improve the page links display ??

Jonathan


 

by: gdemariaPosted on 2008-09-19 at 13:13:41ID: 22525083

Oh, so you're goal is just to clean up the pagination display... right?

Typically, you would cut out the middle pages, always show page 1 and always show the last page, then show the 3 pages that are on either side of your current page number.  Add ... where you skip pages.

In this example, you're on page 7 out of 195..

  1 ... 4 5 6 [7] 8 9 10 ... 195

 

by: jturkingtonPosted on 2008-09-21 at 05:39:53ID: 22534200

Do you have any sample code for performing this ?,  what way do you perform pagination within coldfusion do you have a generic function to handle this ?

 

by: gdemariaPosted on 2008-09-21 at 09:37:43ID: 22535215


Here's a general start.. needs some tweaking..

<cfset offset = 3>
<cfif max(currentPage-offset,1) gt 1>
  <a href="#cgi.script_name#?page=1">1</a> ..
</cfif>
<cfloop index="kk" from="#max(currentPage-offset,1)#" to="#max(currentPage+offset,LastPage)#">
  <a href="#cgi.script_name#?page=#kk#">#kk#</a>
</cfloop>
<cfif max(currentPage+offset,LastPage) lt lastPage>
   <a href="#cgi.script_name#?page=#lastPage#">#lastPage#</a>
</cfif>


 

by: gdemariaPosted on 2008-09-21 at 09:41:14ID: 22535224

Here's an example of one pagination routine I use.

Note that I make all calculations based on page number and page size, after that I figure out which records to display based on these main factors.

This algorithm works my fetching all primary keys from the table.  This will give you a pointer to all records, and you will know their order and the number in total.  Use this information with the current page number to get the primary keys for only the page being displayed.  Use the primary keys to fetch the details for that page's records and display them.

<!--- get the page number from the URL or form variable, otherwise, start at 1 ---->
<cfif isDefined('url.page') and val(url.page)>
  <cfset variables.pageNumber = url.page>
<cfelseif isDefined('form.page') and val(form.page)>
  <cfset variables.pageNumber = form.page>
<cfelse>
  <cfset variables.pageNumber = 1>
</cfif>
 
 
<cfset variables.items_per_page = 25> <!---- define how many records to show on a page ---->
 
<!--- this query fetches ALL records that match the criteria,
      alter this query with the correct where clause and order by 
      to get the right records in the right order. 
      To Keep the fetch small, we get ONLY the ID from this query
       --------->
<cfquery NAME="AllRecords" DATASOURCE="#request.datasource#">
  select ID --- fetch only the ID
  from MyTable
  where someFields = #variables.fitler#
  and   otherFields = #variables.otherFields#
  ORDER BY WHATEVER
</cfquery>
 
<!--- do a little math to figure out the max number of pages ---->
<cfset variables.numberOfPages = ceiling(AllRecords.recordCount / variables.items_per_page)>
 
<!---- make sure the page number requested is within the range of pages that we have ---->
<cfif variables.PageNumber le 0> <!---- if page number is too low, set it to first page --->
    <cfset variables.PageNumber = 1>
<cfelseif variables.pageNumber gt AllRecords.recordCount>  <!--- if page number passed is too high, set it to last page ---->
    <cfset variables.PageNumber = variables.numberOfPages>
</cfif>
<!---- based on the page number and number of items on a page, determine the start and end record for the page ---->
<!---- for example, page 3 with 25 items per page will show records 51 through 75, page 1 shows records 1-25 ---->
<cfset variables.startRecord   = ((variables.PageNumber - 1) * variables.items_per_page) + 1>
<cfset variables.endRecord     = variables.startRecord + items_per_page - 1>
 
 
<!---- Now we have the starting record number and the ending one, 
         so we are going to build a little list of the IDs for those records.
         If we show page 3, we will get the ID for records 51 through 76 ----->
<cfset variables.PageIDList = "">
<cfloop index="ii" from="#variables.startRecord#" to="#variables.endRecord#">
  <cfset variables.PageIDList = listAppend(variables.PageIDList, AllRecords['ID'][ii])>
</cfloop>
 
<!----- pageIDList now holds a list of IDS; such as 56,12,98,45,12,5,8, etc.
          These IDs are the IDs we need for this page.  Now fetch again to grab
          all the data we need about these;  So we SELECT * FROM... 
          Be sure to use the Same ORDER BY Clause as in AllRecords Query --------->
<cfquery NAME="thisPage" DATASOURCE="#request.datasource#">
  select * 
  from MyTable
  where ID in (#variables.PageIDList#)
  ORDER BY WHATEVER
</cfquery>
 
 
<!---- now you have the records you need for this page, use the thisPage
       query in a simple cfoutput to display the records ---->
<cfoutput query="thisPage">
 #thisPage.column1# #thisPage.column2# #thisPage.column3#<br>
</cfoutput>
 
<!---- now show the page list ---->
<cfloop index="ii" from="1" to="#variables.numberOfPages">
  <cfif variables.PageNumber is ii>
   #ii#
  <cfelse>
   <a href="/index.cfm?page=#ii#">#ii#</A>
  </cfif>
</cfloop>
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:

Select allOpen in new window

 

by: jturkingtonPosted on 2008-09-24 at 01:20:07ID: 22557721

Thanks gdemaria for the help, tweaked the pagination display added a few mins instead of maxs: -
 <!--- First page number link --->                              
<cfif max(nextN.currentPageNo-nextN.pageNoOffset,1) gt 1>
<a href="#cgi.script_name#?page=1">1</a> ..
</cfif>

<!--- Page number links within offset range --->
<cfloop index="pageNo" from="#max(nextN.currentPageNo-nextN.pageNoOffset,1)#" to="#min(nextN.currentPageNo+nextN.pageNoOffset,nextN.noOfPages)#">
<cfif nextN.currentPageNo is pageNo>
#pageNo#
<cfelse>
<a href="#cgi.script_name#?page=#pageNo#">#pageNo#</a>
</cfif>
</cfloop>
                           
<!--- Last page no link --->
<cfif min(nextN.currentPageNo+nextN.pageNoOffset,nextN.noOfPages) lt nextN.noOfPages>
..  <a href="#cgi.script_name#?page=#nextN.noOfPages#">#nextN.noOfPages#</a>
</cfif>
                           
<!--- Next button --->
<cfif nextN.nextPageNo lte nextN.noOfPages>
<a href="#cgi.script_name#?page=#nextN.nextPageNo#&#variables.urlString#" title="Next #nextN.rowsPerPage# records" tabindex="8">
<span>&raquo;</span>
</a>
</cfif>

Thanks again

Jonathan

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...