Paginación en PHP fácil y rápida

Formulario actualizar foto

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

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


2 thoughts on “Paginación en PHP fácil y rápida”

  1. 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!

  2. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

© Kumbia Team