[eluser]wiredesignz[/eluser]
This might be of some use to people having difficulty with CI pagination as it doesn't use the db limit or offset features.
Simply pass in a reference to your full resultset, pagesize and required pagenumber.
Use the fetchResult() function retrieve the current page rows one at a time.
I adapted this from a mysqlPagedResult class I've been using for a few years, don't remember the source.
Code:
<?php
class PagedResult
{
var $resultset = array();
var $numrows;
var $numPages;
var $pageSize;
var $page;
var $row;
var $ptr;
function PagedResult($resultset=array(), $pageSize=1, $resultpage=1)
{
if (!$resultset) return NULL;
$this->resultset = $resultset;
$this->numrows = count($this->resultset->result());
$this->pageSize = $pageSize;
$this->numPages = $this->getNumPages();
if ((int)$resultpage <= 0) $resultpage = 1;
if ($resultpage > $this->numPages) $resultpage = $this->numPages;
$this->setPageNum($resultpage);
}
function getNumPages()
{
if (!$this->resultset) return FALSE;
return ceil($this->numrows / (float)$this->pageSize);
}
function setPageNum($pageNum)
{
if ($pageNum > $this->numPages or $pageNum <= 0) return FALSE;
$this->page = $pageNum;
$this->row = 0;
$this->ptr = ($pageNum-1) * $this->pageSize;
}
function getPageNum()
{
return $this->page;
}
function isLastPage()
{
return ($this->page >= $this->numPages);
}
function isFirstPage()
{
return ($this->page <= 1);
}
function fetchResult($type='object')
{
if (!$this->resultset) return FALSE;
if ($this->row >= $this->pageSize) return FALSE;
if ($this->ptr >= $this->numrows) return FALSE;
$result = ($type == 'object') ?
$this->resultset->row($this->ptr) : $this->resultset->row_array($this->ptr);
$this->ptr++;
$this->row++;
return $result;
}
function getPagedNav($css_class='', $url='', $queryvars = '')
{
if ($queryvars) $queryvars = '/'.$queryvars;
if (!$this->isFirstPage())
{
$nav .= '<a class="'.$css_class.'" href="'.$url.
($this->getPageNum()-1).$queryvars.'"><< Previous page</a> ';
}
if ($this->numPages > 1)
for ($i=1; $i <= $this->numPages; $i++)
{
if ($i==$this->page)
$nav .= ' '.$i.' ';
else
$nav .= ' <a class="'.$css_class.'" href="'.$url.$i.$queryvars.'">'.$i.'</a> ';
}
if (!$this->isLastPage())
{
$nav .= ' <a class="'.$css_class.'" href="'.$url.
($this->getPageNum()+1).$queryvars.'">Next page >></a>';
}
return $nav;
}
}
?>
Also you can use the getPagedNav() function to render your page links and add additional URI segments into the page request, which is not available in CI pagination. (I don't think)