自分なりの目線で情報を発信します。
×
[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をほんの少し。
最新トラックバック
カレンダー
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)
カウンター
アク解アナライズ
ビジター