忍者ブログ
自分なりの目線で情報を発信します。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Zend_Paginatorを使って、簡単なページング付き一覧を作ってみました。

Zend_Paginator(本家マニュアル)
http://framework.zend.com/manual/ja/zend.paginator.html
 
以下のテーブルからデータを取得して一覧を表示します。
 
■テーブル名
  • user
■カラム定義
  • id INT
  • name VARCHAR(16)
 
■UserController.php
  1. <?php
  2.  
  3. class UserController extends Zend_Controller_Action
  4. {
  5.     // ユーザー一覧表示
  6.     public function userListAction()
  7.     {
  8.         // ページ番号のリクエストがあれば取得(無ければ1ページ目とする)
  9.         $pagenum   = $this->getRequest()->getParam('page', 1);
  10.         // DBアダプタ生成
  11.         $dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array(
  12.                              'host'     => 'localhost',
  13.                              'username' => 'xxxx',
  14.                              'password' => 'xxxx',
  15.                              'dbname'   => 'xxxx'
  16.                           ));
  17.         // SQL作成
  18.         $select = $dbAdapter->select()
  19.                             ->from(array('usr' => 'user'),
  20.                                    array('id', 'name'))
  21.                             ->order(array('id'));
  22.         // ページネーターを取得
  23.         $adapter   = new Zend_Paginator_Adapter_DbSelect($select);
  24.         $paginator = new Zend_Paginator($adapter);
  25.         // 現在ページを設定
  26.         $paginator->setCurrentPageNumber($pagenum);
  27.         // 1ページあたりの表示件数を設定
  28.         $paginator->setItemCountPerPage(10);
  29.         // ビューにページネーターを渡す
  30.         $this->view->assign('userPaginator', $paginator);
  31.         // ビューを表示
  32.         $this->renderScript('admin/user_list.php');
  33.     }
  34. }
  35.  
  36. // end of file

リクエストを受け付けるアクションです。
テーブルからデータを取得するZend_Paginatorを、 ビューに渡しています。
Zend_Paginator用のアダプタには以下の種類があるそうですが、
普通にDBのテーブルから取得するために、DbSelectアダプタを使用しています。
 
<Zend_Paginator用のアダプタ>
アダプタ説明
Array PHP の配列を使用します。
DbSelect Zend_Db_Select のインスタンスを使用し、配列を返します。
DbTableSelect Zend_Db_Table_Select のインスタンスを使用し、 Zend_Db_Table_Rowset_Abstractのインスタンスを返します。 これは、結果セットについての追加情報 (カラム名など) を提供します。
Iterator Iterator のインスタンスを使用します。
Null データのページ処理を管理する際に Zend_Paginator を使用しません。その場合でもページ処理コントロールの機能を使うことはできます。


■user_list.php
  1. <html>
  2. <head>
  3.   <title>ユーザー一覧</title>
  4.   <meta http-equiv="Content-Type" content="text/html; charset=utf8">
  5. </head>
  6. <body>
  7.   <h1>ユーザー一覧</h1>
  8.   <table summary="ユーザー一覧">
  9.     <thead>
  10.       <tr>
  11.         <th>ID</th>
  12.         <th>名前</th>
  13.       </tr>
  14.     </thead>
  15.     <tfoot></tfoot>
  16.     <tbody>
  17.     <?php foreach($this->userPaginator as $key => $user): ?>
  18.       <tr>
  19.         <td>
  20.           <?php echo $user['id']; ?>
  21.         </td>
  22.         <td>
  23.           <?php echo $user['name']; ?>
  24.         </td>
  25.       </tr>
  26.     <?php endforeach; ?>
  27.     <?php if (count($this->userPaginator) === 0): ?>
  28.       <tr>
  29.         <td colspan="2">
  30.           データがありません
  31.         </td>
  32.       </tr>
  33.     <?php endif; ?>
  34.     </tbody>
  35.   </table>
  36.   <!-- ページネーションリンクを表示 -->
  37.   <?php echo $this->paginationControl(
  38.                  $this->userPaginator,
  39.                  'Sliding',
  40.                  'pagination/my_pagination_control.phtml'
  41.              );
  42.   ?>
  43. </body>
  44. </html>

一覧表示用のビュースクリプトです。
コントローラーから渡されたページネーターを使って、一覧を表示しています。
 
Zend_PaginatorはIteratorAggregateインターフェイスを実装しているため、
foreach文で順次処理をすることができています。
 
また、Countableインターフェイスも実装しているため、
count()で件数を取得することができます。
 
37~42行目に、ページネーションリンクを表示するための記述をしています。
引数は順番に、
 Zend_Paginatorのインスタンス
 スクロール形式
 ビュースクリプト
となっています。
第4引数も指定できるのですが、そのサンプルはまた後日に。
 
スクロール形式には、以下4種類があります。
 
<Zend_Paginatorのスクロール形式>
スクロール形式説明
All すべてのページを返します。 総ページ数が比較的少なめのときなど、 ドロップダウンメニュー形式でページ選択をさせる際に便利です。 そのような場合は、利用できるすべてのページを 一度にユーザに見せることになるでしょう。
Elastic Google 風のスクロール形式で、 ユーザがページを移動するのにあわせて拡大・縮小します。
Jumping ユーザがページを進めるにつれて、 ページ番号が表示範囲の最後に向けて進んでいきます。 表示範囲を超えると、新しい範囲の最初の位置に移動します。
Sliding Yahoo! 風のスクロール形式で、 現在表示されているページが常にページ範囲の中央 (あるいは可能な限りそれに近い場所) にあるようにします。これがデフォルトの形式です。

 
次は、ページネーションリンク用のビュースクリプトです。

■my_pagination_control.phtml
  1. <div>
  2. <?php echo '全'.$this->totalItemCount.'件'; ?>&nbsp;
  3. <?php if ($this->pageCount > 1): ?>
  4.   <!-- 前ページへのリンク -->
  5.   <?php if (isset($this->previous)): ?>
  6.     <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
  7.       &lt; 前へ
  8.     </a> |
  9.   <?php else: ?>
  10.     <span>&lt; 前へ</span> |
  11.   <?php endif; ?>
  12.  
  13.   <!-- ページ番号のリンク -->
  14.   <?php foreach ($this->pagesInRange as $page): ?>
  15.     <?php if ($page != $this->current): ?>
  16.       <a href="<?php echo $this->url(array('page' => $page)); ?>">
  17.           <?php echo $page; ?>
  18.       </a> |
  19.     <?php else: ?>
  20.       <?php echo $page; ?> |
  21.     <?php endif; ?>
  22.   <?php endforeach; ?>
  23.  
  24.   <!-- 次ページへのリンク -->
  25.   <?php if (isset($this->next)): ?>
  26.     <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
  27.       次へ &gt;
  28.     </a>
  29.   <?php else: ?>
  30.     <span>次へ &gt;</span>
  31.   <?php endif; ?>
  32. <?php endif; ?>
  33. </div>

ページネーションリンク用のビュースクリプトです。
 
このスクリプト内では、受け取ったZend_Paginatorのインスタンスを基に、
以下のプロパティが使えます。
<ページネーションリンク用のビューで使えるプロパティ>
プロパティ説明
first integer 最初のページ番号 (つまり 1)
firstItemNumber integer このページの最初の項目の番号
firstPageInRange integer スクロール形式で返された範囲内の最初のページ
current integer 現在のページ番号
currentItemCount integer このページの項目の数
itemCountPerPage integer 各ページに表示できる項目の最大数
last integer 最後のページ番号
lastItemNumber integer このページの最後の項目の番号
lastPageInRange integer スクロール形式で返された範囲内の最後のページ
next integer 次のページ番号
pageCount integer ページ数
pagesInRange array スクロール形式で返されたページの配列
previous integer 前のページ番号
totalItemCount integer 項目の総数
 
このオプションを使い分けることで、ページネーションリンクを実現しています。
各ページへのリンク(6, 16, 26行目)にて、'page'というキーを指定することで、
該当リンクをクリックした際に、ページ数をリクエストパラメータ'page'として
送ることができます。
そのため、UserController.phpでは'page'パラメータを受け取っています。
 


ページネーターを作ってしまえば、、
ページネーションに関する様々なプロパティが使えるようになるので、
結構便利ですね。
 
また、本家マニュアルには、
> DbSelectアダプタは、指定したクエリにマッチするすべての行を取得するのではなく、
> 現在のページ表示のための必要最小限のデータのみを取得します。
とあったので、少しソースを見てみました。
 
今回のサンプルを例にすると、
UserController.php内のコンストラクタやセッターメソッドの呼び出しでは
SQLが投げられていないようです。
 
user_list.php内の
foreach文やpaginationControlにZend_Paginatorのインスタンスを
渡して処理が実行される時にSQLを投げているみたいですね。
 
なので、予め設定されたページ番号の件数しかSELECTしないようになっていると。
様々なクラス設計に慣れ親しんできた猛者には当然の設計なのでしょうが、
慣れていない僕には勉強になりますねw
 
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
お知らせ
プロフィール
HN:
shusatoo
性別:
男性
自己紹介:
基本PHP。JavaScriptちょっとだけ。Javaをほんの少し。
おすすめ本
最新コメント
[10/09 shusatoo]
[10/09 misney]
最新トラックバック
カレンダー
09 2017/10 11
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
ブログ内検索
カウンター
アク解アナライズ
バーコード
ビジター

Copyright © [ 開発メモるアル ] All rights reserved.
Special Template : 忍者ブログ de テンプレート
Special Thanks : 忍者ブログ
Commercial message : [PR]