Foros del Web » Programando para Internet » PHP »

Clase para paginar.

Estas en el tema de Clase para paginar. en el foro de PHP en Foros del Web. Hola a todos. Sé que este tema ya se ha comentado en más de una ocasión y que se han propuesto varios códigos. Yo tenía ...
  #1 (permalink)  
Antiguo 23/08/2003, 05:02
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 22 años, 4 meses
Puntos: 0
Clase para paginar.

Hola a todos.

Sé que este tema ya se ha comentado en más de una ocasión y que se han propuesto varios códigos. Yo tenía uno y lo he reescrito recientemente, pero no he tenido tiempo de probarlo todavía (es posible que tenga algún fallo). Por si a alguien le sirve o si lo quiere mejorar/modificar, aquí lo pongo:

Código PHP:
<?php
//////// class_pages.php ////////
// Class for handling page sets

// Author: Ricardo Cervera Navarro (lical)
// <[email protected]>
// Created: 28.08.02, Rewritten: 22.08.03

// This code is (C) Ricardo Cervera
// This code is under the terms of the
// GNU General Public License in its last version.

// Thanks:
// -> Ferdy, helped me starting in OOP
// -> Moi, advice with last_page() function

class pages {

    
// Stores the number of the actual page
    
var $current_page;

    
// Stores how many items are displayed in each page
    
var $items_each_page;

    
// Stores the number of the previous page
    // If there's no prev. page, it will contain (bool) false
    
var $previous_page;

    
// Stores the number of the next page
    // If there's no prev. page, it will contain (bool) false
    
var $next_page;

    
// Number of total items to be handled
    
var $num_total_items;

    
// This array contents the first matching item and the last
    // for the current page, normally, starting counting at 1
    // $limit[0] is the first item and $limit[1] is the last item
    
var $limit = array();

    
// This array's content is explained in compute_limits() function
    // $limit[0] is the first item and $limit[1] is the last item
    
var $lmysql = array();

    
// Stores the number of the last page available
    
var $last_page;

    
// Class constructor, the arguments are: current page number,
    // number of items displayed in each page, and
    // number of total results to be handled (starting counting at 1)
    
function pages($actual_page$items_each_page$num_total_items)
    {
        
$this->actual_page = (int) $actual_page;
        
$this->items_each_page $items_each_page;
        
$this->num_total_items $num_total_items;
        
$this->previous_page $this->exists_page($this->actual_page-1);
        
$this->next_page $this->exists_page($this->actual_page+1);
        
$this->last_page $this->last_page();
        
        if ( 
exists_page($actual_page) == false ) {
            return 
false;
        }
        
        
$this->limit compute_limits();
        
$this->lmysql compute_limits("mysql");
    }

    
// This function computes the last page available
    // (according to the number of total items to handle)
    
function last_page()
    {
        
$last_page $this->num_total_items $this->items_each_page;
        
$last_page ceil($last_page);
        
        if ( 
$this->num_total_items == ) {
            return 
1;
        } else {
            return 
$last_page;
        }
    }

    
// This function gets the number of the first item and the last item
    // for the current page.
    //
    // It takes "mysql" as argument if you want to count
    // for MySQL LIMIT function (this means the first item for this
    // page starting counting them at 0 and last item is
    // [items a page]), otherwise (for normal count
    // and starting counting at 1) it takes no argument
    
function compute_limits($starting_value="normal")
    {
        switch(
$starting_value) {
        
        case 
"mysql":
            
$limit[0] = $this->items_each_page $this->actual_page
                        
$this->items_each_page;
            
$limit[1] = $this->items_each_page;
            
            return 
$limit;
            
            break;
        case 
"normal":
            
$limit[0] = $this->items_each_page $this->actual_page
                        
$this->items_each_page 1;
            if ( 
$this->next_page == false ) {
                  
$limit[1] = $this->num_total_items;
            } else {
                  
$limit[1] = $limit[0] + $this->items_each_page 1;
            }
            
            return 
$limit;
            
            break;
        default:
            return 
false;
            break;
        }
    }
        
    
// This function checks whether a page exists or not
    
function exists_page($page_number)
    {
        
$page_number = (int) $page_number;
        if ( 
$page_number >= &&
             
$page_number <= $this->last_page ) {
            return 
$page_number;
        } else {
            return 
false;
        }
    }
}
?>
Lo siento por lo del inglés, pero es una costumbre que tengo cuando escribo code.


Un saludo,
__________________
lical-> Usuario registrado de Linux #254225

ZonaSiete.ORG - GNU/Linux eminentemente práctico

Última edición por lical; 23/08/2003 a las 05:17
  #2 (permalink)  
Antiguo 23/08/2003, 07:40
Avatar de Pino  
Fecha de Ingreso: abril-2003
Ubicación: Cangas do Morrazo, Pontevedra, Galicia, España, Europa, etc
Mensajes: 490
Antigüedad: 21 años
Puntos: 0
Hola, ¿por que no lo pones en las faq's?

Un saludo
__________________
Pïno
Webmaster de Programas Lynx
Usuario Registrado de Linux #327681

Mi cuerpo en windows, pero mi mente pensando en linux.
  #3 (permalink)  
Antiguo 23/08/2003, 11:05
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 22 años, 4 meses
Puntos: 0
Porque no la he probado todavía :D

Primero esperaba algún comentario o contribución.


Un saludo,
__________________
lical-> Usuario registrado de Linux #254225

ZonaSiete.ORG - GNU/Linux eminentemente práctico
  #4 (permalink)  
Antiguo 23/08/2003, 20:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm lical .. pues ademas de que está en ingles (ok .. sobre gustos no hay nada escrito) .. deberías hacer un ejemplo "básico" al menos, así veras que más gente se anima a probarla. No todo el mundo sabe ni tan siquiera usar classes (objetos).

Y .. ya puestos podrías hacer una versión en castellano (aunque sea los comentarios de los métodos al menos).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 24/08/2003, 06:35
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 22 años, 4 meses
Puntos: 0
Gracias cluster por tu comentario

Bueno, pues vamos a poner un ejemplo, y explico más o menos los métodos:

Código:
<?php
// Incluimos el fichero de la clase
// donde hemos copiado el código de arriba:
require("/fichero/de/la/clase.php");

// Tomamos la página actual de resultados:
$page = $_GET['page']; // por ejemplo

// Creamos una instancia de la clase,
// no hace falta entender qué es eso
// exactamente para usar la clase, veamos:
$pages = new pages($page, 10, $num_items);

// El primer argumento es la página actual
// de resultados, el segundo son los resultados
// que queremos en cada página, y el tercero
// es el número total de items a paginar
// que lo podríamos conseguir con un
// SELECT COUNT(*) de MySQL por ejemplo.
?>
Entonces dispondríamos de la siguiente información:

$pages->actual_page - Tendría el valor de la página actual.
$pages->items_each_page - Tendría el valor del número de items a mostrar en cada página
$pages->num_total_items - Tendría el valor del número total de items a paginar
$pages->previous_page - Tendría el valor de la página anterior a la actual o bien FALSE si esta no existe
$pages->next_page - Igual que la anterior pero con la página siguiente.
$pages->last_page - Tendría el número de la última página disponible
$pages->limit[0] - Contendría el valor del primer item a mostrar en la página actual (comenzando a contar en 1).
$pages->limit[1] - Contendría el valor del último item a mostrar en la página acutal (comenzando a contar en 1).
$pages->lmysql[0] - Contendría el valor del primer item a mostar en la página actual (comenzando a contar en 0).
$pages->lmysql[1] - Para una consulta de mysql, para los items de la página actual, el array lmysql es para pasárselo a la función LIMIT; por ejemplo:
Código PHP:
$query "...(mi consulta) LIMIT ".$pages->lmysql[0].",".$pages->lmysql[1].""
Los métodos no hace falta conocerlos una vez que ya he descrito las variables porque todos son llamados al iniciar una instancia de la clase.

Pasando los números de página por GET en los enlaces y con unos bucles (p.e. desde la página 1 hasta la página inicial; desde la página inicial hasta la última página) para crear los enlaces a las páginas, se pueden paginar resultados fácilmente.

Si algo no he dejado claro y a alguien le interesa, primero que me disculpe y segundo que pregunte :)

Por cierto, es posible que tenga algún fallo porque yo no la he probado todavía.

Un saludo,
__________________
lical-> Usuario registrado de Linux #254225

ZonaSiete.ORG - GNU/Linux eminentemente práctico

Última edición por lical; 24/08/2003 a las 06:38
  #6 (permalink)  
Antiguo 24/08/2003, 17:37
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 22 años, 4 meses
Puntos: 0
Esta respuesta refleja lo poco que tú has aprendido leyendo código ajeno. Ale, sigue así machote, que llegarás lejos.

La única razón por la que esto está aquí es POR SI A ALGUIEN LE SIRVE. Si no te sirve y no te interesa, simplemente pasas del post.

Por cierto, la clase original sí la he probado, la he reescrito y este es el resultado. Claro, que a tí te gustarán más esos otros posts en los que se pregunta lo mismo cada 2 días. Vengo con algo nuevo, para ver si entre todos conseguimos algo mejor y así se me contesta. Tranquilo, señor biblio, que la próxima vez me quedaré el código para mí y te dejaré que leas 300 veces la misma pregunta.


No lo considero un código excelente (ni muchííísimo menos), pero sí te puedo decir que SIEMPRE he aprendido algo de ver código ajeno.


Y no, yo no quiero ponerme de mal rollo con nadie, pero es que tu respuesta no me parece nada coherente.


Un saludo,
__________________
lical-> Usuario registrado de Linux #254225

ZonaSiete.ORG - GNU/Linux eminentemente práctico
  #7 (permalink)  
Antiguo 25/08/2003, 00:04
Avatar de biblio  
Fecha de Ingreso: enero-2002
Ubicación: Urano
Mensajes: 577
Antigüedad: 22 años, 3 meses
Puntos: 0
Cita:
Esta respuesta refleja lo poco que tú has aprendido leyendo código ajeno.
Digo lo mismo yo.

Última edición por biblio; 25/08/2003 a las 00:11
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:52.