miércoles, 4 de junio de 2014
Paginación Codeigniter
Cómo funciona la paginación
La paginación se utiliza cuando se tiene un resultado extenso producto de una consulta de una base de datos. Si el resultado fuera pequeño, bien podría entrar en una única página y no haría falta dividir los registros.
El funcionamiento básico se podría resumir de la siguiente manera. Cada vez que se carga la página, se realiza una consulta a la base de datos con parámetros para acotarla. Por ejemplo, si se pide la primera página, suponiendo que cada una muestra 20 resultados, se realizará una consulta a la base de datos que devolverá del primer al vigésimo resultado. Luego, la página 2, mostrará del vigésimo primero al cuadragésimo, y así sucesivamente.
En CodeIgniter, el código puede separarse de manera adecuada entre modelo, vista ycontrolador. El modelo realizará la consulta a la base de datos y devolverá los resultados, elcontrolador manejará la clase de paginación que facilitará todo el trabajo y la vista se encargará tanto de presentar los resultados como de mostrar los enlaces a cada una de las páginas.
Controlador: Manejo de la librería de paginación
Veamos el código del controlador. Tenemos una aplicación ficticia que tiene una tabla con frases célebres que queremos mostrar por pantalla.
function index() { $this->load->library('pagination'); $opciones = array(); $desde = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; $opciones['per_page'] = 15; $opciones['base_url'] = base_url().'index.php/frase/index'; $opciones['total_rows'] = $this->Frase_model->getNumFrases(); $opciones['uri_segment'] = 3; $this->pagination->initialize($opciones); $data['lista'] = $this->Frase_model->getTodasFrases($opciones['per_page'],$desde); $data['paginacion'] = $this->pagination->create_links(); $this->load->view('principal',$data); }
La primera línea de código sirve para cargar la librería de paginación que será la que se encargará de resolver todo este asunto. En este ejemplo está hecho en el mismo método index del controlador, pero según el programa podría llegar a ser necesario cargarla directamente en el constructor. El array $opciones reunirá todos los parámetros necesarios para pasarle a la librería. Vamos a ver para qué sirve cada uno.
- per_page: indica la cantidad de resultados que se quieren ver por página.
- base_url: es la URL que se quiere paginar. En este caso, es el método index del controladorfrase.
- total_rows: es la cantidad total de resultados de la consulta. Se necesitará un método en el modelo que obtenga este valor.
- uri_segment: este parámetro indica en qué segmento de la URI estará el parámetro de paginación. Los segmentos en CodeIgniter quedan delimitados por las barras. Por ejemplo en index.php/frase/index, el primer segmento es frase y el segundo es index. De esta forma, si se le indica el número 3, la librería utilizará el tercer segmento para enviar y recibir el parámetro que indica desde qué registro comienza la consulta. El resultado podrán verlo al ir navegando las páginas y tendrá una forma similiar a la siguiente: index.php/frase/index/30
Con todas esas opciones preparadas, se puede inicializar la paginación. Para ello, se utiliza el método initialize de la librería, al que se le pasa el array $opciones.
Luego hay que hacer la consulta a la base de datos, pero de eso se encarga el modelo. Es por eso que hacemos una llamada al método que corresponde para traer los datos. Como ya vimos,$opciones['per_page'] indica la cantidad de elementos que se quieren obtener por consulta y$desde, a partir de cuál. Esto se entenderá mejor en el modelo.
El valor de $desde se obtiene del tercer segmento de URI, siempre que esté definido. Si no lo está, entonces el valor que toma es 0. Esto significa que si no hay ningún valor en el tercer segmento, los resultados que se mostrarán comenzarán por la primera fila y se extenderá hasta la cantidad que se indique en $opciones['per_page'].
En $data['paginacion'] se obtiene el código HTML necesario para mostrar los enlaces a las páginas al pie de cada una de ellas. Esto bastante sencillo gracias al método create_links de la librería de paginación de CodeIgniter.
Finalmente, se carga la vista que corresponde.
Modelo: Consultas a la base de datos
Hemos visto que en el controlador hay dos llamadas al modelo. Una es para contar la cantidad total de elementos de la consulta, y la otra para devolver los resultados de la tabla que corresponde, acotados por los dos parámetros que mencionamos.
Veamos el primer método
<?php private $tb_frases = 'om_frases'; function __construct(){ parent::__construct(); $this->load->database(); } function getNumFrases(){ return $this->db->count_all($this->tb_frases); }
Estoy usando la librería de manejo de bases de datos de CodeIgniter que, en este caso, estoy cargando en el constructor. El método getNumFrases cuenta todos los registros de la tabla $this->tb_frases, cuyo valor está definido como atributo privado al comienzo. Tengan en cuenta que omití la declaración de clase del modelo.
El otro método, es el que realiza las consultas acotando los resultados.
function getTodasFrases($limit,$start) { $this->db->limit($limit,$start); $resultado = $this->db->get($this->tb_frases); return $resultado->result(); }
Se reciben dos parámetros. $limit se corresponde con $opciones['per_page'] y $start con$desde. Se realiza una consulta con limit, en este caso utilizando el método vinculado de la librería de base de datos. Luego, se obtienen los datos en $resultado, mediante el método get de la misma librería. Por último, se devuelve $resultado->result() que es el resultado de la consulta como un arreglo de objetos.
Vista: presentación de los datos
Falta mostrar los resultados por pantalla y los enlaces de paginación al pie de la página.
<h2>Todas las frases</h2> <table> <tr> <th>Frase</th> <th>Autor</th> </tr> <?php foreach($lista as $fila) : ?> <tr> <td class="tb-frase"><?php echo $fila->frase; ?></td> <td class="tb-autor"><?php echo $fila->autor; ?></td> </tr> <?php endforeach; ?> </table> <div class="paginacion"> <?php echo $paginacion ?> </div>
La información estaba en $data['lista'] así que en la vista se puede manejar como la variable$lista. A través de un foreach se puede iterar e ir obteniendo cada uno de los datos, que en este caso, se presentan en forma de tabla.
Al pie de la tabla, está la paginación. Simplemente hay que imprimir el valor de la variable$paginacion y los enlaces para navegar por las páginas aparecerán solos.
Más opciones de la clase de paginación
Hasta aquí hemos visto el funcionamiento básico de esta librería. Pero tiene aún más opciones para personalizarla. Si seguimos con el array $opciones para definir los parámetros, podríamos tener también:
- $opciones['num_links']: Es el número de enlaces que aparecerán antes y después de la página actual en los enlaces de paginación.
- $opciones['use_page_numbers']: ¿Notaron que el valor que se pasa en el tercer segmento es el que indica a partir de qué fila se va a seleccionar? ¿No pensaron intuitivamente que debía ser el número de página? Bueno, justamente si se pone esta variable en TRUE, el parámetro que se usará será el número de página.
- $opciones['page_query_string']: Si no les gusta usar segmentos, pueden hacer que el parámetro pase por get poniendo en TRUE este parámetro.
- $opciones['query_string_segment']: Es el nombre de la variable get que llevará el valor de la página, si ponen en TRUE el parámetro anterior.
- $config['full_tag_open'] y $config['full_tag_close']: sirven para envolver con código HTML los enlaces de paginación con el objetivo de darle formato.
- $config['display_pages']: Poniendo esta variable en FALSE, no se mostrarán los números de página. Simplemente el enlace
Hay algunos parámetros para darle formato al primer enlace de las páginas, que por defecto está en inglés y dice “First”.
- $config['first_link'] = ‘Primera’: Con ‘first_link’ se le puede cambiar la etiqueta o el nombre del enlace, como por ejemplo, cambiar el “First” por “Primera”.
- $config['first_tag_open'] y $config['first_tag_close']: Envuelven al primer enlace con el objetivo de darle formato.
De la misma forma, hay opciones para personalizar el último enlace, el enlace siguiente y el anterior.
Novedad Interesante
Quizá os interesaría desarrollar tablas paginadas con buscador en vivo.
Recientemente he publicado un post sobre dataTables, que permite crear tablas paginadas con jquery.
Aquí os dejo el link:
Suscribirse a:
Enviar comentarios
(
Atom
)
Sígueme en las Redes Sociales
Donaciones
Datos personales
Entradas populares
-
En este apartado vamos a explicar como ejercutar archivos PHP a través del terminal de Ubuntu. Lo primero que tendríamos que hacer es inst...
-
En este blog voy a comentar un tema que se utilizan en casi todas las páginas web que existen, y es el tema de la paginación. La paginaci...
-
Este post trata de la integración de la librería PHPExcel en Codeigniter, aunque se podría aplicar a cualquier librería, como por ejemplo mP...
-
Ejemplo para añadir o sumar un número determinado de hora/s, minuto/s, segundo/s a una fecha en php. Con la función strtotime se puede ...
-
Este tema es uno de los temas primordiales sobre el framework Codeigniter, ya que en alguna ocación nos hemos visto obligados a recoger dato...
© Espacio Daycry - Espacio de programación 2013 . Powered by Bootstrap , Blogger templates and RWD Testing Tool
No hay comentarios :
Publicar un comentario