Paginación con Symfony: KnpPaginatorBundle

knpPaginatorBundle

Hoy te voy a hablar de una alternativa para paginación cuando utilizas Symfony2, el bundle se llama KnpPaginatorBundle y lo encuentras en github AQUÍ. De manera particular te puedo decir que me resultó muy útil al inicio pero después, por las necesidades del proyecto, dejamos de utilizarlo. Sin embargo; me parece interesante y además práctico, si algún otro proyecto lo requiere, la primera opción en la que pensaré será este bundle. ¿Porqué? Bueno pues es bastante flexible y permite personalización, entre otras cosas.

¿Qué requiere?, requiere que tengas:

  • Knp pager component en versión igual o superior a la 1.1
  • Symfony 2.0 o superior
  • Twig 1.5 o superior

Sino tienes eso, comienza por actualizarte 😉 .Si tienes lo anterior entonces podrás instalar y configurar sin problema.

Puedes instalarlo desde el composer agregando esta línea:

composer require knplabs/knp-paginator-bundle

En cuanto a la configuración debes agregar a la configuración, en el archivo tuproyecto/app/config/config.yml, lo siguiente:

knp_paginator:
    page_range: 5                      # rango usado por dafault en la paginación
    default_options:
        page_name: page                # nombre para cada sección de consulta
        sort_field_name: sort          # nombre del parámetro de consulta
        sort_direction_name: direction # dirección del nombre del parámetro
        distinct: true                 # garantiza resultados distintos
    template:
        pagination: KnpPaginatorBundle:Pagination:sliding.html.twig     # plantilla de control de paginación
        sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # plantilla enlace

Esta es la configuración básica por defecto pero puedes cambiarla si lo consideras necesario. Después debes modificar el Kernel en el archivo app/Appkernel.php, agregando la línea 5 del siguiente código en el return array de la función registerBundles.

public function registerBundles()
{
    return array(
        // ...
        new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
        // ...
    );
}

Con esto ya tienes todo listo para comenzar a utilizarlo. El ejemplo de la documentación es muy sencillo pero te explico lo que hace:

//Este es tu controlador (controller)
public function listAction(Request $request)
{
    //en las siguientes líneas haces tu consulta de lo que sea
    $em    = $this->get('doctrine.orm.entity_manager');
    $dql   = "SELECT a FROM AcmeMainBundle:Article a";
    $query = $em->createQuery($dql);

    //creas $paginator que llama el método get de KnpPaginatorBundle
    $paginator  = $this->get('knp_paginator');
    //le pasas a $paginator los parámetros y los asignas a $pagination
    $pagination = $paginator->paginate(
        $query, /* fuente de los datos*/
        $request->query->get('page', 1)/*número de página*/,
        10/*límite de resultados por página*/
    );

    // aquí indicas a qué vista lo debe mandar, en este caso es list.html.twig
    return $this->render('AcmeMainBundle:Article:list.html.twig', array('pagination' => $pagination));
}

En la vista (twig) tienes que tener algo como:

{# obtiene el total de resultados #}
<div class="count">
    {{ pagination.getTotalItemCount }}
</div>
<table>
<tr>
{# organización de resultados de acuerdo a lo que viene de la query que mandaste #}
    <th>{{ knp_pagination_sortable(pagination, 'Id', 'a.id') }}</th>
    <th{% if pagination.isSorted('a.Title') %} class="sorted"{% endif %}>{{ knp_pagination_sortable(pagination, 'Title', 'a.title') }}</th>
</tr>

{# cuerpo de la tabla con los resultados obteniéndolos del result de tu controller #}
{% for article in pagination %}
<tr {% if loop.index is odd %}class="color"{% endif %}>
    <td>{{ article.id }}</td>
    <td>{{ article.title }}</td>
</tr>
{% endfor %}
</table>
{# display navigation #}
<div class="navigation">
    {{ knp_pagination_render(pagination) }}
</div>

¿Qué te parece? ¿Fácil, cierto?. Más adelante te daré otros ejemplos.

Si te gustó, no olvides suscribirte; están por llegar algunas sorpresas para mis suscriptores.

¡Hasta la próxima!

Deja un comentario

3 ideas sobre “Paginación con Symfony: KnpPaginatorBundle”

A %d blogueros les gusta esto: