大量のDBデータを一覧表示する時に
同じ画面上に全て表示するのは処理速度的にも
UI的にも良い判断とは言えません。
やはり、見易く、扱いやすい様に
ある程度の数で区切ってページ分けした方が得策です。
今回は、そんなデータベースデータのページング処理について解説したいと思います。
ZendFramework2(ZF2)ではページング処理専用のクラスが用意されていますので、
そのAPIを使用し、ページングを組み立てて行きましょう。
ページャーに検索結果を入れる為のアダプタを作成しよう
私の場合はモデルにてtableGatewayを使ったDBへのアクセス関係を行っていますので
今回はモデル内にアダプタの作成からページャーへのセットまで行い、
コントローラへページャーを返却して見たいと思います。
まずはコードから
// ページを取得する(ページング用のアダプタを生成してページャーも作成) public function getPages( $page_no ) { // sqlオブジェクトを生成 $sql = $this->tableGateway->getSql(); // セレクト分の作成 $select = $sql->select(); // whereをつける $select->where(array('deleted' => 0)); // orderをつける $select->order('id ASC'); // DbSelectアダプターを作成 $adapter = new \Zend\Paginator\Adapter\DbSelect( $select, $sql ); // ページャーへアダプターをセット $paginator = new \Zend\Paginator\Paginator( $adapter ); //現在のページ数 $paginator->setCurrentPageNumber( $page_no ); //1ページに表示する件数 $paginator->setItemCountPerPage(10); //前後合わせて表示するページ数 $paginator->setPageRange(5); //現在のページのアイテムを取得 $paginator->getCurrentItems(); // 作成したページャを返却 return( $paginator ); }
Module.phpのgetServiceConfig()での繋ぎこみが終えている事が前提で、
tableGatewayが該当するモデルクラスとDBテーブルに一致している事が条件です。
上記のコードにより、該当するDBに対してのクエリを作成し
アダプターを生成、ページャーへセットする所まで行っています。
引数は該当するページ番号を受けてページャーへセットしています。
後はコントローラ側から上記メソッドを呼び、実際に使ってみましょう。
コントローラでページャーを操作する
コントローラ側から先程作成したモデルクラスのgetPages()にて
ページャを作成し、ビューへ渡すサンプルです。
// Album一覧 public function indexAction() { // ページ番号を取得する $page_no = $this->params()->fromQuery( 'page', 1 ); // ページ番号を渡し、ページャを作成する $paginator = $this->getAlbumTable()->getPages( $page_no ); // ページナビゲーションを作成する $navi = $paginator->getPages(); // 現在のページアイテムを配列として取得する $rows = $paginator->getCurrentItems()->toArray(); // ビューを作成 $view = new ViewModel( array( // ナビゲーションをビューに追加 'navi' => $navi, // 結果配列をビューに追加 'rows' => $rows, ) ); // ビューを返却 return( $view ); }
今回のサンプルでは、ページ番号をGETパラメータにて受け取り、デフォルト値を1としています。
これは、何も指定しなければ自動的に1がセットされるので、
『指定なし=1ページ目を表示』という状態を作り上げています。
そして、ページ番号を引数に、先程作成したgetPages()を実行します。
getAlbumTable()はコントローラ内で、モデルクラスを取得するメソッドを別途定義しています。
実装サンプルは下記を参考にして下さい。
public function getAlbumTable() { if (!$this->albumTable) { $sm = $this->getServiceLocator(); $this->albumTable = $sm->get('User\Model\AlbumTable'); } return $this->albumTable; }
これは既にサービスの設定が済んでいる事が条件です。
モデルクラスやコントローラクラスの事前設定について分からない方は、
先日書いた記事
【日本語版】ZendFramework2(ZF2)チュートリアル
を参考にして下さい。
続いて、ページング処理を行う為のナビゲーションを作成して取得します
// ページナビゲーションを作成する $navi = $paginator->getPages();
このナビゲーションとは何のかは後程ビューの説明の際に合わせて解説します。
そして実際に現在のページに該当するDBの要素を取得します
// 現在のページアイテムを配列として取得する $rows = $paginator->getCurrentItems()->toArray();
getCurrentItems()で現在の要素を特定し、toArray()で
foreach等で扱いやすい様に配列へ成型しています。
jsonとして取得したい時はtoJson()というものもあります。
取得したら、後はそれらをビューに渡して実際に動作させてみましょう。
ビュー側で行うページングナビゲーションの作成
ビュー側で、先程コントローラから渡されてきた
現在のページ要素はforeachで列挙できます。
これはページング処理特定の扱い方では無いので割愛させて頂きます。
この章では、コントローラでgetPages()によって作成したナビゲーションについて解説します。
ナビゲーションの中身は下記の様になっています。
stdClass Object ( [pageCount] => 3 [itemCountPerPage] => 1 [first] => 1 [current] => 1 [last] => 3 [next] => 2 [pagesInRange] => Array ( [1] => 1 [2] => 2 [3] => 3 ) [firstPageInRange] => 1 [lastPageInRange] => 3 [currentItemCount] => 1 [totalItemCount] => 3 [firstItemNumber] => 1 [lastItemNumber] => 1 )
ページングのナビゲーションに使用する要素と値が格納されています。
これらの値を成型してナビゲーションとして使います。
例えば、『前へ』と『次ぎへ』だけのシンプルなベージングナビゲーションを作成しますと、
前へ - 次へ
とする事で、簡単に作成出来てしまいます。
previousには前のページ番号、nextには次のページ番号が格納されています。
他にも、ページングナビゲーションとして使いそうな値は揃っているので、
サイトのコンセプトによって使い分けて下さい。
今回はページング用API『paginator』を使用した
ページングの実装方法をソースコード付きで解説させて頂きました。
とても簡単に実装出来ますので、是非とも活用して下さいね。
以上を持ちましてZendFramework2(ZF2)におけるページング処理[Paginator]についての解説を終わりに致します。
有難う御座いました。