Con este tutorial mostraremos como realizar la paginación en PHP de un listado de usuarios usando nuestro framework favorito KumbiaPHP. Utilizaremos como base el proyecto anterior, donde mostramos como subir una imagen y asignarla a un usuario, y cambiaremos el listado normal por un listado paginado.
En el controlador
Lo primero es mencionar que el ActiveRecord cuenta con un paginador muy bueno(Ver sección en el manual: Paginando en ActiveRecord), que nos permitirá con una sola línea de código implementar la paginación en php. Vamos al controlador de usuarios y añadimos la función page(…):
Archivo: app/controllers/user_controller.php
public function page(int $page = 1)//validación 'int' con php7
{
$this->page = (new User)->paginate("page: $page", 'per_page: 7');
}
El parametro $page tiene un valor por defecto, así que, si no le pasamos ningun valor será igual a 1. En el llamado a la función paginate() el primer parámetro es page, con el cual le indicamos el número de página que deseamos mostrar. El segundo parámetro es per_page, con el cual le indicamos el número de elementos a mostrar por página.
La vista
Creamos un nuevo archivo llamado page.html es una vista similar a index.phtml, con la diferencia que para obtener el arreglo de elementos, ojo esto es muy importante, se accede al atributo items del objeto $page. La otra diferencia es que se hace llamado a un partial el cual nos mostrará el paginador con el número de página actual y los números de páginas disponibles. Si, este partial nos ahorra un montón de trabajo ya que en él está toda la lógica de visualización.
Archivo: app/views/user/page.phtml
<h1>Lista de usuarios</h1>
<?= Html::linkAction('create', 'Crear', 'class="button"') ?>
<?php View::content() ?>
<?php if (count($page->items) > 0) { ?>
<table class="u-fu$pagell-width">
<thead>
<tr>
<th>Nombre</th>
<th>Edad</th>
<th>Correo</th>
<th>Foto</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($page->items as $item) { ?>
<tr>
<td><?= $item->name ?></td>
<td><?= $item->age ?></td>
<td><?= $item->email ?></td>
<td><?= $item->photo ?></td>
<td><?= Html::linkAction("edit/$item->id", 'Editar') ?> | <?= Html::linkAction("update_photo/$item->id", 'Actualizar foto') ?></td>
</tr>
<?php } ?>
</tbody>
</table>
<?php } else { ?>
<h2>No hay ningún registro</h2>
<?php } ?>
<?php View::partial('paginators/classic', false, array('page' => $page)); ?>
Existen otros partials que sirven de paginadores, también puedes crear los tuyos para que se adapten a tu diseño.
Así se ve la paginación en PHP
Si vas a usar otra acción diferente de page() debes pasarle al partial como parámetro la url de la acción, así:
Archivo: app/views/user/page.phtml
<?php View::partial('paginators/classic', false, array('page' => $page, 'url' => 'user/index')); ?>
Descargar código completo
Como siempre, el código completo está disponible para todos en el siguiente repositorio en Github listo para usar con Docker: https://github.com/henrystivens/paginate-php
Hola buenas, soy nuevo con el framework de Kumbia y he visto tu ejemplo y al descargarlo de github y probarlo me sale este error, ¿Ha que se debe?
KumbiaException
php_network_getaddresses: getaddrinfo failed: Host desconocido. (0)
En el archivo C:\xampp\htdocs\kumbia\core\libs\db\adapters\mysqli.php en la línea: 124
Un saludo!
Hola Sergio,
Creo que el problema se debe a que no has configurado los datos de conexión a la base de datos. Ve al archivo default/app/config/databases.ini y cambia los datos por los tuyos:
[development] host = mysql-dev username = root ; no es recomendable usar el usuario root password = root name = paginate_php ; nombre de la base de datos type = mysqli ; charset = utf8 ; este valor es necesario para abrir conexiones UTF-8
Cualquier otra inquietud, no dudes en comentar.