Cómo paginar resultados de una consulta en Cakephp 3
|Al obtener resultados de una base de datos, cuando son muchos datos, es buena practica paginarlos para mostrar los resultados en bloques de X cantidad para que sea mejor visto por el usuario y no cargar todos los datos innecesariamente.
Esta vez vamos a poner esto en practica en Cakephp 3 y mostrar las facilidades que el framework nos provee para esta tarea.
ANTES DE COMENZAR:
Mis aplicaciones estoy acostumbrado a nombrar los modelos, controladores, componentes, etc., en español por lo que recomiendo ver el post de Como utilizar modelos y controladores en español en CakePHP 3.
Lo primero es crear una tabla de usuarios con algunos datos de prueba.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
-- phpMyAdmin SQL Dump -- version 4.3.11 -- http://www.phpmyadmin.net -- -- Servidor: 127.0.0.1 -- Tiempo de generación: 17-02-2016 a las 09:04:54 -- Versión del servidor: 5.6.24 -- Versión de PHP: 5.6.8 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- Base de datos: `cakephp3` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `usuarios` -- CREATE TABLE IF NOT EXISTS `usuarios` ( `id` int(11) NOT NULL, `nombres` varchar(100) NOT NULL, `apellidos` varchar(100) NOT NULL, `fecha_creacion` datetime NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; -- -- Volcado de datos para la tabla `usuarios` -- INSERT INTO `usuarios` (`id`, `nombres`, `apellidos`, `fecha_creacion`) VALUES (1, 'darth', 'vader', '2016-02-02 04:00:00'), (2, 'kylo', 'ren', '2016-02-11 04:18:00'), (3, 'han', 'solo', '2016-02-19 01:13:30'), (4, 'luke', 'skywalker', '2016-02-01 14:19:31'), (5, 'poe', 'dameron', '2016-02-08 13:16:07'), (6, 'leia', 'organa', '2016-01-04 05:12:00'), (7, 'finn', 'stormtrooper', '2016-02-09 15:48:21'); -- -- Índices para tablas volcadas -- -- -- Indices de la tabla `usuarios` -- ALTER TABLE `usuarios` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT de las tablas volcadas -- -- -- AUTO_INCREMENT de la tabla `usuarios` -- ALTER TABLE `usuarios` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8; |
Ya estando en tu proyecto de Cakephp 3 vamos a crear un modelo tabla en la ruta /src/Model/Table:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php use Cake\ORM\Table; /** * CakePHP UsuariosTable * @author hugo lizama */ class UsuariosTable extends Table { public function initialize(array $config) { parent::initialize($config); /* * Establecemos el nombre de la tabla que utiliza este modelo, * recomendable cuando la tabla no se llama igual que el modelo * como por ejemplo que se llamara 'cake_usuarios' */ $this->table("usuarios"); } } |
Luego creamos nuestro controlador en la ruta /src/Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php namespace App\Controller; use App\Controller\AppController; /** * CakePHP UsuariosController * @author hugo lizama */ class UsuariosController extends AppController { public function index(){ //Opciones que vamos a aplicar a la paginacion $this->paginate = [ 'limit' => 2, //cuando registros queres ver por pagina //lista de campos por los cuales se podra hacer ordenamiento de datos en la vista 'sortWhitelist' => [ 'Usuarios.id', 'Usuarios.nombres', 'Usuarios.apellidos', 'Usuarios.fecha_creacion' ], 'conditions' => [ //Aqui podes poner las condiciones que querras aplicar a la consulta ], 'order' => [ //ordenamiento de los datos inicial 'Usuarios.id' => 'asc' ] ]; //obtenemos los datos de la base de datos y los pasamos al componente de paginacion $usuarios = $this->paginate($this->Usuarios->find('all')); //enviamos la variable usuarios a la vista $this->set(compact('usuarios')); } } |
Creamos una carpeta llamada Usuarios dentro de /src/Template y creamos nuestra vista:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<table style="margin-top: 20px;"> <thead> <!-- Encabezado de la tabla. el metodo sort genera enlaces html en la vista con las propiedades necesarias para realizar ordenamiento de datos al hacer clic sobre un encabezado --> <tr> <th><?= $this->Paginator->sort('Usuarios.id', 'Id'); ?></th> <th><?= $this->Paginator->sort('Usuarios.nombres', 'Nombres'); ?></th> <th><?= $this->Paginator->sort('Usuarios.apellidos', 'Apellidos'); ?></th> <th><?= $this->Paginator->sort('Usuarios.fecha_creacion', 'Fecha'); ?></th> </tr> </thead> <tbody> <!-- Escribimos los datos de la base en la tabla --> <?php foreach($usuarios as $u): ?> <tr> <td><?= $u->id; ?></td> <td><?= $u->nombres; ?></td> <td><?= $u->apellidos; ?></td> <td><?= $u->fecha_creacion; ?></td> </tr> <?php endforeach; ?> </tbody> </table> <!-- Enlaces de navegacion entre datos --> <nav class="pagination-centered"> <ul class="pagination"> <?php //primer pagina echo $this->Paginator->first('<<'); //anterior echo $this->Paginator->prev('<'); //enlaces a cada numero de pagina echo $this->Paginator->numbers(['first' => 2, 'last' => 2]); //siguiente echo $this->Paginator->next('>'); //ultima echo $this->Paginator->last('>>'); ?> </ul> </nav> |
Con esto ya podemos ver nuestro resultado:
Ahora pueden jugar haciendo clic en los enlaces y ver a donde los lleva y que resultados entrega.
Les dejo el código fuente del proyecto por si les hace falta, recuerden modificar la conexión a la base de datos con sus datos. Saludos.
Referencias