データベース結果のページネーション
Webアプリケーションを作成する際、ページに表示される項目数を制限するという要件に非常に頻繁に遭遇します。
ページネーションなしですべてのデータを表示する状態から始めます。データベースからデータを選択するために、コンストラクタに加えて、公開されたすべての記事を公開日の降順で返す
findPublishedArticles
メソッドを含む ArticleRepository
クラスがあります。
Presenterでは、モデルクラスをインジェクトし、renderメソッドで公開された記事を要求し、それをテンプレートに渡します。
default.latte
テンプレートでは、記事の表示を担当します。
この方法で、すべての記事を表示できますが、記事の数が増えると問題が発生し始めます。その時点で、ページネーションメカニズムの実装が役立ちます。
これにより、すべての記事がいくつかのページに分割され、現在の1ページの記事のみが表示されます。合計ページ数と記事の分割は、Paginator が、合計でいくつの記事があり、ページごとに表示したい記事の数に基づいて自動的に計算します。
最初のステップでは、リポジトリクラスの記事取得メソッドを変更して、1ページの記事のみを返すようにします。また、Paginatorを設定するために必要なデータベース内の記事の総数を取得するメソッドを追加します。
次に、Presenterの変更に取り掛かります。renderメソッドに現在表示されているページの番号を渡します。この番号がURLの一部でない場合、最初のページのデフォルト値を設定します。
また、renderメソッドを拡張して、Paginatorインスタンスの取得、その設定、およびテンプレートで表示するための正しい記事の選択を行います。変更後のHomePresenterは次のようになります。
テンプレートはすでに1ページの記事のみを反復処理しているため、ページネーションリンクを追加するだけで済みます。
このようにして、Paginatorを使用してページネーションオプションをページに追加しました。データベース層として
Nette Database Core の代わりに Nette Database Explorer
を使用する場合、Paginatorを使用せずにページネーションを実装することもできます。Nette\Database\Table\Selection
クラスには、Paginatorから継承されたページネーションロジックを持つ page
メソッドが含まれています。
この実装方法では、リポジトリは次のようになります。
Presenterでは、Paginatorを作成する必要はありません。代わりに、リポジトリが返す
Selection
クラスのメソッドを使用します。
テンプレートにPaginatorを送信しなくなったため、ページネーションリンクを表示する部分を変更します。
この方法で、Paginatorを使用せずにページネーションメカニズムを実装しました。