- 
                Notifications
    
You must be signed in to change notification settings  - Fork 7.6k
 
Alternate Pagination class
Category:Core | Category:Core::Community | Category:Core::Pagination
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.
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';
?>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;
  }
}
  
?>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()));
  }
}
?>Here's the example view in customized paper, [http://customresearchpapers.co.uk/| academic writing] and custom essays 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>