minenux-skindb-webdb/lib/class.pagination.php

326 lines
7.6 KiB
PHP
Raw Permalink Normal View History

<?php
/*
___ ____
|_ _|___ _ __ / ___|___ _ __ ___
| |/ __| '_ \| | / _ \| '__/ _ \
| |\__ \ |_) | |__| (_) | | | __/
|___|___/ .__/ \____\___/|_| \___|
|_|
Copyright (c) 2014 Díaz Víctor aka (Máster Vitronic)
Copyright (c) 2021 Díaz Víctor aka (Máster Vitronic)
<vitronic2@gmail.com> <mastervitronic@vitronic.com.ve>
*/
class pagination {
/**
* Recurso de la db.
*
* @var resource
* @access private
*/
private $db;
/**
* La pagina
*
* @var integer
* @access private
*/
private $page = 1;
/**
* el numero de registros
*
* @var integer
* @access private
*/
private $records;
/**
* el limite por pagina
*
* @var integer
* @access private
*/
private $limit;
/**
* el template
*
* @var array
* @access private
*/
private $template;
/**
* el numero de paginas
*
* @var integer
* @access private
*/
private $pages;
/**
* el offset
*
* @var integer
* @access private
*/
private $offset;
/**
* el la pagina anterior
*
* @var integer
* @access private
*/
private $prev_page;
/**
* el la pagina siguiente
*
* @var integer
* @access private
*/
private $next_page;
/**
* la cantidad de enlaces a mostrar
*
* @var integer
* @access private
*/
private $show_links;
/**
* El mensaje
*
* @var string
* @access private
*/
private $error;
/**
* Instancia para el patrón de diseño singleton (instancia única)
* @var object instancia
* @access private
*/
private static $instancia = null;
/**
* __construct
*
* Constructor de la clase
*
* @access public
*
*/
private function __construct() {
global $db;
$this->db = $db;
}
/**
* __destruct
*
* Destructor, destruye automaticamente la clase.
*
* @access public
*/
public function __destruct() {
//$this->close();
}
/**
* Inicia la instancia de la clase
* @return object
*/
public static function iniciar() {
if (!self::$instancia instanceof self) {
self::$instancia = new self;
}
return self::$instancia;
}
/**
* Método magico __clone
*/
public function __clone() {
trigger_error('Operación Invalida:' .
' clonación no permitida', E_USER_ERROR);
}
/**
* Método magico __wakeup
*/
public function __wakeup() {
trigger_error('Operación Invalida:' .
' deserializar no esta permitido ' .
get_class($this) . " Class. ", E_USER_ERROR);
}
/* Magic method get
*
* @access public
*/
public function __get($key) {
switch ($key) {
case 'error' : return $this->error;
}
return null;
}
/* Magic method set
*
* @access public
*/
public function __set($key,$value) {
switch ($key) {
//case 'page' : $this->page = $value; break;
//case 'records' : $this->records = $value; break;
//case 'limit' : $this->limit = $value; break;
//default: trigger_error('Unknown variable: '.$key);
}
}
/**
* Setea la pagina actual, si no se le pasan
* parametros sera seteado en la pagina 1
* @author Máster Vitronic
* @param page integer el numero de pagina
* @access public
*/
public function set_page($page) {
$this->page = (isset($page) and intval($page)) ? $page : 1;
}
/**
* Retorna el total de paginas
*
* @author Máster Vitronic
* @return integer el numero de paginas
* @access public
*/
public function get_pages( ){
return ceil($this->records/$this->limit);
}
/**
* Retorna la pagina siguiente
*
* @author Máster Vitronic
* @return integer the next page
* @access public
*/
public function get_netx_page() {
return ($this->records==0)?1:($this->page + 1);
}
/**
* Retorna la pagina anterior
*
* @author Máster Vitronic
* @param integer $timeout el timeout
* @return radius instance of $this (for fluent interfaces)
* @access public
*/
public function get_prev_page(){
return ($this->records==0)?1:($this->page - 1);
}
/**
* Inicializa el paginador
*
* @author Máster Vitronic
* @access public
*/
public function initialized($config) {
if(is_array($config)==false){
return false;
}
$config = (object) $config;
$this->records = $config->records;
$this->limit = $config->limit;
$this->show_links = $config->show_links;
if ( isset($config->template) == false ) {
$this->template = [];
}else{
$this->template = $config->template;
}
$this->offset = ($this->limit*($this->page-1));
$this->pages = $this->get_pages();
$this->next_page= $this->get_netx_page();
$this->prev_page= $this->get_prev_page();
if ( $this->page >= $this->pages ) {
$this->next_page = 1;
}
if ( $this->page == 1 ) {
$this->prev_page = 1;
}
if ( $this->offset > $this->records ) {
$this->offset = $this->records; //--@FIXME, esto esta mal
}
if ( $this->page > $this->pages ) {
$this->page = $this->pages;
}
}
/**
* Retorna los links de paginas
*
* @author Máster Vitronic
* @access public
*/
public function get_links() {
if (isset($this->template['link'])==false) {
return false;
}
if(($this->page-$this->show_links) >= 1) {
$begin = ($this->page-$this->show_links);
$ending= ($this->page+$this->show_links);
}else{
$begin = 1;
$ending= ($this->records==0) ? 1 : ($this->show_links*2);
}
$links = [];
$current = '';
$page = 0;
for ($page=$begin; $page<=$ending; $page++){
if($page == $this->page or $this->page==0){
$current = isset($this->template['current']) ? $this->template['current'] : '';
}
$template = sprintf($this->template['link'],$current,$page,$page,$page);
$current='';
//array_push($links,$template);
$links[] = ['link'=>$template];/*Para Mustache*/
if($page == $this->pages) {
break;
}
}
return $links;
}
/**
* Retorna toda la informacion sobre la paginacion en curso
*
* @author Máster Vitronic
* @access public
*/
public function get_pagination() {
return [
'page' => $this->page,
'pages' => $this->pages,
'prev_page' => $this->prev_page,
'next_page' => $this->next_page,
'links' => $this->get_links(),
'limit' => $this->limit,
'offset' => $this->offset,
'records' => $this->records,
//'begin' => ($this->offset),
//'ending' => ($this->records-$this->offset)
];
}
}