<?php
 
 
/*******************************************************************************
 
*                                  Pagination class                            *
 
*                             Created: 12th January 2009                       *
 
*                             Updated: 9th September 2009                      *
 
*                             ©Copyright Jay Gilford 2009                      *
 
*                              http://www.jaygilford.com                       *
 
*                            email: jay [at] jaygilford.com                    *
 
*******************************************************************************/
 
 
 
class pagination
 
{
 
    ################################
 
    # PRIVATE VARS - DO NOT ALTER  #
 
    ################################
 
    private $_query = '';
 
    private $_current_page = 1;
 
    private $_padding = 2;
 
    private $_results_resource;
 
    private $_output;
 
 
 
    ################################
 
    #       RESULTS VARS           #
 
    ################################
 
    public $results_per_page = 10;          #Number of results to display at a time
 
    public $total_results = 0;              #Total number of records
 
    public $total_pages = 0;                #Total number of pages
 
 
 
    public $link_prefix = '/?page=';        #String for link to go before the page number
 
    public $link_suffix = '';               #String for link to go after the page number
 
    public $page_nums_separator = ' | ';    #String to go between the page number links
 
 
 
    ################################
 
    #      ERROR HOLDING VAR       #
 
    ################################
 
    public $error = null;
 
 
 
    ################################
 
    # PAGINATION TEMPLATE DEFAULTS #
 
    ################################
 
    public $tpl_first = '<a href="{link}">«</a> | ';
 
    public $tpl_last = ' | <a href="{link}">»</a> ';
 
 
 
    public $tpl_prev = '<a href="{link}">‹</a> | ';
 
    public $tpl_next = ' | <a href="{link}">›</a> ';
 
 
 
    public $tpl_page_nums = '<span><a href="{link}">{page}</a></span>';
 
    public $tpl_cur_page_num = '<span>{page}</span>';
 
 
 
    /**
 
     * In the above templates {link} is where the link will be inserted and {page} is
 
     * where the page numbers will be inserted. Other than that, you can modify them
 
     * as you please
 
     *
 
     * NOTE: You should have a separator of some sort at the right of $tpl_first and
 
     * $tpl_prev as above in the defaults, and also have a separator of some sort
 
     * before the $tpl_next and $tpl_last templates
 
     **/
 
 
 
 
 
    ##################################################################################
 
 
 
 
 
    public function __construct($page, $query)
 
    {
 
        #Check page number is a positive integer greater than 0 and assign it to $this->_current_page
 
        if ((int)$page > 0)
 
            $this->_current_page = (int)$page;
 
 
 
        #Remove any LIMIT clauses in the query string and set if
 
        $query = trim(preg_replace('/[\s]+LIMIT[\s]+\d+([\s,]*,[^\d]*\d+)?/i', '', $query));
 
        if (empty($query)) {
 
            return false;
 
        } else {
 
            $this->_query = $query;
 
        }
 
    }
 
 
 
    /**
 
     * pagination::paginate()
 
     *
 
     * Processes all values and query strings and if successful
 
     * returns a string of html text for use with pagination bar
 
     *
 
     * @return string;
 
     */
 
    public function paginate()
 
    {
 
        $output = '';
 
 
 
        #########################################
 
        # GET TOTAL NUMBER OF RESULTS AND PAGES #
 
        #########################################
 
        $result = mysql_query($this->_query);
 
        if (!$result) {
 
            $this->error = __line__ . ' - ' . mysql_error();
 
            return false;
 
        }
 
        $this->total_results = mysql_num_rows($result);
 
        $this->total_pages = ceil($this->total_results / $this->results_per_page);
 
 
 
        ########################
 
        # FREE RESULT RESOURCE #
 
        ########################
 
 
 
        ################################
 
        # IF TOTAL PAGES <= 1 RETURN 1 #
 
        ################################
 
        if ($this->total_pages <= 1)
 
        {
 
            $this->_results_resource = $result;
 
            $this->_output = '1';
 
            return $this->_output;
 
        }
 
 
 
        mysql_free_result($result);
 
 
 
        ###################################################
 
        # CHECK CURRENT PAGE ISN'T GREATER THAN MAX PAGES #
 
        ###################################################
 
        if ($this->_current_page > $this->total_pages)
 
            $this->_current_page = $this->total_pages;
 
 
 
        ######################################
 
        # SET FIRST AND LAST PAGE VALUES AND #
 
        # ERROR CHECK AGAINST INVALID VALUES #
 
        ######################################
 
        $start = ($this->_current_page - $this->_padding > 0) ? $this->_current_page - $this->
 
            _padding : '1';
 
        $finish = ($this->_current_page + $this->_padding <= $this->total_pages) ? $this->
 
            _current_page + $this->_padding : $this->total_pages;
 
 
 
        ###########################################
 
        # CREATE LIMIT CLAUSE AND ASSIGN TO QUERY #
 
        ###########################################
 
        $limit = ' LIMIT ' . ($this->results_per_page * ($this->_current_page - 1)) .
 
            ',' . $this->results_per_page;
 
        $query = $this->_query . $limit;
 
 
 
        #############################################
 
        # RUN QUERY AND ASSIGN TO $_result_resource #
 
        #############################################
 
        $result = mysql_query($query);
 
        if ($result === false) {
 
            $this->error = __line__ . ' - ' . mysql_error();
 
            return false;
 
        }
 
        $this->_results_resource = $result;
 
 
 
        ###########################################
 
        # ADD FIRST TO OUTPUT IF CURRENT PAGE > 1 #
 
        ###########################################
 
        if ($this->_current_page > 1) {
 
            $output .= preg_replace('/\{link\}/i', $this->link_prefix . '1' . $this->
 
                link_suffix, $this->tpl_first);
 
        }
 
 
 
        ##########################################
 
        # ADD PREV TO OUTPUT IF CURRENT PAGE > 1 #
 
        ##########################################
 
        if ($this->_current_page > 1) {
 
            $output .= preg_replace('/\{link\}/i', $this->link_prefix . ($this->
 
                _current_page - 1) . $this->link_suffix, $this->tpl_prev);
 
        }
 
 
 
        ################################################
 
        # GET LIST OF LINKED NUMBERS AND ADD TO OUTPUT #
 
        ################################################
 
        $nums = array();
 
        for ($i = $start; $i <= $finish; $i++) {
 
            if ($i == $this->_current_page) {
 
                $nums[] = preg_replace('/\{page\}/i', $i, $this->tpl_cur_page_num);
 
            } else {
 
                $patterns = array('/\{link\}/i', '/\{page\}/i');
 
                $replaces = array($this->link_prefix . $i . $this->link_suffix, $i);
 
                $nums[] = preg_replace($patterns, $replaces, $this->tpl_page_nums);
 
            }
 
        }
 
        $output .= implode($this->page_nums_separator, $nums);
 
 
 
        ##################################################
 
        # ADD NEXT TO OUTPUT IF CURRENT PAGE < MAX PAGES #
 
        ##################################################
 
        if ($this->_current_page < $this->total_pages) {
 
            $output .= preg_replace('/\{link\}/i', $this->link_prefix . ($this->
 
                _current_page + 1) . $this->link_suffix, $this->tpl_next);
 
        }
 
 
 
        ############################################
 
        # ADD LAST TO OUTPUT IF FINISH < MAX PAGES #
 
        ############################################
 
        if ($this->_current_page < $finish) {
 
            $output .= preg_replace('/\{link\}/i', $this->link_prefix . $this->total_pages, $this->
 
                tpl_last);
 
        }
 
 
 
        $this->_output = $output;
 
        return $output;
 
    }
 
 
 
 
 
    /**
 
     * pagination::padding()
 
     *
 
     * Sets the padding for the pagination string
 
     *
 
     * @param int $val
 
     * @return bool
 
     */
 
    public function padding($val)
 
    {
 
        if ((int)$val < 1)
 
            return false;
 
 
 
        $this->_padding = (int)$val;
 
        return true;
 
    }
 
 
 
 
 
    /**
 
     * pagination::resource()
 
     *
 
     * Returns the resource of the results query
 
     *
 
     * @return resource
 
     */
 
    function resource()
 
    {
 
        return $this->_results_resource;
 
    }
 
 
 
 
 
    /**
 
     * pagination::__tostring()
 
     * returns the last pagination output
 
     *
 
     * @return string
 
     */
 
    function __tostring()
 
    {
 
        if (trim($this->_output)) {
 
            return trim($this->_output);
 
        }else{
 
            return '';
 
        }
 
    }
 
}
 
 |