コンテンツにスキップ

ページネーション

paginate はページネーションコンポーネントを生成する関数です。クエリとオプションを引数として受け取ります。

src/pages/accounts/index.astro
---
import { paginate } from "accel-web";
import { Account } from "src/models";
const url = new URL(Astro.request.url);
const page = Number(url.searchParams.get("p")) || 1;
const { Nav, PageEntriesInfo } = paginate(Account.order("id", "desc"), { page, per: 10, window: 1 });
---
<!-- nav -->
<Nav />
<!-- info -->
<PageEntriesInfo />

上記のコードは次のようなHTMLを出力します:

<!-- nav -->
<nav>
<ul class="pagination">
<li class="page-item first">
<a href="/?p=1" class="page-link">« First</a>
</li>
<li class="page-item prev">
<a rel="prev" href="/?p=2" class="page-link">‹ Prev</a>
</li>
<li class="page-item disabled gap">
<span class="page-link"></span>
</li>
<li class="page-item page">
<a href="/?p=2" class="page-link"> 2 </a>
</li>
<li class="page-item page active">
<span class="page-link">3</span>
</li>
<li class="page-item page">
<a href="/?p=4" class="page-link"> 4 </a>
</li>
<li class="page-item disabled gap">
<span class="page-link"></span>
</li>
<li class="page-item next">
<a rel="next" href="/?p=4" class="page-link">Next ›</a>
</li>
<li class="page-item last">
<a href="/?p=6" class="page-link">Last »</a>
</li>
</ul>
</nav>
<!-- info -->
<div class="page-entries-info">Displaying <b>21 - 30</b> of <b>55</b> in total</div>

以下のスタイルは、Bootstrap 5を使用した場合に適用されます。独自のCSSを追加することで、スタイルを上書きすることができます。

Pagination UI with Bootstrap

国際化

ページネーションの機能で出力される各テキストにも国際化(I18n)を適用することができます。

キーデフォルト値表示例
views.pagination.first&laquo; First« First
views.pagination.lastLast &raquo;Last »
views.pagination.previous&lsaquo; Prev‹ Prev
views.pagination.nextNext &rsaquo;Next ›
views.pagination.truncate&hellip;
helpers.pageEntriesInfo.onePage.displayEntries_zeroNo entries foundNo entries found
helpers.pageEntriesInfo.onePage.displayEntries_otherDisplaying all {total} entriesDisplaying all 5 entries
helpers.pageEntriesInfo.morePages.displayEntriesDisplaying {first} - {last} of {total} in totalDisplaying 1-10 of 55 in total

日本語での設定例:

src/config/locales/views/pagination/ja.yml
ja:
translation:
views.pagination:
first: "&laquo; 最初"
last: "最後 &raquo;"
previous: "&lsaquo; 前"
next: "次 &rsaquo;"
truncate: "&hellip;"
helpers.pageEntriesInfo:
onePage:
displayEntries_zero: "レコードが見つかりませんでした"
displayEntries_other: "<b>全{{total}}</b>件表示中"
morePages:
displayEntries: "<b>{{first}}-{{last}}</b>件 / {{total}}件中"