Welcome Guest, Not a member yet? Register   Sign In
Pagination automated
#1

[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.


Messages In This Thread
Pagination automated - by El Forum - 07-27-2008, 12:07 PM
Pagination automated - by El Forum - 07-27-2008, 12:13 PM
Pagination automated - by El Forum - 07-27-2008, 12:39 PM
Pagination automated - by El Forum - 08-31-2008, 07:40 PM
Pagination automated - by El Forum - 09-01-2008, 12:19 AM
Pagination automated - by El Forum - 10-07-2008, 05:36 AM
Pagination automated - by El Forum - 12-21-2008, 07:05 AM
Pagination automated - by El Forum - 01-03-2009, 08:42 PM
Pagination automated - by El Forum - 05-30-2009, 10:17 AM
Pagination automated - by El Forum - 05-30-2009, 10:29 AM
Pagination automated - by El Forum - 06-01-2009, 07:43 AM
Pagination automated - by El Forum - 10-25-2009, 06:27 PM
Pagination automated - by El Forum - 01-02-2010, 06:42 AM
Pagination automated - by El Forum - 01-07-2010, 08:37 AM
Pagination automated - by El Forum - 10-31-2010, 10:02 PM
Pagination automated - by El Forum - 01-05-2011, 04:33 AM
Pagination automated - by El Forum - 02-22-2011, 02:14 AM
Pagination automated - by El Forum - 02-22-2011, 03:59 AM
Pagination automated - by El Forum - 05-10-2013, 11:42 AM
Pagination automated - by El Forum - 07-17-2013, 11:42 PM
Pagination automated - by El Forum - 01-12-2014, 12:23 PM



Theme © iAndrew 2016 - Forum software by © MyBB