CodeIgniter: Friendly pagination with search system

After a long pause, here am I. Well, there’s a few tutorials around, including the official CI wiki suggesting a more friendly pagination implementation, with page numbers on the link, because the actual CI pagination works with the offset from the database. The code I use today is from the official wiki, but the search system I implemented myself, So, here we go…

First, on the original file, we have the create_link() function. On mine, there is an argument $search, it will be permanent on every link, just like this: http://www.server.com/products/page/2/notebook-sony

I modified the ident style from CI Pagination.php, I Just can’t work with the Allman ident style (more info info: a href=”http://en.wikipedia.org/wiki/Indent_style”>wikipedia). Analising the whole code, there is no big tricks, I just concatenate the search argumento in the end of links.

Pagination.php:

[cc lang=”php”]
‘;
var $cur_tag_close = ‘‘;
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’;

/**
* Constructor
*
* @access public
* @param array initialization parameters
*/
function CI_Pagination($params = array())
{
if (count($params) > 0)
{
$this->initialize($params);
}

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($search=”) {

if ($search!=”) $search = ‘/’.$search;

// 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 ”;
}

// 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) != 0){
$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) != 0) {
$this->cur_page = $CI->uri->segment($this->uri_segment);
// Prep the current page – no funny business!
$this->cur_page = (int) $this->cur_page;
}
}

if ( ! is_numeric($this->cur_page)) {
$this->cur_page = 0;
}

if ($this->cur_page==0) {
$this->cur_page = 1;
}

// Is the page number beyond the result range?
// If so we show the last page
if ($this->cur_page > $this->total_rows) {
$this->cur_page = ($num_pages – 1) * $this->per_page;
}

$uri_page_number = $this->cur_page;

// 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 herwe go…
$output = ”;

// Render the “First” link
if ($this->cur_page > $this->num_links) {
$output .= $this->first_tag_open.’base_url.$i.$search.'”>’.$this->prev_link.’‘.$this->prev_tag_close;
}

// Write the digit links
for ($loop = $start -1; $loop <= $end; $loop++) { $i = ($loop * $this->per_page) – $this->per_page;
if ($i >= 0) {
if ($this->cur_page == $loop) {
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
} else {
$n = ($i == 0) ? ‘1’ : $loop;
$output .= $this->num_tag_open.’base_url.($this->cur_page + 1).$search.'”>’.$this->next_link.’‘.$this->next_tag_close;
}

// Render the “Last” link
if (($this->cur_page + $this->num_links) < $num_pages) { $i = $num_pages; $output .= $this->last_tag_open.’Did you like this? Share it:


7,616 Comments

So, what do you think ?