Muy buenas! Esta será la primera contribución que haga en la comunidad.
Voy a explicar paso a paso como crear un sistema paginador para organizar el contenido de, por ejemplo, un sistema de noticias.
- El objetivo es crear un sistema para organizar los artículos de una determinada sección de una página, de tal manera que se publiquen un determinado número de artículos por página así como un determinado número de páginas en las que se mostrarán los correspondientes artículos.
- Características y reglas que cumplirá nuestro paginador:
1º.- Se creará un enlace que diga “Página anterior”, el cual nos conducirá a la página siguiente de la que nos encontramos, antes de los links de cada página concreta, así como otro enlace , con el texto “Página siguiente” después de dichos links, el cual nos conducirá a la página siguiente de la que nos encontramos.
2º.- Lo ya mencionado de “Página anterior” sólo aparecerá si la página en la que nos encontramos no es la primera página. Por su parte, lo de “Página siguiente” aparecerá en todas las páginas excepto en la última, como es lógico.
3º.- El número de la página en la que que nos encontremos en un momento determinado no tendrá link, es decir, que si nos encontramos en la página 3, por ejemplo, ese tres del paginador no tendrá link.
PROCEDIMIENTO:
Vamos a empezar a construir el paginador. En primer lugar, incluimos el archivo de conexión a la base de datos, así como las líneas necesarias de conexión a mysql y a la misma base de datos (en caso de que estas no hayan sido, como en mi ejemplo, definidas en el archivo de conexión).
A continuación vamos a definir una función que imprimirá el paginador en pantalla, una vez convocada.
Expongo el código y seguidamente lo explico:
Nombre del archivo: noticias.php
<?php
//paginador creado por Znet
//antes de nada conectamos con la base de datos
include('connection.php');
function paginador($art_pagina){
$num_articulos=mysql_num_rows(mysql_query("SELECT * FROM `articulos`"));
// numero_de_paginas = numero_de_articulos_disponibles / articulos_por_pagina, tabién usaremos "%" para contar el resto
$num_paginas = $num_articulos / $art_pagina;
if($num_articulos % $art_pagina != 0){
$num_paginas = $num_paginas + 1;
}
//hacemos que aparezca [Página anterior] si no estamos en la primera pagina
if($_GET['pagina'] >= 2){
$pag_anterior = $_GET['pagina']-1;
echo "<a href='noticias.php?pagina=$pag_anterior'>";
echo " [Página anterior] ";
echo "</a>";
}
for($i=1;$i<=$num_paginas;$i++){
//el link de cada página aparecerá sólo si NO nos encontramos en la misma
if($_GET['pagina'] != $i){
echo "<a href='noticias.php?pagina=$i'>";
}
echo "$i ";
if($_GET['pagina'] != $i){
echo "</a>";
}
}
// hacemos que aparezca [Página siguiente] si no estamos en la última página
if($_GET['pagina'] < ($num_paginas-1)){
$pag_siguiente = $_GET['pagina']+1;
echo "<a href='noticias.php?pagina=$pag_siguiente'>";
echo " [Página siguiente] ";
echo "</a>";
}
//cerramos la función paginador
}
//ahora vamos a realizar la consulta a la base de datos para que nos muestre las noticias (5 noticias por página máximo), para ello usamos la sentencia LIMIT
$art_pagina = 3;
$limit = ($_GET['pagina']-1)*$art_pagina;
$resultados = mysql_query("SELECT * FROM `articulos` ORDER BY `fecha` DESC LIMIT $limit,$art_pagina");
//ahora simplemente mostramos las noticias con un bucle
while($mostrar_noticia = mysql_fetch_array($resultados)){
echo $mostrar_noticia['titulo'];
echo "<br/>";
echo $mostrar_noticia['contenido'];
echo "<br/>";
}
paginador($art_pagina);
?>
Voy a describir las variables usadas:
$art_pagina -> La uso como parámetro de la función, esta será la que indica a la función el número de artículos/noticias que queremos por página.
$num_articulos -> Esta variable almacenará el número de artículos que disponemos en nuestra base de datos. Para ello, se emplea la función mysql_num_rows(), tal y se aprecia en el ejemplo.
$num_paginas -> En ella se almacenan el número de páginas que necesitamos para organizar un determinado número de noticias.
$pag_anterior -> Almacenará el valor de la página anterior a la que nos encontremos.
$pag_siguiente -> Almacenará el valor de la página siguiente a la que nos encontremos.
$limit -> Esta variable almacenará el primer número que emplearemos en la sentencia LIMIT, para mostrar el rango de noticias desedas.
$resultados -> Aquí se almacenará el resultado de la query a la base de datos, para luego poder imprimir la noticia en pantalla.
$mostrar_noticia -> Será una matriz en la que almacenaremos los valores buscados a través de la consulta sql.
EXPLICACIÓN DEL CÓDIGO:
En primero lugar obtenemos el número de páginas dividiendo el número de artículos entre el número de artículos que queremos por página:
$num_paginas = $num_articulos / $art_pagina;
Una vez hecho eso, le sumamos el resto de dicha división sólo si este es distinto de cero:
if($num_articulos % $art_pagina != 0){
$num_paginas = $num_paginas + 1;
}
¿Para que se hace esto? Muy sencillo! Imaginemos que tenemos 21 noticias en la base de datos y queremos mostrar 5 por página. Necesitaríamos, pues, 5 páginas (en las 4 primeras habría 5 noticias por página y en la última página, la noticia restante, haciendo el total de 21 noticias).
PROSIGAMOS. Ahora hacemos que aparezca lo de “Página anterior” pero ¡OJO!, sólo cuando estemos en una página que no sea la primera, por razones obvias . Para ello obtenemos con $_GET el número de página de la barra de navegación y comprobamos que sea mayor o igual que 2 (o lo que a efectos prácticos es lo mismo, que sea distinto de 1)
//hacemos que aparezca [Página anterior] si no estamos en la primera pagina
if($_GET['pagina'] >= 2){
$pag_anterior = $_GET['pagina']-1;
echo "<a href='noticias.php?pagina=$pag_anterior'>";
echo " [Página anterior] ";
echo "</a>";
}
A CONTINUACIÓN, mostramos cada uno de los números de las páginas en las que se mostrarán las noticias. Para ello emplearemos un bucle (yo he usado for). Por supuesto, debemos añadirle a cada uno de dichos números su respectivo link a la página que representan.
for($i=1;$i<=$num_paginas;$i++){
//el link de cada página aparecerá sólo si NO nos encontramos en la misma
if($_GET['pagina'] != $i){
echo "<a href='noticias.php?pagina=$i'>";
}
echo "$i ";
if($_GET['pagina'] != $i){
echo "</a>";
}
}
SEGUIDAMENTE, al igual que hicimos con lo de “Página anterior”, ahora hacemos lo mismo pero con “Página siguiente”. Obtenemos con $_GET el número de página de la barra de navegación y comprobamos que sea distinta de $num_paginas -1(muy importante ese último – 1 para que funcione correctamente) SI NO LO PONEMOS EL TEXTO “PÁGINA SIGUIENTE” APARECERÁ CON UNA PÁGINA DE RETRASEO Y ESTARÁ MAL.
// hacemos que aparezca [Página siguiente] si no estamos en la última página
if($_GET['pagina'] < ($num_paginas-1)){
$pag_siguiente = $_GET['pagina']+1;
echo "<a href='noticias.php?pagina=$pag_siguiente'>";
echo " [Página siguiente] ";
echo "</a>";
}
Bien, ahora cerramos la función paginador con la llave de cierre “}” y seguimos.
AHORA SÍ, damos valor a la variable que actúa como parámetro de la función paginador y que vamos a usar para más cosas a continuación, la variable $art_pagina.
En el ejemplo le di el valor 3 para no complicarme mucho la vida a la hora de probar el paginador (por no tener que escribir muchas noticias de ejemplo). Puedes darle el valor que quieras, el funcionamiento será correcto igualmente.
$art_pagina = 3;
CREAMOS la variable $limit, que contendrá el primero número de la sentencia LIMIT que emplearemos a continuación en la consulta a la base de datos.
$limit = ($_GET['pagina']-1)*$art_pagina;
AHORA realizamos la consulta a la base de datos y la almacenamos en la variable $resultados, de la cual luego extraeremos e imprimiremos las partes de la noticia en pantalla. Como podréis comprobar en el código, ordeno INVERSAMENTE (mediante
DESC) las noticias por fecha, de tal manera que se muestren primero las más nuevas.
$resultados = mysql_query("SELECT * FROM `articulos` ORDER BY `fecha` DESC LIMIT $limit,$art_pagina");
YA CASI HEMOS ACABADO. Nos faltaría mostrar las noticias en pantalla, para hacerlo usamos el bucle while junto a la función mysql_fetch_array() con la cual almacenaremos los valores reclamados en la consulta anterior en una matriz ($mostrar_noticia) de tipo array. Mostramos, pues, los resultados en pantalla, como en el ejemplo:
while($mostrar_noticia = mysql_fetch_array($resultados)){
echo $mostrar_noticia['titulo'];
echo "<br/>";
echo $mostrar_noticia['contenido'];
echo "<br/>";
}
PARA FINALIZAR hacemos un llamamiento a la función paginador, y le introducimos como parámetro la variable $art_pagina, que, recordemos, contiene el número de artículos que queremos publicar por página.
paginador($art_pagina);
Bueno, espero que les pueda ser útil, lo hice ayer antes de acostarme para un proyecto que estoy haciendo y se me ocurrió que le podría ser útil a alguien.
SALUDOS!