[eluser]JoostV[/eluser]
Hi there,
Here's an extension for the pagination class.
It automatically calculates the base_url and uri_segment for the pagination class so you don't have to set them manually in your controller.
Also, it automatically calculates the offset form the URI and stores it in $this->pagination->offset, which you can use as LIMIT parameter in your database calls.
All you need to do order to calculate these values is to use a distinctive string in your URI, in the segment preceding the offset. For instance:
www.example.com/blog/overview/Page/12 (in which 'Page' would be the distinctive string).
It's the first lib I post here, so bear with me please.
1. Create this file MY_Pagination.php in the applications/libraries/ folder:
Code:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* @name MY_Pagination.php
* @version 1.0
* @author Joost van Veen www.accentinteractive.nl
* @created: Sun Jul 27 16:27:26 GMT 2008 16:27:26
*
* Extends CI's pagination class (http://ellislab.com/codeigniter/user-guide/libraries/pagination.html)
* It sets some variables for configuration of the pagination class dynamically,
* depending on the URI, so we don't have to substract the offset from the URI,
* or set $config['base_url'] and $config['uri_segment'] manually in the controller
*
* Here is what is set by this extension class:
* 1. $this->offset - the current offset
* 2. $this->uri_segment - the URI segment to be used for pagination
* 3. $this->base_url - the base url to be used for pagination
* (where $this refers to the pagination class)
*
* The way this works is simple:
* If there we use pagination, it must ALWAYS follow the following syntax and be
* located at the END of the URI:
* PAGINATION_SELECTOR/offset
*
* The PAGINATION_SELECTOR is a special string which we know will ONLY be in the
* URI when paging is set. Let's say the PAGINATION_SELECTOR is 'Page' (since most
* coders never use any capitals in the URI, most of the times any string with
* a single capital character in it will suffice).
*
* Example use (in controller):
* // Initialize pagination
* $config['total_rows'] = $this->db->count_all_results('my_table');
* $config['per_page'] = 10; // You'd best set this in a config file, but hey
* $this->pagination->initialize($config);
* $this->data['pagination'] = $this->pagination->create_links();
*
* // Retrieve paginated results, using the dynamically determined offset
* $this->db->limit($config['per_page'], $this->pagination->offset);
* $query = $this->db->get('my_table');
*
*/
class MY_Pagination extends CI_Pagination {
var $offset = 0;
var $pagination_selector = 'Page';
function MY_Pagination()
{
parent::CI_Pagination();
log_message('debug', "MY_Pagination Class Initialized");
$this->_set_pagination_offset();
}
/**
* Set dynamic pagination variables in $CI->data['pagvars']
*
*/
function _set_pagination_offset()
{
// Instantiate the CI super object so we have access to the uri class
$CI =& get_instance();
// Store pagination offset if it is set
if (strstr($CI->uri->uri_string(), $this->pagination_selector)) {
// Get the segment offset for the pagination selector
$segments = $CI->uri->segment_array();
// Loop through segments to retrieve pagination offset
foreach ($segments as $key => $value) {
// Find the pagination_selector and work from there
if ($value == $this->pagination_selector) {
// Store pagination offset
$this->offset = $CI->uri->segment($key + 1);
// Store pagination segment
$this->uri_segment = $key + 1;
// Set base url for paging. This only works if the
// pagination_selector and paging offset are AT THE END of
// the URI!
$uri = $CI->uri->uri_string();
$pos = strpos($uri, $this->pagination_selector);
$this->base_url = $CI->config->item('base_url') . substr($uri, 0, $pos + strlen($this->pagination_selector));
}
}
}
else { // Pagination selector was not found in URI string. So offset is 0
$this->offset = 0;
$this->uri_segment = 0;
$this->base_url = $CI->config->item('base_url') . $CI->uri->uri_string() . '/' . $this->pagination_selector;
}
}
}
?>
In your controller, you create pagination an retrieve records from the database as such:
Code:
// Load the pagination class if you haven't already done so
// This will also load our extension class MY_Pagination.php
if(!$this->pagination) {
$this->load->library('pagination');
}
// Initialize pagination
$config['total_rows'] = $this->db->count_all_results('my_table'); // count all records
$config['per_page'] = 10; // You'd best set rows per page in a config file, but hey
$this->pagination->initialize($config); // initialize pagination
// Create pagination links
$data['pagination_links'] = $this->pagination->create_links();
// Retrieve paginated results, using the dynamically determined offset
$this->db->limit($config['per_page'], $this->pagination->offset);
$query = $this->db->get('my_table');
if ($query->num_rows() > 0) {
$data['results'] = $query->result();
}
// Load your view
$this->load->view('my_view', $data);
Then, in your view you can use $pagination_links to display your pagination links.
Hope you enjoy this little lib.