---
title: "Paginación"
description: "Paginación basada en URL con ayudantes de plantilla."
---

La paginación en Nibiru es **URL-driven**. El número de página es un segmento de URL (`/products/index/page/3`), no una cadena de consulta. La clase `Pageination` — nota la ortografía — lo lee, calcula los desplazamientos y asigna un array `pagination` a Smarty.

## Conectarlo
```php
use Nibiru\Pageination;
use Nibiru\Model\products;

class productsController extends Controller
{
    public function pageAction() {
        $products = new products();
        Pageination::setEntriesPerPage(25);   // optional; default from INI
        Pageination::setTable($products);
        $rows = Pageination::loadTableAsArray();

        View::assign(['products' => $rows]);
    }

    public function navigationAction() {
        JsonNavigation::getInstance()->loadJsonNavigationArray();
    }
}
```
`Pageination::setTable(...)` lee la URL, calcula los desplazamientos y asigna los metadatos de navegación a la plantilla mediante la variable `pagination`.

## Renderizado en la plantilla
```smarty
{include 'shared/header.tpl'}
<body>
{include file="navigation.tpl"}

<main class="container">
  <table class="table">
    {foreach $products as $p}
      <tr><td>{$p.id}</td><td>{$p.name|escape}</td></tr>
    {/foreach}
  </table>

  {include file="pageination.tpl"}
</main>
{include 'shared/footer.tpl'}
</body>
```
O bien renderiza en línea:
```smarty
<nav class="pagination">
  {if $pagination.previous}
    <a href="{$pagination.paginationPath}/page/{$pagination.previous}">←</a>
  {/if}

  {foreach $pagination as $entry}
    {if isset($entry.page)}
      <a class="{if $entry.page == $pagination.current}active{/if}"
         href="{$pagination.paginationPath}/page/{$entry.page}">
        {$entry.page}
      </a>
    {/if}
  {/foreach}

  {if $pagination.next}
    <a href="{$pagination.paginationPath}/page/{$pagination.next}">→</a>
  {/if}
</nav>
```
## Formato de URL
```
/<controller>/<action>/page/<N>
```
Ejemplos:
```
/products/index/page/2
/products/page/2          ; if action is omitted, "index" is implied
/users/list/page/7
```
La variable de plantilla `paginationPath` es la ruta *sin* `/page/N` — anexa tu propio número de página al generar enlaces.

## Configuración
```ini
[SETTINGS]
entries.per.page = 25
```
Este es el valor predeterminado global; sobrescribe por controlador con `Pageination::setEntriesPerPage()` antes de `setTable()`.

## Trucos comunes

- **Ortografía.** La clase es `Pageination`, el rasgo (trait) es `Attributes\Pageination`, la plantilla es `pageination.tpl`. Está escrito así a lo largo del framework. No luches contra ello.
- **Orden de `setTable()`.** Llama a `setEntriesPerPage()` *antes* que `setTable()`, de lo contrario, los desplazamientos se calculan en función del valor predeterminado.
- **La página 0 es inválida.** Si un usuario solicita `/page/0`, trátalo como `1`. Nibiru lo hace internamente, pero si construyes tus propios enlaces de paginación, normaliza las entradas.
