Paginación de resultados de la base de datos
Al crear aplicaciones web, muy a menudo te encontrarás con el requisito de limitar el número de elementos mostrados por página.
Partiremos del estado en el que mostramos todos los datos sin paginación. Para seleccionar datos de la base de datos, tenemos
la clase ArticleRepository, que además del constructor contiene el método findPublishedArticles
, que devuelve todos
los artículos publicados ordenados descendentemente por fecha de publicación.
En el Presenter, inyectamos la clase del modelo y en el método render solicitamos los artículos publicados, que pasamos a la plantilla:
En la plantilla default.latte
nos encargamos de mostrar los artículos:
De esta manera, podemos mostrar todos los artículos, lo que, sin embargo, comenzará a causar problemas cuando el número de artículos aumente. En ese momento, será útil implementar un mecanismo de paginación.
Este asegurará que todos los artículos se dividan en varias páginas y solo mostraremos los artículos de la página actual. El número total de páginas y la división de los artículos los calculará Paginator por sí mismo según cuántos artículos tengamos en total y cuántos artículos por página queramos mostrar.
En el primer paso, modificaremos el método para obtener artículos en la clase del repositorio para que pueda devolver solo los artículos de una página. También añadiremos un método para averiguar el número total de artículos en la base de datos, que necesitaremos para configurar el Paginator:
A continuación, procederemos a modificar el Presenter. Pasaremos el número de la página actualmente mostrada al método render. En caso de que este número no forme parte de la URL, estableceremos el valor predeterminado de la primera página.
También ampliaremos el método render para obtener una instancia de Paginator, configurarlo y seleccionar los artículos correctos para mostrar en la plantilla. HomePresenter se verá así después de las modificaciones:
La plantilla ahora solo itera sobre los artículos de una página, solo necesitamos añadir los enlaces de paginación:
Así hemos añadido la opción de paginación a la página usando Paginator. En caso de que en lugar de Nette Database Core usemos Nette Database Explorer como capa de base de datos, podemos implementar la
paginación incluso sin usar Paginator. La clase Nette\Database\Table\Selection
contiene el método page con la lógica de paginación tomada de
Paginator.
El repositorio se verá así con esta forma de implementación:
En el Presenter no necesitamos crear un Paginator, usaremos en su lugar el método de la clase Selection
, que nos
devuelve el repositorio:
Dado que ahora no enviamos Paginator a la plantilla, modificaremos la parte que muestra los enlaces de paginación:
De esta manera, hemos implementado el mecanismo de paginación sin usar Paginator.