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!
3 ideas sobre “Paginación con Symfony: KnpPaginatorBundle”
Buena explicacion
Excelente tutorial 🙂 podria hacer un post referente a busquedas, empleando algun bundle para symfony? Muy buen blog.
Hola! Gracias por tu comentario Nestor! Estoy actualizando los temas para la última versión de Symfony así que seguro en Enero tendré más contenidos al respecto y espero el libro terminado también!
Buen día!