ZendFramework2(ZF2)におけるページング処理[Paginator]


大量のDBデータを一覧表示する時に
同じ画面上に全て表示するのは処理速度的にも
UI的にも良い判断とは言えません。

やはり、見易く、扱いやすい様に
ある程度の数で区切ってページ分けした方が得策です。

今回は、そんなデータベースデータのページング処理について解説したいと思います。

ZendFramework2(ZF2)ではページング処理専用のクラスが用意されていますので、
そのAPIを使用し、ページングを組み立てて行きましょう。

  1. ページャーに検索結果を入れる為のアダプタを作成しよう
  2. コントローラでページャーを操作する
  3. ビュー側で行うページングナビゲーションの作成


ページャーに検索結果を入れる為のアダプタを作成しよう




私の場合はモデルにて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]についての解説を終わりに致します。
有難う御座いました。


コメントをお待ちしています

人気の投稿

Category

Algorithm (2) Android (8) ASP/aspx (1) Blogger (2) C/C++ (1) Chrome (5) CSS (9) Firefox (4) Fortran (1) Google (9) GoogleMap (2) HTML (12) IE (3) Information (4) iOS (2) iPhone/iPad/iPod (2) Java (6) JavaScript (16) jQuery (9) JSP (1) LifeRecipe (5) Linux (2) Macintosh (2) MapKit (4) Marketing (7) MySQL (3) NAMAZU (2) Objective-C (7) Other (7) Perl (1) PHP (9) Python (1) RSS/Atom (2) Ruby (1) Safari (2) SEO (11) Smarty (2) SQL (2) Tex (1) Three.js (1) Twitter (1) TwitterLog (313) UIKit (5) Unix (1) VBA/VBS (1) Windows (5) WordPress (3) Writing (5) XAMPP (1) XML (1) Yahoo (2) ZendFramework2 (14)

Archives