Silex: Paginar con Pagerfanta

Paginar es una de las cosas comunes que siempre suelen hacer falta en una aplicación web y hay muchas librerías que ofrecen esta funcionalidad. En este artículo veremos cómo paginar en Silex usando la librería Pagerfanta.

Lo primero, como siempre, es mirar la documentación de Pagerfanta y empezamos añadiendo la librería a nuestro proyecto de Silex con Composer:

Primero vamos a crear el servicio FakeService para obtener datos para paginar, creamos el fichero FakeService que hará uso de la librería Faker para generar datos:

Registrarmos el servicio en app.php:

Seguimos ahora con la paginación, vamos a controllers.php y creamos una nueva ruta, el código que se ejecutará cuando la visitemos llamará obtendrá FakeService y paginaremos usando Pagerfanta:

Pagerfanta tiene varios Adapters, en este caso como lo que estamos paginando es un array usamos ArrayAdapter. Con esto ya tenemos por una parte nuestro objeto pagerfanta que tiene los resultados según la página en la que estamos y por otra parte tenemos el html para los números de página que se genera a través de un objeto de la clase DefaultView personalizable (también podemos crear nuestra clase View). Finalmente pasamos esos dos parámetros a la plantilla pagerfanta.html.twig que quedaría:

Todo esto es demasiado código y si tenemos varias páginas que paginar tendríamos que copiar mucho código. Lo que haremos será basándonos en WhiteOctoberPagerfantaBundle, crear un Provider y llevarnos la parte de la vista a una extensión de Twig y crear algún servicio que nos facilite la paginación. Para usarlo vamos al fichero composer.json y sustituimos la linea que hemos añadido antes por esta:

Actualizamos:

Y registramos el provider en app.php:

Adaptamos el código que teníamos con lo que nos ofrece el provider, el controller ahora queda así:

Ya no nos hace falta ningún use, el método getForArray (no me acaba de gustar el nombre) de pagerfanta.pager_factory crea un objeto de tipo Pagerfanta con ArrayAdapter:

El motivo de este método es que casi siempre vamos a paginar arrays, ya que si usamos DoctrineServiceProvider integra Doctrine DBAL y por lo tanto el resultado de las consultas serán arrays. La vista quedará tal que así:

La función pagerfanta está registrada en la extensión de Twig, esta extensión es una adaptación del bundle. Para terminar, como estamos usando Foundation no nos vale ninguna de las vistas que proporciona Pagerfanta, así que nos creamos la clase FoundationView que es casi idéntica a TwitterBootstrarView. Añadimos la vista e indicamos que es la que usamos por defecto en app.php:

Con todo esto ya tenemos nuestro ejemplo de paginación y vemos que con el provider facilita mucho las cosas.

Ver Demo