自分なりの目線で情報を発信します。			
		×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Zend_Paginatorのサンプル続編です。
前回は、単純なページングのサンプルのみでしたが、
今回は検索条件(検索文字)付きのページングサンプルを紹介します。
検索機能付きの一覧画面が必要になることは日常茶飯事ですよねw
以下のテーブルからデータを取得して一覧を表示します。
■テーブル名
user
■カラム定義
id INT
name VARCHAR(16)
email VARCHAR(320)
※カラムの名前のつけ方が良くないのはサンプルなのでご容赦を。
 id、nameなんて名前は、個人的には実際には使わない方がいいと思います。
  (例えば、HTMLのinputタグ等の属性と同じ名前だし・・・orz)
検索に使えるのは、以下4項目です。
- ID (user.idに対応)
- 名前 (user.nameに対応)
- メールアドレス (user.emailに対応)
- 表示件数 (対応カラム無し、1ページあたりの表示件数を指定)
■UserController.php
- 
<?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'
- 
));
- 
- 
// 検索条件リクエスト値を取得
- 
$searchCond['id'] = $this->getRequest()->getParam('id', null);
- 
$searchCond['name'] = $this->getRequest()->getParam('name', null);
- 
$searchCond['email'] = $this->getRequest()->getParam('email', null);
- 
$searchCond['show_count'] = $this->getRequest()->getParam('show_count', 10);
- 
- 
// SQL作成
- 
$select = $dbAdapter->select()
- 
// SQLに検索条件を追加
- 
foreach ($this->searchCond as $colname => $colval) {
- 
continue;
- 
}
- 
switch ($key) {
- 
case 'id':
- 
$select->where("{$colname} = ?", $colval);
- 
break;
- 
case 'name':
- 
case 'email':
- 
$select->where("{$colname} LIKE ?", "%{$colval}%");
- 
break;
- 
default:
- 
break;
- 
}
- 
}
- 
- 
// ページネーターを取得
- 
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
- 
$paginator = new Zend_Paginator($adapter);
- 
// 現在ページを設定
- 
$paginator->setCurrentPageNumber($pagenum);
- 
// 1ページあたりの表示件数を設定(リクエストされた値を渡す)
- 
$paginator->setItemCountPerPage($searchCond['show_count']);
- 
// ビューにページネーターを渡す
- 
$this->view->assign('userPaginator', $paginator);
- 
// ビューを表示
- 
$this->renderScript('admin/user_list.php');
- 
}
- 
}
- 
- 
// end of file
リクエストを受け付けるアクションです。
テーブルからデータを取得するZend_Paginatorを、 ビューに渡しています。
検索条件として入力された検索文字のリクエスト値を取得し、
値が入力された場合のみwhere条件に追加しています。
Zend_Db_Selectオブジェクトを使っているため、
whereメソッドを呼び出すだけで条件に追加できます。
whereメソッドを複数回呼び出すと、それぞれの条件はANDで繋がります。
OR条件で繋げたい場合は、orWhereメソッドを使います。
詳しくはこちらを参照してください。
■user_list.php
- 
<html>
- 
<head>
- 
<title>ユーザー一覧</title>
- 
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
- 
</head>
- 
<body>
- 
<h1>ユーザー一覧</h1>
- 
<form action="<?php
- 
echo $this->url(
- 
'',
- 
TRUE);
- 
?>" method="get">
- 
<table>
- 
<thead></thead><tfoot></tfoot>
- 
<tbody>
- 
<tr>
- 
<th>ID</th>
- 
<td>
- 
<input type="text" name="id" id="id"
- 
</td>
- 
</tr>
- 
<tr>
- 
<th>名前</th>
- 
<td>
- 
<input type="text" name="name" id="name"
- 
</td>
- 
</tr>
- 
<tr>
- 
<th>メールアドレス</th>
- 
<td>
- 
<input type="text" name="email" id="email"
- 
</td>
- 
</tr>
- 
<tr>
- 
<th>表示件数</th>
- 
<td>
- 
<select name="show_count">
- 
<?php foreach ($options as $optkey => $optval): ?>
- 
<?php if ($optval === $this->searchCond['show_count']): ?>
- 
<option value="<?php echo $optval; ?>" selected="selected">
- 
<?php echo $optval; ?>
- 
</option>
- 
<?php else: ?>
- 
<option value="<?php echo $optval; ?>">
- 
<?php echo $optval; ?>
- 
</option>
- 
<?php endif; ?>
- 
<?php endforeach; ?>
- 
</select>
- 
</td>
- 
</tr>
- 
</tbody>
- 
</table>
- 
<input type="button" id="btn_search" value="検索">
- 
</form>
- 
<br>
- 
<table summary="ユーザー一覧">
- 
<thead>
- 
<tr>
- 
<th>ID</th>
- 
<th>名前</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>
- 
<td>
- 
<?php echo $user['email']; ?>
- 
</td>
- 
</tr>
- 
<?php endforeach; ?>
- 
<tr>
- 
<td colspan="3">
- 
データがありません
- 
</td>
- 
</tr>
- 
<?php endif; ?>
- 
</tbody>
- 
</table>
- 
<!-- ページネーションリンクを表示 -->
- 
<?php echo $this->paginationControl(
- 
$this->inquiryPaginator,
- 
'Sliding',
- 
'pagination/userlist_pagination.phtml',
- 
'controller' => 'user',
- 
'action' => 'user-list',
- 
'id' => $this->searchCond['id'],
- 
'name' => $this->searchCond['name'],
- 
'email' => $this->searchCond['email'],
- 
'show_count' => $this->searchCond['show_count']
- 
)
- 
);
- 
?>
- 
</body>
- 
</html>
一覧表示用のビュースクリプトです。
コントローラーから渡されたページネーターを使って、一覧を表示しています。
83~96行目に、ページネーションリンクを表示するための記述をしています。
引数は順番に、
 Zend_Paginatorのインスタンス
 スクロール形式
 ビュースクリプト
  オプション
です。
検索文字はすべて第4引数のオプションとして渡してしまえばいいです。
■userlist_pagination.phtml
- 
<div class="paginationControl">
- 
<?php
- 
'controller' => $this->controller,
- 
'action' => $this->action,
- 
'page' => '',
- 
'id' => $this->id,
- 
'name' => $this->name,
- 
'email' => $this->email,
- 
'show_count' => $this->show_count
- 
);
- 
?>
- 
<?php echo '全'.$this->totalItemCount.'件'; ?> 
- 
<?php if ($this->pageCount > 1): ?>
- 
<!-- 前のページへのリンク -->
- 
<?php $urlparams['page'] = $this->previous; ?>
- 
<a href="<?php echo $this->url($urlparams); ?>">
- 
< 前へ
- 
</a> |
- 
<?php else: ?>
- 
<span class="disabled">< 前へ</span> |
- 
<?php endif; ?>
- 
- 
<!-- ページ番号へのリンク -->
- 
<?php foreach ($this->pagesInRange as $page): ?>
- 
<?php $urlparams['page'] = $page; ?>
- 
<a href="<?php echo $this->url($urlparams); ?>">
- 
<?php echo $page; ?>
- 
</a> |
- 
<?php else: ?>
- 
<?php echo $page; ?> |
- 
<?php endif; ?>
- 
<?php endforeach; ?>
- 
- 
<!-- 次のページへのリンク -->
- 
<a href="<?php echo $this->url($urlparams); ?>">
- 
次へ >
- 
</a>
- 
<?php else: ?>
- 
<span class="disabled">次へ ></span>
- 
<?php endif; ?>
- 
<?php endif; ?>
- 
</div>
ページネーションリンク用のビュースクリプトです。
以前紹介したサンプルとは違い、user_list.phpから受け取った検索文字を
各ページネーションリンクに渡しています。
$this->url()メソッドに配列形式で検索文字を渡すことで、
[配列のキー]=[配列の値]
形式のURLパラメータを付加したURLを返してくれます。
検索文字付きのページネーションも、
ビューヘルパーをいくつか組み合わせるだけで簡単にできますね。
PR
					この記事にコメントする
				
					お知らせ				
				
					最新記事				
				(03/11)
(02/23)
(01/08)
(12/28)
(11/18)
				
					カテゴリー				
				
					プロフィール				
				
HN:
	
shusatoo
性別:
	
男性
自己紹介:
	
				基本PHP。JavaScriptちょっとだけ。Javaをほんの少し。
					最新トラックバック				
				
					カレンダー				
				| 09 | 2025/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 | 
					ブログ内検索				
				
					最古記事				
				(09/18)
(09/23)
(10/01)
(10/09)
(10/10)
				
					カウンター				
				
					アク解アナライズ				
				
					ビジター				
				