---
title: "ページネーション"
description: "テンプレートヘルパーを使用したURLドリブンのページネーション。"
---

Nibiru のページネーションは **URL ドリブン** です。ページ番号は URL セグメント (`/products/index/page/3`) であり、クエリストリングではありません。`Pageination` クラス — 拼写に注意 — がそれを読み取り、オフセットを計算し、`pagination` 配列を Smarty に割り当てます。

## 接続する
```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(...)` は、URL を読み取り、オフセットを計算し、ナビゲーションのメタデータをテンプレートに `pagination` 変数を通じて割り当てます。

## テンプレートでのレンダリング
```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>
```
またはインラインでレンダリングします：
```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>
```
## URL フォーマット
```
/<controller>/<action>/page/<N>
```
例：
```
/products/index/page/2
/products/page/2          ; if action is omitted, "index" is implied
/users/list/page/7
```
テンプレート変数 `paginationPath` は、`/page/N` *なし* のパスです。リンクを生成する際には、ページ番号を自分で追加してください。

## 設定
```ini
[SETTINGS]
entries.per.page = 25
```
これはグローバルなデフォルトです；`Pageination::setEntriesPerPage()` を `setTable()` の前にコントローラごとにオーバーライドしてください。

## 一般的な落とし穴

- **スペリング。** クラスは `Pageination`、トレイトは `Attributes\Pageination`、テンプレートは `pageination.tpl` です。フレームワーク全体でこのように記述されています。これに抵抗しないでください。
- **`setTable()` の順序。** `setEntriesPerPage()` を `setTable()` *の前に* 呼び出すようにしてください。それ以外の場合、オフセットはデフォルトに対して計算されます。
- **ページ0は無効です。** ユーザーが `/page/0` を要求した場合、それを `1` として扱います。Nibiru は内部でこれを行いますが、独自のページネーションリンクを構築する場合は、入力を正規化してください。
