
Thus instead of tieing it in directly with mysql_* functions, or even a database object, I have built it as a decorator/helper for any array.
As this is the Critique forum, please crticise away

Code: Select all
<?php
/**
* Pagination Class
* Used for easy creation of paginated data
* which is stored in an array
*/
class jmt_Paginator
{
/**
* Data to be paginated.
* @var array data
* @private
*/
private $data;
/**
* Rows to be displayed per page
* @var int itemsPerPage
* @private
*/
private $itemsPerPage;
/**
* Current Page
* @var int currentPage
* @private
*/
private $currentPage;
/**
* The first page
* @var int firstPage
* @private
*/
private $firstPage;
/**
* The last page of paginated data.
* @var int lastPage
* @private
*/
private $lastPage;
/**
* Paginator constructor
* sets default values of properties
* @param object data
* @param int itemsPerPage
*/
public function __construct (array $data, $itemsPerPage = 10)
{
$this->data = $data;
$this->itemsPerPage = $itemsPerPage;
$this->currentPage = 1;
$this->firstPage = 1;
$this->lastPage = ceil(count($this->data) / $this->itemsPerPage);
}
/**
* Retrieve the data of the current page.
* @return array data
*/
public function getPageData ()
{
$start = ($this->itemsPerPage * ($this->currentPage - 1));
return array_slice($this->data, $start, $this->itemsPerPage);
}
/**
* Set the current page.
* Will default to first/last if supplied page number out of range.
* @param int page
*/
public function setPage ($page)
{
if ($page > $this->lastPage) $page = $this->lastPage;
if ($page < $this->firstPage) $page = $this->firstPage;
$this->currentPage = $page;
}
/**
* Get the current page number.
* @return int pageNumber
*/
public function getCurrentPage ()
{
return $this->currentPage;
}
/**
* Get the first page number
* @return int pageNumber
*/
public function getFirstPage ()
{
return $this->firstPage;
}
/**
* Get the last page number
* @return int pageNumber
*/
public function getLastPage ()
{
return $this->lastPage;
}
/**
* Get the next page number
* @return int pageNumber
* @return bool noNextPage
*/
public function getNextPage ()
{
if ($this->currentPage < $this->lastPage) {
return ($this->currentPage + 1);
} else {
return false;
}
}
/**
* Get the previous page number
* @return int pageNumber
* @return bool noPrevPage
*/
public function getPrevPage ()
{
if ($this->currentPage > $this->firstPage) {
return ($this->currentPage - 1);
} else {
return false;
}
}
/**
* Get total number of pages
* @return int totalPages
*/
public function getTotalPages ()
{
return $this->lastPage;
}
}
?>
Code: Select all
class PaginationTest extends UnitTestCase
{
var $array;
function PaginationTest ()
{
$this->array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
$this->UnitTestCase();
}
function testPaginationDefaultRowsPerPage () {
// default items per page = 10; 15 items = 2pages.
$pagin = new jmt_Paginator($this->array);
$pagin->setPage(-99);
$this->assertEqual($pagin->getPageData(), array(1,2,3,4,5,6,7,8,9,10));
$pagin->setPage(1);
$this->assertEqual($pagin->getPageData(), array(1,2,3,4,5,6,7,8,9,10));
$pagin->setPage(2);
$this->assertEqual($pagin->getPageData(), array(11,12,13,14,15));
$pagin->setPage(99);
$this->assertEqual($pagin->getPageData(), array(11,12,13,14,15));
}
function testPaginationNonDefaultRowsPerPage () {
// 5 items per page; 15 items = 3 pages.
$pagin = new jmt_Paginator($this->array, 5);
$pagin->setPage(-99);
$this->assertEqual($pagin->getPageData(), array(1,2,3,4,5));
$pagin->setPage(1);
$this->assertEqual($pagin->getPageData(), array(1,2,3,4,5));
$pagin->setPage(2);
$this->assertEqual($pagin->getPageData(), array(6,7,8,9,10));
$pagin->setPage(3);
$this->assertEqual($pagin->getPageData(), array(11,12,13,14,15));
$pagin->setPage(99);
$this->assertEqual($pagin->getPageData(), array(11,12,13,14,15));
}
function testPaginationGetPage () {
// 5 items per page; 15 items = 3 pages.
$pagin = new jmt_Paginator($this->array, 5);
$this->assertEqual($pagin->getNextPage(), 2);
$this->assertEqual($pagin->getPrevPage(), false);
$this->assertEqual($pagin->getCurrentPage(), 1);
$pagin->setPage(2);
$this->assertEqual($pagin->getNextPage(), 3);
$this->assertEqual($pagin->getPrevPage(), 1);
$this->assertEqual($pagin->getCurrentPage(), 2);
$pagin->setPage(99);
$this->assertEqual($pagin->getNextPage(), false);
$this->assertEqual($pagin->getPrevPage(), 2);
$this->assertEqual($pagin->getCurrentPage(), 3);
}
}