« タモリ倶楽部 | メイン | ユニバーサル機能 »

Pear::Pagerの使い方

以前、DB_Pagerの使い方というので記事を書いたけれど、実はDB_Pager 自体がそうとう古く、メンテもされてないので、これからは
PEAR :: Package :: Pager
使うのが吉。

ということで、早速、使い方を調べて、制作中のアプリに組み込んでみました。

require_once "Pager/Pager.php";

$db = DB_DataObject::factory("tableName");

$db->find();

while($db->fetch()){
$html[] = $db->toArray();
}

$params = array(
'mode' => 'sliding',
'perPage' => 20,
'delta' => 5,
'urlVar' => 'start',
'currentPage' => $start,
'spacesBeforeSeparator' => 1,
'spacesAfterSeparator' => 1,
'clearIfVoid' => false,
'totalItems' => $db->count(),
'extraVars' => array('q' => urlencode($q)),
);

$pager = & Pager::factory($params);
$links = $pager->getLinks();


※PCの前のよい子は、ちゃんとエラー処理いれてね!

DB_DataObjectとかAuthでもありがちは、まずオプションの設定。
詳しい説明は、PEAR :: Manual :: Pager::factoryを見たら日本語訳があるので、まぁ、わかると思う。

特に今回僕が注意したところだけをピックアップして説明。

"urlVar" デフォルトは、pageIDだが、googleに習って"start"にする。
ページ番号が1,2,3,4となれば、デフォルトのリンクが、
hoge.php?start=1
hoge.php?start=2
hoge.php?start=3
hoge.php?start=5
となる。

Pagerの使い方として、DBなどから読み出したデータの配列をぼっこり渡して、必要な分だけを、ページ情報と一緒に返してもらうってのもありなんだけれど、通常、DBから読み出す場合は、Limitなどを付けて、必要な分だけをもらってくる。

なので、Pagerにも、Limitと連動して、現在が何ページめという情報を渡してやらないといえけない。
そこで、全データが150件あるとし、一回で20件毎表示、(その場合、8ページ分のリンクが表示される)
の場合、LIMITの記述は、
1ページ目:LIMIT 0,20
2ページ目:LIMIT 20,20
3ページ目:LIMIT 40,20
:
実際のリンクは、
1ページ目:start=1
2ページ目:start=2
3ページ目:start=3
となる。

currentPageに指定している$startは、GETリクエストのstartを入れており、SQLのLIMITは、(start - 1) * 1ページ表示数で、計算するようにしている。

で、だいたいページャを使うのは検索結果と相場は決まっているが、検索結果の場合、単にページ番号だけでは、リンク時の情報としては不十分。
検索の元となるキーワードや、その他カテゴリなどが必要。
デフォルトではそれらのパラメータは無視されるので、ページャのリンクに付与するには、

'extraVars' => array('q' => urlencode($q))

みたいな感じで、オプションを設定する。extraVarsは日本語訳マニュアルには載ってないので要注意。要するに、ページ番号以外に付与するデータ。
ここでは、googleのように、"q"に、URLエンコードした検索ワードを入れている。

hoge.php?start=2&q=%E3%83%9B%E3%82%B2
みたいなぁー。


他にもいろいろ便利なオプションがあって、DB_Pagerより高機能になっている。おすすめ★★★★★

トラックバック

このエントリーのトラックバックURL:
http://www.ironhearts.com/diary/mt-tb-ih.cgi/509

コメント (1)

tenapa:

初心者ですいませんが、tenapaと申します、pagerを検索していたら、このサイトにたどり着きました。偶然ですが、小生も今泉在住で、まもなく還暦を向かえます。現在php+mysqlを勉強中の初心者ですが、ページングがうまく行きません、
環境はxp:apache:php5,mysql4でPagerを導入済みです。
不明点は、sqlでselectした$sql = "select count(*) as cnt from board" . $where;とpagerとの連動です。
マニュアルを見て色々試しまが巧くいきません。itemData'との連動はどの様すればいいのでしょうか?
初心者ですいませんが、ご指導いただけまっせんか!

コメントを投稿

2008年07月

    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    

最近のコメント

う〜ん・・・ on 素朴な疑問: にょうをした、きたな
困ってました on ATOKとIME2005が勝手に切り替わる問題: 何故か勝手に切り替わ
go on 日々の記録: 4600C、同じ症状
Masatoru on 日々の記録: このサイトのおかげで
yy on 日々の記録: はじめまして。 昨日
ひろまま on 日々の記録: はじめまして。 私も
いきあん on 日々の記録: ANN様・皆様 46
ゅーーーーヵ on 目がテン/ドッヂボール: とれるように、なりま
通行人 on ATOK17の省入力候補を削除する方法: 省入力候補削除方法を
taka on 日々の記録: 4600Cを使ってい

アーカイブ