自分なりの目線で情報を発信します。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Zend_Paginatorを使って、簡単なページング付き一覧を作ってみました。
以下のテーブルからデータを取得して一覧を表示します。
■テーブル名
- user
■カラム定義
- id INT
- name VARCHAR(16)
-
<?php
-
-
class UserController extends Zend_Controller_Action
-
{
-
// ユーザー一覧表示
-
public function userListAction()
-
{
-
// ページ番号のリクエストがあれば取得(無ければ1ページ目とする)
-
$pagenum = $this->getRequest()->getParam('page', 1);
-
// DBアダプタ生成
-
'host' => 'localhost',
-
'username' => 'xxxx',
-
'password' => 'xxxx',
-
'dbname' => 'xxxx'
-
));
-
// SQL作成
-
$select = $dbAdapter->select()
-
// ページネーターを取得
-
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
-
$paginator = new Zend_Paginator($adapter);
-
// 現在ページを設定
-
$paginator->setCurrentPageNumber($pagenum);
-
// 1ページあたりの表示件数を設定
-
$paginator->setItemCountPerPage(10);
-
// ビューにページネーターを渡す
-
$this->view->assign('userPaginator', $paginator);
-
// ビューを表示
-
$this->renderScript('admin/user_list.php');
-
}
-
}
-
-
// 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
-
<html>
-
<head>
-
<title>ユーザー一覧</title>
-
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
-
</head>
-
<body>
-
<h1>ユーザー一覧</h1>
-
<table summary="ユーザー一覧">
-
<thead>
-
<tr>
-
<th>ID</th>
-
<th>名前</th>
-
</tr>
-
</thead>
-
<tfoot></tfoot>
-
<tbody>
-
<?php foreach($this->userPaginator as $key => $user): ?>
-
<tr>
-
<td>
-
<?php echo $user['id']; ?>
-
</td>
-
<td>
-
<?php echo $user['name']; ?>
-
</td>
-
</tr>
-
<?php endforeach; ?>
-
<?php if (count($this->userPaginator) === 0): ?>
-
<tr>
-
<td colspan="2">
-
データがありません
-
</td>
-
</tr>
-
<?php endif; ?>
-
</tbody>
-
</table>
-
<!-- ページネーションリンクを表示 -->
-
<?php echo $this->paginationControl(
-
$this->userPaginator,
-
'Sliding',
-
'pagination/my_pagination_control.phtml'
-
);
-
?>
-
</body>
-
</html>
一覧表示用のビュースクリプトです。
コントローラーから渡されたページネーターを使って、一覧を表示しています。
Zend_PaginatorはIteratorAggregateインターフェイスを実装しているため、
foreach文で順次処理をすることができています。
また、Countableインターフェイスも実装しているため、
count()で件数を取得することができます。
37~42行目に、ページネーションリンクを表示するための記述をしています。
引数は順番に、
Zend_Paginatorのインスタンス
スクロール形式
ビュースクリプト
となっています。
第4引数も指定できるのですが、そのサンプルはまた後日に。
第4引数も指定できるのですが、そのサンプルはまた後日に。
スクロール形式には、以下4種類があります。
<Zend_Paginatorのスクロール形式>
スクロール形式 | 説明 |
---|---|
All | すべてのページを返します。 総ページ数が比較的少なめのときなど、 ドロップダウンメニュー形式でページ選択をさせる際に便利です。 そのような場合は、利用できるすべてのページを 一度にユーザに見せることになるでしょう。 |
Elastic | Google 風のスクロール形式で、 ユーザがページを移動するのにあわせて拡大・縮小します。 |
Jumping | ユーザがページを進めるにつれて、 ページ番号が表示範囲の最後に向けて進んでいきます。 表示範囲を超えると、新しい範囲の最初の位置に移動します。 |
Sliding | Yahoo! 風のスクロール形式で、 現在表示されているページが常にページ範囲の中央 (あるいは可能な限りそれに近い場所) にあるようにします。これがデフォルトの形式です。 |
■my_pagination_control.phtml
-
<div>
-
<?php echo '全'.$this->totalItemCount.'件'; ?>
-
<?php if ($this->pageCount > 1): ?>
-
<!-- 前ページへのリンク -->
-
<?php if (isset($this->previous)): ?>
-
<a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
-
< 前へ
-
</a> |
-
<?php else: ?>
-
<span>< 前へ</span> |
-
<?php endif; ?>
-
-
<!-- ページ番号のリンク -->
-
<?php foreach ($this->pagesInRange as $page): ?>
-
<?php if ($page != $this->current): ?>
-
<a href="<?php echo $this->url(array('page' => $page)); ?>">
-
<?php echo $page; ?>
-
</a> |
-
<?php else: ?>
-
<?php echo $page; ?> |
-
<?php endif; ?>
-
<?php endforeach; ?>
-
-
<!-- 次ページへのリンク -->
-
次へ >
-
</a>
-
<?php else: ?>
-
<span>次へ ></span>
-
<?php endif; ?>
-
<?php endif; ?>
-
</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
この記事にコメントする
お知らせ
最新記事
(03/11)
(02/23)
(01/08)
(12/28)
(11/18)
カテゴリー
プロフィール
HN:
shusatoo
性別:
男性
自己紹介:
基本PHP。JavaScriptちょっとだけ。Javaをほんの少し。
最新トラックバック
カレンダー
12 | 2025/01 | 02 |
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 |
ブログ内検索
最古記事
(09/18)
(09/23)
(10/01)
(10/09)
(10/10)
カウンター
アク解アナライズ
ビジター