Created
January 6, 2014 18:41
-
-
Save anunay/8287396 to your computer and use it in GitHub Desktop.
CodeIgniter: Digg Style Custom Pagination
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |
/** | |
* CodeIgniter | |
* | |
* An open source application development framework for PHP 5.1.6 or newer | |
* | |
* @package CodeIgniter | |
* @author ExpressionEngine Dev Team | |
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. | |
* @license http://codeigniter.com/user_guide/license.html | |
* @link http://codeigniter.com | |
* @since Version 1.0 | |
* @filesource | |
*/ | |
// ------------------------------------------------------------------------ | |
/** | |
* Pagination Class | |
* | |
* @package CodeIgniter | |
* @subpackage Libraries | |
* @category Pagination | |
* @author ExpressionEngine Dev Team | |
* @link http://codeigniter.com/user_guide/libraries/pagination.html | |
*/ | |
class MY_Pagination extends CI_Pagination { | |
var $base_url = ''; // The page we are linking to | |
var $prefix = ''; // A custom prefix added to the path. | |
var $suffix = ''; // A custom suffix added to the path. | |
var $total_rows = 0; // Total number of items (database results) | |
var $per_page = 10; // Max number of items you want shown per page | |
var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page | |
var $cur_page = 0; // The current page being viewed | |
var $use_page_numbers = FALSE; // Use page number for segment instead of offset | |
var $first_link = '‹ First'; | |
var $next_link = '>'; | |
var $prev_link = '<'; | |
var $last_link = 'Last ›'; | |
var $uri_segment = 3; | |
var $full_tag_open = ''; | |
var $full_tag_close = ''; | |
var $first_tag_open = ''; | |
var $first_tag_close = ' '; | |
var $last_tag_open = ' '; | |
var $last_tag_close = ''; | |
var $first_url = ''; // Alternative URL for the First Page. | |
var $cur_tag_open = ' <strong>'; | |
var $cur_tag_close = '</strong>'; | |
var $next_tag_open = ' '; | |
var $next_tag_close = ' '; | |
var $prev_tag_open = ' '; | |
var $prev_tag_close = ''; | |
var $num_tag_open = ' '; | |
var $num_tag_close = ''; | |
var $page_query_string = FALSE; | |
var $query_string_segment = 'per_page'; | |
var $display_pages = TRUE; | |
var $anchor_class = ''; | |
/** | |
* Constructor | |
* | |
* @access public | |
* @param array initialization parameters | |
*/ | |
public function __construct($params = array()) | |
{ | |
if (count($params) > 0) | |
{ | |
$this->initialize($params); | |
} | |
if ($this->anchor_class != '') | |
{ | |
$this->anchor_class = 'class="'.$this->anchor_class.'" '; | |
} | |
log_message('debug', "Pagination Class Initialized"); | |
} | |
// -------------------------------------------------------------------- | |
/** | |
* Initialize Preferences | |
* | |
* @access public | |
* @param array initialization parameters | |
* @return void | |
*/ | |
function initialize($params = array()) | |
{ | |
if (count($params) > 0) | |
{ | |
foreach ($params as $key => $val) | |
{ | |
if (isset($this->$key)) | |
{ | |
$this->$key = $val; | |
} | |
} | |
} | |
} | |
// -------------------------------------------------------------------- | |
/** | |
* Generate the pagination links | |
* | |
* @access public | |
* @return string | |
*/ | |
function create_links() | |
{ | |
// If our item count or per-page total is zero there is no need to continue. | |
if ($this->total_rows == 0 OR $this->per_page == 0) | |
{ | |
return ''; | |
} | |
// Calculate the total number of pages | |
$num_pages = ceil($this->total_rows / $this->per_page); | |
// Is there only one page? Hm... nothing more to do here then. | |
if ($num_pages == 1) | |
{ | |
return ''; | |
} | |
// Set the base page index for starting page number | |
if ($this->use_page_numbers) | |
{ | |
$base_page = 1; | |
} | |
else | |
{ | |
$base_page = 0; | |
} | |
// Determine the current page number. | |
$CI =& get_instance(); | |
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) | |
{ | |
if ($CI->input->get($this->query_string_segment) != $base_page) | |
{ | |
$this->cur_page = $CI->input->get($this->query_string_segment); | |
// Prep the current page - no funny business! | |
$this->cur_page = (int) $this->cur_page; | |
} | |
} | |
else | |
{ | |
if ($CI->uri->segment($this->uri_segment) != $base_page) | |
{ | |
$this->cur_page = $CI->uri->segment($this->uri_segment); | |
// Prep the current page - no funny business! | |
$this->cur_page = (int) $this->cur_page; | |
} | |
} | |
// Set current page to 1 if using page numbers instead of offset | |
if ($this->use_page_numbers AND $this->cur_page == 0) | |
{ | |
$this->cur_page = $base_page; | |
} | |
$this->num_links = (int)$this->num_links; | |
if ($this->num_links < 1) | |
{ | |
show_error('Your number of links must be a positive number.'); | |
} | |
if ( ! is_numeric($this->cur_page)) | |
{ | |
$this->cur_page = $base_page; | |
} | |
// Is the page number beyond the result range? | |
// If so we show the last page | |
if ($this->use_page_numbers) | |
{ | |
if ($this->cur_page > $num_pages) | |
{ | |
$this->cur_page = $num_pages; | |
} | |
} | |
else | |
{ | |
if ($this->cur_page > $this->total_rows) | |
{ | |
$this->cur_page = ($num_pages - 1) * $this->per_page; | |
} | |
} | |
$uri_page_number = $this->cur_page; | |
if ( ! $this->use_page_numbers) | |
{ | |
$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); | |
} | |
// Calculate the start and end numbers. These determine | |
// which number to start and end the digit links with | |
$start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; | |
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; | |
// Is pagination being used over GET or POST? If get, add a per_page query | |
// string. If post, add a trailing slash to the base URL if needed | |
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) | |
{ | |
$this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'='; | |
} | |
else | |
{ | |
$this->base_url = rtrim($this->base_url, '/') .'/'; | |
} | |
// And here we go... | |
$output = ''; | |
// Render the "First" link | |
if ($this->first_link !== FALSE AND $this->cur_page > ($this->num_links + 1)) | |
{ | |
$first_url = ($this->first_url == '') ? $this->base_url : $this->first_url; | |
$output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; | |
} | |
// Render the "previous" link | |
if ($this->prev_link !== FALSE AND $this->cur_page != 1) | |
{ | |
if ($this->use_page_numbers) | |
{ | |
$i = $uri_page_number - 1; | |
} | |
else | |
{ | |
$i = $uri_page_number - $this->per_page; | |
} | |
if ($i == 0 && $this->first_url != '') | |
{ | |
$output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; | |
} | |
else | |
{ | |
$i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; | |
$output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; | |
} | |
} | |
// Render the pages | |
if ($this->display_pages !== FALSE) | |
{ | |
if ($num_pages < 7 + ($this->num_links * 2)) //not enough pages to bother breaking it up | |
{ | |
for ($counter = 1; $counter <= $num_pages; $counter++) | |
{ | |
if ($counter == $this->cur_page) | |
{ | |
$output .= $this->cur_tag_open. "<span class=\"current\">$counter</span>".$this->cur_tag_close; // Current page | |
} | |
else | |
{ | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$counter.'">'.$counter.'</a>'.$this->num_tag_close; | |
} | |
} | |
} | |
elseif($num_pages > 5 + ($this->num_links * 2)) //enough pages to hide some | |
{ | |
//close to beginning; only hide later pages | |
if($this->cur_page < 1 + ($this->num_links * 2)) | |
{ | |
for ($counter = 1; $counter < 4 + ($this->num_links * 2); $counter++) | |
{ | |
if ($counter == $this->cur_page) | |
{ | |
$output .= $this->cur_tag_open."<span class=\"current\">$counter</span>".$this->cur_tag_close; // Current page | |
} | |
else | |
{ | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$counter.'">'.$counter.'</a>'.$this->num_tag_close; | |
} | |
} | |
$output.= $this->num_tag_open."<a href='#'>...</a>".$this->num_tag_close; | |
$num_pages_minus = $num_pages-1; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$num_pages_minus.'">'.$num_pages_minus.'</a>'.$this->num_tag_close; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$num_pages.'">'.$num_pages.'</a>'.$this->num_tag_close; | |
} | |
//in middle; hide some front and some back | |
elseif($num_pages - ($this->num_links * 2) > $this->cur_page && $this->cur_page > ($this->num_links * 2)) | |
{ | |
$one=1; | |
$two=2; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$one.'">'.$one.'</a>'.$this->num_tag_close; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$two.'">'.$two.'</a>'.$this->num_tag_close; | |
$output.= $this->num_tag_open."<a href='#'>...</a>".$this->num_tag_close; | |
for ($counter = $this->cur_page - $this->num_links; $counter <= $this->cur_page + $this->num_links; $counter++) | |
{ | |
if ($counter == $this->cur_page) | |
{ | |
$output.= $this->cur_tag_open."<span class=\"current\">$counter</span>".$this->cur_tag_close; | |
} | |
else | |
{ | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$counter.'">'.$counter.'</a>'.$this->num_tag_close; | |
} | |
} | |
$output.= $this->num_tag_open."<a href='#'>...</a>".$this->num_tag_close; | |
$num_pages_minus = $num_pages-1; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$num_pages_minus.'">'.$num_pages_minus.'</a>'.$this->num_tag_close; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$num_pages.'">'.$num_pages.'</a>'.$this->num_tag_close; | |
} | |
//close to end; only hide early pages | |
else | |
{ | |
$one=1; | |
$two=2; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$one.'">'.$one.'</a>'.$this->num_tag_close; | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$two.'">'.$two.'</a>'.$this->num_tag_close; | |
$output.= $this->num_tag_open."<a href='#'>...</a>".$this->num_tag_close; | |
for ($counter = $num_pages - (2 + ($this->num_links * 2)); $counter <= $num_pages; $counter++) | |
{ | |
if ($counter == $this->cur_page) | |
{ | |
$output.= $this->cur_tag_open."<span class=\"current\">$counter</span>".$this->cur_tag_close; | |
} | |
else | |
{ | |
$output .= $this->num_tag_open.'<a ' . $this->anchor_class . 'href="' . $this->base_url.$counter.'">'.$counter.'</a>'.$this->num_tag_close; | |
} | |
} | |
} | |
} | |
} | |
// Render the "next" link | |
if ($this->next_link !== FALSE AND $this->cur_page < $num_pages) | |
{ | |
if ($this->use_page_numbers) | |
{ | |
$i = $this->cur_page + 1; | |
} | |
else | |
{ | |
$i = ($this->cur_page * $this->per_page); | |
} | |
$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; | |
} | |
// Render the "Last" link | |
if ($this->last_link !== FALSE AND ($this->cur_page + $this->num_links) < $num_pages) | |
{ | |
if ($this->use_page_numbers) | |
{ | |
$i = $num_pages; | |
} | |
else | |
{ | |
$i = (($num_pages * $this->per_page) - $this->per_page); | |
} | |
$output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.'</a>'.$this->last_tag_close; | |
} | |
// Kill double slashes. Note: Sometimes we can end up with a double slash | |
// in the penultimate link so we'll kill all double slashes. | |
$output = preg_replace("#([^:])//+#", "\\1/", $output); | |
// Add the wrapper HTML if exists | |
$output = $this->full_tag_open.$output.$this->full_tag_close; | |
return $output; | |
} | |
} | |
// END Pagination Class | |
/* End of file Pagination.php */ | |
/* Location: ./system/libraries/Pagination.php */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment