Skip to content

Alternate Pagination class

Derek Jones edited this page Jul 4, 2012 · 24 revisions

Category:Core | Category:Core::Community | Category:Core::Pagination

[h3]An Alternate CI Pagination Library[/h3] 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.

[h3]The library init code[/h3] This is the library init code

[b]application/init/init_altpage.php[/b]

<?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';

?>

[h3]The Library[/h3] This is the lib itself.

[b]application/libraries/altpage.php[/b]

<?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;
  }
}
  
?>

[h3]Example Controller[/h3] Here's the simple controller

[b]application/controllers/testpagination.php[/b]

<?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()));
  }
}

?>

[h3]Example View[/h3]

Here's the example view in [url=http://course-works.com/customized-paper]customized paper[/url], [http://customresearchpapers.co.uk/| academic writing] and [url=http://www.rushessay.com]custom essays[/url] 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.

[url=http://www.unitransservice.org]English Translations[/url]

[b]application/views/pgtest.php[/b]

<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>
Clone this wiki locally