<?php if (!defined('entry') || !entry) { die('Not a valid page'); } class pagination { /* Script Name: *Digg Style Paginator Class Script URI: http://www.mis-algoritmos.com/2007/05/27/digg-style-pagination-class/ Description: Class in PHP that allows to use a pagination like a digg or sabrosus style. Script Version: 0.3 Author: Victor De la Rocha Author URI: http://www.mis-algoritmos.com */ /*Default values*/ public $total_pages = null; public $limit = null; public $target = ""; public $page = 1; public $adjacents = 2; public $showCounter = false; public $className = "pagination"; public $parameterName = "page"; public $urlF = false;//urlFriendly /*Buttons next and previous*/ public $nextT = "Next"; public $nextI = "»"; //► public $prevT = "Previous"; public $prevI = "«"; //◄ /*****/ public $calculate = false; #Total items public function items($value) { $this->total_pages = intval($value); } #how many items to show per page public function limit($value) { $this->limit = intval($value); } #Page to sent the page value public function target($value) { $this->target = $value; } #Current page public function currentPage($value) { $this->page = intval($value); } #How many adjacent pages should be shown on each side of the current page? public function adjacents($value) { $this->adjacents = intval($value); } #show counter? public function showCounter($value="") { $this->showCounter=($value===true)?true:false; } #to change the class name of the pagination div public function changeClass($value="") { $this->className=$value; } public function nextLabel($value) { $this->nextT = $value; } public function nextIcon($value) { $this->nextI = $value; } public function prevLabel($value) { $this->prevT = $value; } public function prevIcon($value) { $this->prevI = $value; } #to change the class name of the pagination div public function parameterName($value="") { $this->parameterName=$value; } #to change urlFriendly public function urlFriendly($value="%") { if (eregi('^ *$', $value)) { $this->urlF=false; return false; } $this->urlF=$value; } public $pagination; public function __construct() { } public function show() { if (!$this->calculate) { if ($this->calculate()) { echo "<div class=\"$this->className\">$this->pagination</div>"; } } } public function getPagination() { if (!$this->calculate) { if ($this->calculate()) { return "<div class=\"$this->className\">$this->pagination</div>"; } } } public function get_pagenum_link($id) { //if(strpos($this->target,'?')===false) if ($this->urlF) { return str_replace($this->urlF, $id, $this->target); } else { return "$this->target?$this->parameterName=$id"; } //else //return "$this->target&$this->parameterName=$id"; } public function calculate() { $this->pagination = ""; $this->calculate == true; $error = false; if ($this->urlF and $this->urlF != '%' and strpos($this->target, $this->urlF)===false) { //Es necesario especificar el comodin para sustituir echo "Especificaste un wildcard para sustituir, pero no existe en el target<br />"; $error = true; } elseif ($this->urlF and $this->urlF == '%' and strpos($this->target, $this->urlF)===false) { echo "Es necesario especificar en el target el comodin % para sustituir el n�mero de p�gina<br />"; $error = true; } if ($this->total_pages == null) { echo "It is necessary to specify the <strong>number of pages</strong> (\$class->items(1000))<br />"; $error = true; } if ($this->limit == null) { echo "It is necessary to specify the <strong>limit of items</strong> to show per page (\$class->limit(10))<br />"; $error = true; } if ($error) { return false; } $n = trim($this->nextT.' '.$this->nextI); $p = trim($this->prevI.' '.$this->prevT); /* Setup vars for query. */ if ($this->page) { $start = ($this->page - 1) * $this->limit; } //first item to display on this page else { $start = 0; } //if no page var is given, set start to 0 /* Setup page vars for display. */ if ($this->page == 0) { $this->page = 1; } //if no page var is given, default to 1. $prev = $this->page - 1; //previous page is page - 1 $next = $this->page + 1; //next page is page + 1 $lastpage = ceil($this->total_pages/$this->limit); //lastpage is = total pages / items per page, rounded up. $lpm1 = $lastpage - 1; //last page minus 1 /* Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once. */ if ($lastpage > 1) { //anterior button if ($this->page > 1) { $this->pagination .= "<a href=\"".$this->get_pagenum_link($prev)."\">$p</a>"; } else { $this->pagination .= "<span class=\"disabled\">$p</span>"; } //pages if ($lastpage < 7 + ($this->adjacents * 2)) {//not enough pages to bother breaking it up for ($counter = 1; $counter <= $lastpage; $counter++) { if ($counter == $this->page) { $this->pagination .= "<span class=\"current\">$counter</span>"; } else { $this->pagination .= "<a href=\"".$this->get_pagenum_link($counter)."\">$counter</a>"; } } } elseif ($lastpage > 5 + ($this->adjacents * 2)) {//enough pages to hide some //close to beginning; only hide later pages if ($this->page < 1 + ($this->adjacents * 2)) { for ($counter = 1; $counter < 4 + ($this->adjacents * 2); $counter++) { if ($counter == $this->page) { $this->pagination .= "<span class=\"current\">$counter</span>"; } else { $this->pagination .= "<a href=\"".$this->get_pagenum_link($counter)."\">$counter</a>"; } } $this->pagination .= "..."; $this->pagination .= "<a href=\"".$this->get_pagenum_link($lpm1)."\">$lpm1</a>"; $this->pagination .= "<a href=\"".$this->get_pagenum_link($lastpage)."\">$lastpage</a>"; } //in middle; hide some front and some back elseif ($lastpage - ($this->adjacents * 2) > $this->page && $this->page > ($this->adjacents * 2)) { $this->pagination .= "<a href=\"".$this->get_pagenum_link(1)."\">1</a>"; $this->pagination .= "<a href=\"".$this->get_pagenum_link(2)."\">2</a>"; $this->pagination .= "..."; for ($counter = $this->page - $this->adjacents; $counter <= $this->page + $this->adjacents; $counter++) { if ($counter == $this->page) { $this->pagination .= "<span class=\"current\">$counter</span>"; } else { $this->pagination .= "<a href=\"".$this->get_pagenum_link($counter)."\">$counter</a>"; } } $this->pagination .= "..."; $this->pagination .= "<a href=\"".$this->get_pagenum_link($lpm1)."\">$lpm1</a>"; $this->pagination .= "<a href=\"".$this->get_pagenum_link($lastpage)."\">$lastpage</a>"; } //close to end; only hide early pages else { $this->pagination .= "<a href=\"".$this->get_pagenum_link(1)."\">1</a>"; $this->pagination .= "<a href=\"".$this->get_pagenum_link(2)."\">2</a>"; $this->pagination .= "..."; for ($counter = $lastpage - (2 + ($this->adjacents * 2)); $counter <= $lastpage; $counter++) { if ($counter == $this->page) { $this->pagination .= "<span class=\"current\">$counter</span>"; } else { $this->pagination .= "<a href=\"".$this->get_pagenum_link($counter)."\">$counter</a>"; } } } } //siguiente button if ($this->page < $counter - 1) { $this->pagination .= "<a href=\"".$this->get_pagenum_link($next)."\">$n</a>"; } else { $this->pagination .= "<span class=\"disabled\">$n</span>"; } if ($this->showCounter) { $this->pagination .= "<div class=\"pagination_data\">($this->total_pages Pages)</div>"; } } return true; } }