Flag This Hub

Coldfusion Pageable Array

By


This class works just like the Coldfusion Pageable Query class that I created previously, with the exception that you obviously feed in an array rather than a query.  I enjoy having this class for encapsulating logic, retreiving specific pages of the array, and having functions that help with the creation of pagination markup.

Using PageableArray.cfc

To initialize your object, pass in the original coldfusion array with the desired page size.  To retreive the information related to a specific page, pageableArray.getPage(page) will retrieve a limited coldfusion array focused only on the records for the specific page.

PageableArray.cfc

<cfcomponent>
  <cffunction name="init" access="public" output="false" returntype="any">
    <cfargument name="objects" required="true" type="array" />
    <cfargument name="pageSize" required="true" type="numeric" />
    <cfset variables.objects = arguments.objects />
    <cfset variables.pageSize = arguments.pageSize />
    <cfreturn this />
  </cffunction>

  <cffunction name="getArray" access="private" output="false" returntype="array">
    <cfreturn variables.objects />
  </cffunction>

  <cffunction name="getPageSize" access="private" output="false" returntype="numeric">
    <cfreturn variables.pageSize />
  </cffunction>

  <cffunction name="getPageOffset" access="private" output="false" returntype="numeric">
    <cfargument name="page" required="true" type="numeric" />
    <cfreturn (arguments.page - 1) * getPageSize() />
  </cffunction>

  <!--- public --->
  <cffunction name="getAbsoluteObject" access="public" output="false" returntype="any">
    <cfargument name="absolutePosition" required="true" type="numeric" />
    <cfreturn variables.objects[arguments.absolutePosition] />
  </cffunction>

  <cffunction name="getAbsolutePosition" access="public" output="false" returntype="numeric">
    <cfargument name="index" required="true" type="numeric" />
    <cfargument name="page" required="true" type="numeric" />
    <cfset var position = getPageOffset(arguments.page) + arguments.index />
    <cfif position gt ArrayLen(getArray())>
      <cfset position = ArrayLen(getArray()) />
    </cfif>
    <cfreturn position />
  </cffunction>

  <cffunction name="getPage" access="public" output="true" returntype="array">
    <cfargument name="page" required="true" type="numeric" />
    <cfset var i = 1 />
    <cfset var arraySize = getPageSize() />
    <cfset var pageArray = ArrayNew(1) />

    <cfif getAbsolutePosition(arraySize, arguments.page) gte ArrayLen(getArray())>
      <cfset arraySize = ArrayLen(getArray()) mod getPageSize() />
      <cfif arraySize eq 0 and ArrayLen(getArray()) gt 0>
        <cfset arraySize = getPageSize() />
      </cfif>
    </cfif>
    <cfloop index="i" from="1" to="#arraySize#">
      <cfset ArrayAppend(pageArray, getAbsoluteObject(getAbsolutePosition(i, arguments.page))) />
    </cfloop>

    <cfreturn pageArray />
  </cffunction>

  <cffunction name="getPages" access="public" output="false" returntype="numeric">
    <cfreturn Ceiling(ArrayLen(getArray()) / pageSize) />
  </cffunction>

  <cffunction name="getRecordPage" access="public" output="false" returntype="numeric">
    <cfargument name="absolutePosition" required="true" type="numeric" />
    <cfreturn Ceiling(arguments.absolutePosition / pageSize) />
  </cffunction>

  <cffunction name="getRecordsAvailable" access="public" output="false" returntype="numeric">
    <cfreturn ArrayLen(getArray()) />
  </cffunction>
</cfcomponent>

Initializing PageableArray.cfc and Retreiving a Specific Page

To begin, you must feed in your original array followed by the size that you want your pages to be.  To get the array elements specific to your current page, use the getPage method and specify the page number.

<cfset pageableArray = CreateObject("component", "path/to/PageableArray").init(myArray, 5) />
<cfset pageArray = pageableArray.getPage(1) />

Pagination Help

This class can be used to assist in the creation of pagination for your original array of elements.  This specific example came straight out of the pagination that I wrote for the Sitepro Blog.

<cfif pageableArray.getRecordsAvailable() gt 5>
  <div class="custom-pagination">
    <cfset currentPage = event.getArg("page", 1) />
    <cfset linkArgs = event.getArg("linkArgs") />
    <cfif not IsArray(linkArgs)>
      <cfset linkArgs = ArrayNew(1) />
    </cfif>
    <cfif pageableArray.getPages() gt 1>
      <cfif currentPage gt 1>
        <cfset previousLinkArgs = linkArgs />
        <cfset ArrayAppend(previousLinkArgs, "page=#currentPage - 1#") />
        <a class="partial-underline" href="#BuildUrl(event.getName(), ArrayToList(previousLinkArgs))#" rel="prev"><span class="double-arrows">&laquo; </span><span>Previous</span></a>
      <cfelse>
        <b class="disabled"><span class="double-arrows">&laquo; </span>Previous</b>
      </cfif>
      &nbsp;|&nbsp;
      <cfif currentPage lt pageableArray.getPages()>
        <cfset nextLinkArgs = linkArgs />
        <cfset ArrayAppend(nextLinkArgs, "page=#currentPage + 1#") />
        <a class="partial-underline" href="#BuildUrl(event.getName(), ArrayToList(nextLinkArgs))#" rel="next"><span>Next</span><span class="double-arrows"> &raquo;</span></a>
      <cfelse>
        <b class="disabled">Next<span class="double-arrows"> &raquo;</span></b>
      </cfif>
      <br />
      <br />
    </cfif>
    <div class="page-sizes">
      <b>Posts Per Page:&nbsp;&nbsp;</b>
      <cfif pageSize eq 5>
        5
      <cfelse>
        <cfset pageLinkArgs = linkArgs />
        <cfset ArrayAppend(pageLinkArgs, "pageSize=5") />
        <a href="#BuildUrl(event.getName(), ArrayToList(pageLinkArgs))#" title="Display 5 entries per page">5</a>
      </cfif>
      &nbsp;|&nbsp;
      <cfif pageSize eq 10>
        10
      <cfelse>
        <cfset pageLinkArgs = linkArgs />
        <cfset ArrayAppend(pageLinkArgs, "pageSize=10") />
        <a href="#BuildUrl(event.getName(), ArrayToList(pageLinkArgs))#" title="Display 10 entries per page">10</a>
      </cfif>
      &nbsp;|&nbsp;
      <cfif pageSize eq 15>
        15
      <cfelse>
        <cfset pageLinkArgs = linkArgs />
        <cfset ArrayAppend(pageLinkArgs, "pageSize=15") />
        <a href="#BuildUrl(event.getName(), ArrayToList(pageLinkArgs))#" title="Display 15 entries per page">15</a>
      </cfif>
      &nbsp;|&nbsp;
      <cfif pageSize eq 20>
        20
      <cfelse>
        <cfset pageLinkArgs = linkArgs />
        <cfset ArrayAppend(pageLinkArgs, "pageSize=20") />
        <a href="#BuildUrl(event.getName(), ArrayToList(pageLinkArgs))#" title="Display 20 entries per page">20</a>
      </cfif>
    </div>
    <br />
    <div>
      #pageableArray.getAbsolutePosition(1, event.getArg("page", 1))#
      -
      #pageableArray.getAbsolutePosition(pageSize, event.getArg("page", 1))#
      of #pageableArray.getRecordsAvailable()#
    </div>
  </div>
</cfif>

Comments

No comments yet.

Submit a Comment
Members and Guests

Sign in or sign up and post using a hubpages account.



    Like this Hub?
    Please wait working