Inicio > CodeIgniter, Gestor de noticias > Gestor de noticias (Quinta parte): Paginación

Gestor de noticias (Quinta parte): Paginación

Miércoles, 28 de Mayo de 2008

Bueno hoy dedicaré esté post a la paginación en CodeIgniter, ya que es un tema que para una cosa o para otra siempre acaba saliendo y acabamos con un quebradero de cabeza monumental cuando intentamos crear una buena paginación.

Cómo toda aplicación web típica, CodeIgniter nos plantea una solución, así que siempre haced uso de su guía y buscad lo que os haga falta, que os aseguro que la mayor parte del tiempo lo encontraréis. En este caso haremos uso de la “Pagination Class“.

[DEMO] Podéis ver aquí cómo quedará todo después de lo que os explicaré a continuación.

Ojo: si veis que no hay ninguna noticia puesta, probad de añadirlas con el link que hay ya que en un post anterior puse el scaffolding para testear y es posible que alguien lo haya borrado para probarlo.

Para usar la paginación en nuestra web necesitaremos proceder en 3 pasos:

  1. En el controlador: cargar la librería con la configuración que deseemos.
  2. Modificar la consulta de la base de datos para que nos muestre sólo una parte en vez de todos los resultados.
  3. Añadir los enlaces (los números) para que el usuario pueda navegar a través de las páginas generadas.

Paso 1 – Cargar la librería

Primero os mostraré cómo queda el código y luego os iré comentando que es cada cosa:

	function index()
	{
		$this->load->view('cabecera');		

		$this->load->library('pagination');

		$config['base_url'] = base_url()."index.php/noticias/index/";
		$config['total_rows'] = $this->db->count_all_results('noticias');
		$config['per_page'] = '5';	

		$this->pagination->initialize($config); 		

		$variables['query'] = $this->db->get('noticias', $config['per_page'], (int)$this->uri->segment(3));
		$this->load->view('noticias/index', $variables);

		$this->load->view('pie');
	}

En la linea 5 cargamos la libreria, en este caso “pagination”.

En la linea 7 especificamos la URL dónde esta nuestro módulo. Esto sirve para decirle a CodeIgniter cómo queremos que genere los links a los numeros de las páginas asi como en el “anterior” y “siguiente”.

En la linea 8 y 9 pondremos los resultados totales y cuantos elementos queremos por página respectivamente. Con esto le permitimos que haga el calculo y nos genere el numero de páginas que hagan falta.

En la linea 11 le pasamos toda la configuración especificada anteriormente para que se cargue correctamente.

Paso 2 – Modificar la consulta

En la linea 13 podemos ver que hemos añadido a lo que ya teniamos un segundo y tercer argumento. Tal y como nos explican en la guía en la sección “Active Record Class“, són los valores del LIMIT en la sentencia SQL.

Es decir el segundo valor nos dice “cuantos resultados queremos mostrar”, pues y que eso ya lo especificamos en la configuración del paso 1, usaremos la misma variable para indicarlo aqui.

En el tercer parametro, especificamos a partir de que resultado queremos mostrar, es decir un “offset”, aqui podremos 0 para la primera página, 5 para la segunda, 10 para la tercera y asi sucesivamente. Bien pues este contador ya nos lo genera automaticamente CodeIgniter en los links que generará en nuestra vista (lo veremos a continuación), por lo que es tan fácil cómo pasar directamente ese valor

Nota: el (int) que hay antes de la variable, sirve para “parsear” el valor que se aun entero, es decir obligar que lo sea, de tal manera que “cualquier cosa que no sea un numero” valdrá cero y cualquier numero entero será este mismo valor. Con esto evitamos por un lado un posible SQL Injection y por otro que cuando no le pasemos nada automáticamente valga 0.

Paso 3 – Los enlaces

< ?=$this->pagination->create_links()?>

Tan fácil como poner esto y nos creara todos los links con números y flechas que hagan falta. Esto lo pondremos por supuesto en nuestra vista (o view), después del bucle que generan nuestras noticias.


Para hoy esto es todo, cómo siempre os podéis bajar el código del link que tenéis en la misma página que la demo.

Lagarto CodeIgniter, Gestor de noticias , , , , ,

  1. Lunes, 2 de Junio de 2008 a las 05:46 | #1

    Muy bueno, yo solo buscaba material en ingles pues no encontraba mucho acerca de codeigniter en castellano, muy buen aporte.

  2. Martes, 3 de Junio de 2008 a las 04:01 | #2

    Buen aporte y super interesante… mirare mas por aquí ya que me interesa muchísimo este framework…
    Otra cosa, sería buena idea q los resultados se mostraron en orden descendente en vez de ascendente…

    Saludos!

  3. Martes, 3 de Junio de 2008 a las 08:35 | #3

    Pues seria tan fácil como poner antes de la linea 13 (del $this->db->get…) algo así como:

    $this->db->order_by(‘id’, ‘desc’);

  4. Jueves, 19 de Junio de 2008 a las 06:28 | #4

    Una segunda cuestión. Utilizando el MVC de CI no es necesario que todas las acciones de la DB (CRUD) sean realizadas por un modelo en todo caso?

    Es algo que no comprendo muy bien, luego de haber ido tocando bastante con el CI realmente es muy alentador lo facil y rapido que se hacen las cosas en comparación con escribir PHP a pulmón.

    Saludos y muchas gracias por estos artículos.
    Demóstenes G.

  5. Jueves, 19 de Junio de 2008 a las 09:39 | #5

    No es necesario, o sea si te parece mas cómodo puedes hacerlo desde el controlador.

  6. Viernes, 20 de Junio de 2008 a las 02:14 | #6

    Muchas gracias por tu respuesta y disculpa por estar molestando por estos lugares…. pero por decirlo asi, este es uno de los unicos lugares que conozco para hacer mis preguntas (aunq muchas parezcan tontas).

    La pregunta te la hacia puesto que entendia que el modelo era la estructura de datos, osea que dentro de un modelo MVC utilizabamos el modelo para realizar todas las consultas a la DB, pero ahora entiendo que no es completamente necesario realizarlo de esta manera.

    Saludos y muchas gracias! :)

  7. keoshi
    Lunes, 12 de Enero de 2009 a las 19:27 | #7

    bueno, clase para paginación…
    me gusta más esta
    http://www.mis-algoritmos.com/2007/05/27/digg-style-pagination-class/

  8. Viernes, 28 de Agosto de 2009 a las 06:49 | #8

    Hola,
    con la paginacion me estoy sacando una cana. En resumen, quiero listar mis usuarios del sistema, con la paginacion del CI. Ahora, cuando ya le paso los parametros de configuracion e imprimo los links de paginacion al momento de hacer click en el enlace, me sale un 404 donde dice q no existe la pagina. Entonces, no se si pueda ser apartir del .htaccess o de algo que este omitiendo. Lo que se es que los links me los esta mostrando de la siguiente forma: http://www.connexion21.com/citrinet/admin/usuarios.ctx&offset=3 (Observen el “&” despues del sufijo “.ctx”, deberia ser un “?” ). Mi codigo del index es:
    ——————–
    $num = (int) $this->uri->segment(1);
    $config['base_url'] = site_url(“admin/usuarios”);
    $config['per_page'] = 3;
    /*Aqui va el query, igual el numero de registros se trae de la tabla*/
    $config['total_rows'] = (int)$this->db->count_all(“usuarios”);

    y el .htaccess es:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]

    mi correo es: rios.nicolas@gmail.com

    Espero sus comentarios, es muy importante tener esto ok. Gracias

  1. Sin trackbacks aún.