大量の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]についての解説を終わりに致します。
有難う御座いました。

Categories: