ページネーション
テンプレートヘルパーを使用したURLドリブンのページネーション。
Nibiru のページネーションは URL ドリブン です。ページ番号は URL セグメント (/products/index/page/3) であり、クエリストリングではありません。Pageination クラス — 拼写に注意 — がそれを読み取り、オフセットを計算し、pagination 配列を Smarty に割り当てます。
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 変数を通じて割り当てます。
テンプレートでのレンダリング
Section titled “テンプレートでのレンダリング”{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>またはインラインでレンダリングします:
<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 フォーマット
Section titled “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 なし のパスです。リンクを生成する際には、ページ番号を自分で追加してください。
[SETTINGS]entries.per.page = 25これはグローバルなデフォルトです;Pageination::setEntriesPerPage() を setTable() の前にコントローラごとにオーバーライドしてください。
一般的な落とし穴
Section titled “一般的な落とし穴”- スペリング。 クラスは
Pageination、トレイトはAttributes\Pageination、テンプレートはpageination.tplです。フレームワーク全体でこのように記述されています。これに抵抗しないでください。 setTable()の順序。setEntriesPerPage()をsetTable()の前に 呼び出すようにしてください。それ以外の場合、オフセットはデフォルトに対して計算されます。- ページ0は無効です。 ユーザーが
/page/0を要求した場合、それを1として扱います。Nibiru は内部でこれを行いますが、独自のページネーションリンクを構築する場合は、入力を正規化してください。