---
title: "Pagination"
description: "Pagination basée sur les URL avec des assistants de modèle."
---

La pagination dans Nibiru est **drivée par l'URL**. Le numéro de page est un segment d'URL (`/products/index/page/3`), pas une chaîne de requête. La classe `Pageination` — notez l'orthographe — la lit, calcule les décalages et attribue un tableau `pagination` à Smarty.

## Lier les éléments
```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();
    }
}
```
`Pagination::setTable(...)` lit l'URL, calcule les décalages et attribue les métadonnées de navigation dans le modèle via la variable `pagination`.

## Rendu dans le modèle
```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>
```
Ou le restituer en ligne :
```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>
```
## Format d'URL
```
/<controller>/<action>/page/<N>
```
Exemples :
```
/products/index/page/2
/products/page/2          ; if action is omitted, "index" is implied
/users/list/page/7
```
La variable de modèle `paginationPath` est le chemin *sans* `/page/N` — ajoutez votre propre numéro de page lors de la génération des liens.

## Configuration
```ini
[SETTINGS]
entries.per.page = 25
```
Ceci est la valeur par défaut globale ; remplacez-la par contrôleur avec `Pagination::setEntriesPerPage()` avant `setTable()`.

## Tracas courantes

- **Orthographe.** La classe est `Pageination`, le trait est `Attributes\Pageination`, le modèle est `pageination.tpl`. C'est ainsi orthographié tout au long du framework. Ne luttnez pas contre cela.
- **Ordre de `setTable()`.** Appelez `setEntriesPerPage()` *avant* `setTable()`, sinon les décalages sont calculés par rapport à la valeur par défaut.
- **La page 0 est invalide.** Si un utilisateur demande `/page/0`, traitez-la comme `1`. Nibiru le fait en interne, mais si vous construisez vos propres liens de pagination, normalisez les entrées.
