Category:Core | Category:Core -> Community | Category:Core -> Pagination
An Alternate CI Pagination Library
This alternate pagination lib (Requires PHP5) uses page numbers in the URI as opposed to the offsets used by the stock class. Where the default CI class returns a html string, this class returns an array to be formatted by your own templates or views.
The library init code
This is the library init code
application/init/init_altpage.php
<?php if (!defined('BASEPATH')) exit('Direct access not permitted!');
if (! class_exists('Altpage')){
include_once(APPPATH.'libraries/Altpage'.EXT);
}
$obj =& get_instance();
$obj->altpage = new Altpage();
$obj->ci_is_loaded[] = 'altpage';
?>
The Library
This is the lib itself.
application/libraries/altpage.php
<?php
/* CI License & stuff */
class Altpage {
public $page = 0;
public $per_page = 20;
public $total = 0;
public $uri_segment;
private $_link_uri = '';
public function __construct($p=array()){
if (count($p) > 0) $this->init($p);
log_message('debug', 'Altpage Class Initialized');
}
public function init($p){
foreach($p as $k => $v){ $this->$k = $v; }
}
private function _setLinkURI(){
$obj =& get_instance();
$segs = $obj->uri->segment_array();
if ($this->page < 1){
if (isset($segs[$this->uri_segment])){
$this->page = (int) $segs[$this->uri_segment];
} else {
$this->page = 1;
}
}
$segs[$this->uri_segment] = '%d';
$this->_link_uri = $obj->config->item('base_url').implode('/', $segs);
}
private function _getLink($page){
return (string) sprintf($this->_link_uri, $page);
}
public function create_links(){
$num_pages = (int) ceil($this->total / $this->per_page);
if ($this->total == 0 OR $this->per_page == 0 OR $num_pages < 2) return '';
$this->_setLinkURI();
$pg=array();
/* Upto 2 pages either side + current page */
$pg['pages']=array();
$t=(bool)($this->page < 2);
$pg['first'] =($t)? '': $this->_getLink(1);
$pg['prev'] = ($t)? '': $this->_getLink($this->page - 1);
if ($t===false){
$i=2;
while ($i>0){
if (($this->page - $i) > 0){
$pg['pages'][$this->page - $i] = $this->_getLink($this->page - $i);
}
--$i;
}
}
/* Current page should not be a clickable link! */
$pg['pages'][$this->page]=$this->page;
$t=(bool)($this->page < $num_pages);
if ($t===true){
$i=1;
while ($i<=2){
if (($this->page + $i) <= $num_pages){
$pg['pages'][$this->page + $i] = $this->_getLink($this->page + $i);
}
++$i;
}
}
$pg['next'] = ($t)? $this->_getLink($this->page + 1): '';
$pg['last'] = ($t)? $this->_getLink($num_pages): '';
return $pg;
}
}
?>
Example Controller
Here’s the simple controller
application/controllers/testpagination.php
<?php
class Testpagination extends Controller {
function index(){
$this->load->library('altpage');
$_p['total'] = 200; /* Total results */
$_p['per_page'] = 20; /* Results Per Page */
$_p['uri_segment']=2; /* Used to read and set pages */
$this->altpage->init($_p);
/* Pass pagination as array to the view */
$this->load->view('pgtest',
array('pagination'=>$this->altpage->create_links()));
}
}
?>
Example View
Here’s the example view complete with example CSS, note how the current page is handled in the loop because you’ll need to deal with this in your template or view.
application/views/pgtest.php
<html>
<head>
<title>Alternate Pagination Class For CI</title>
<style>
body { background-color: #000; font-family: Tahoma, Verdana; }
#pagination { background-color: #eee; text-align: center;
margin: 2em; padding: 0.75em; border: 4px solid #bad; }
.currentpage,
#pagination a:link,
#pagination a:visited { color: #000; text-decoration: none;
background-color: transparent;
padding: 2px; border: 1px solid #000; }
#pagination a:hover { color: #fff; background-color: #bad; }
#pagination a:focus,
.currentpage { background-color: #fff; border: 1px solid #bad;
font-weight: bold; }
</style>
</head>
<body>
<?php
if (isset($pagination)):
?>
<div id="pagination">
<?php
if ($pagination['first']!=''){
echo ' <a href="'.$pagination['first'].'">« First</a> ';
}
if ($pagination['prev']!=''){
echo ' <a href="'.$pagination['prev'].'"><</a> ';
}
foreach ($pagination['pages'] as $page=>$link){
/* NOTE: Current page should NOT be a clickable link */
if ($page==$link){
echo ' <span class="currentpage">'.$page.'</span> ';
} else {
echo ' <a href="'.$link.'">'.$page.'</a> ';
}
}
if ($pagination['next']!=''){
echo ' <a href="'.$pagination['next'].'">></a> ';
}
if ($pagination['last']!=''){
echo ' <a href="'.$pagination['last'].'">Last »</a>';
}
?>
</div>
<?php
endif;
?>
</body>
</html>
