<?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 '';
}
}
}
|