http://martin.com.uy/wp-content/themes/martinuy2/live/proxy.php?url_especifica=
0
14
Apr
2010

Paginación en php: menú de 7 casilleros


Ejemplo de paginación en el módulo Live Notes de http://live.martin.com.uy

Cuando el output de una función php es demasiado grande en cantidad de resultados, lo mejor es paginarlo; esto es dividirlo en páginas de un largo razonable y agregar un menú que permita navegar entre ellas. Lo que hay en el fondo es una consulta SQL a la que ingresan dos variables extra: la cantidad de filas que vamos a obtener (tamaño de cada página) y a partir de cuál (página que queremos mostrar). Por ejemplo:

Supongamos que tenemos una tabla “nombres” con las siguientes filas:

1. juan
2. pedro
3. oscar
4. maria
5. gonzalo
6. martin
7. andrea
8. emiliano
9. alvaro
10. federico
11. nicolas
12. pablo
13. mateo

Decidimos que aparezcan 5 nombres por página. Las consultas SQL serán:

“SELECT nombre FROM usuarios LIMIT 0, 5” (primer página)

1. juan
2. pedro
3. oscar
4. maria
5. gonzalo

“SELECT nombre FROM usuarios LIMIT 5, 5” (segunda página)

6. martin
7. andrea
8. emiliano
9. alvaro
10. federico

“SELECT nombre FROM usuarios LIMIT 10, 5” (tercera página)

11. nicolas
12. pablo
13. mateo

En forma genérica: “SELECT nombre FROM usuarios LIMIT n, x” (n es a partir de qué fila y x la cantidad de filas a obtener).

x lo vamos a decidir nosotros arbitrariamente. n lo va a decidir el visitante de nuestra página según qué haya clickeado en el menú. Podría ser, a priori, algo así: “”SELECT nombre FROM usuarios LIMIT $_GET[‘pagina’], 5”. ATENCIÓN: nunca ingresen una variable del usuario a una consulta SQL sin revisarla antes porque son vulnerables a una inyección, el ejemplo es meramente ilustrativo.

Obviamente, siguiendo esa idea, los links para clickear en cada página se verían de esta forma: “…index.php?pagina=1”, “…index.php?pagina=2” y “…index.php?pagina=3”.

Como imaginarán, es poco práctico editar el menú y sus links para cada página que se genere. Lo que necesitamos es un menú automático. Ingresamos nombres en nuestra tabla y se va armando solo: agregando páginas, eliminando, mostrando las páginas cercanas a la que el usuario está actualmente, ocultando otras (no podemos mostrar 44 links por ejemplo), etc.

Hay distintos estilos, para cada gusto y para cada necesidad. Uno de los que más me gustan -muy versátil además- es el de 7 casilleros. Sería en su forma genérica así:

Estamos en la página 7. Vemos la anterior, la siguiente, la primera y la última de todas. Cuando llegamos a los extremos (páginas iniciales o finales), los “…” se sustituyen por los valores y se muestra la mayor cantidad de páginas posibles. La cantidad de casilleros es fija.

Algo que parece tan simple, tiene cierta lógica y por eso quiero compartir con ustedes mi código:

Descargar

Está permitida la libre modificación, copia, distribución, etc. manteniendo los créditos originales.

La parte de MySQL queda para ustedes pero dejo un tip sobre una llamada posible:

$sql_total = mysql_query(“SELECT COUNT(id) FROM nombres”);
$total = mysql_result($sql_total, 0);
$casilleros_array = get_casilleros($total, 5, $_GET[‘pagina’]);

Nota: no copien y peguen el texto porque WordPress transforma las comillas en caracteres extraños.

Escucho comentarios, sugerencias, pedidos de ayuda, etc. ¡Larga vida al open source! 🙂

16
Apr
2010
Mariano

¡¡Bo, veo que le metiste duro y parejo al menú!!

Bien! Así te quiero ver en Haskell, que tanto PHP!! 😛

Nos vemos mañana, hoy fundido!

15
Nov
2011
aaa

animal cuando postees algo almenos haslo bien no veo la base de datos con la q trabajaste asi muchos de los usuarios que no saben nada y quieren aprender estaran perdidos

Escribir un comentario