以前、DB_Pagerの使い方というので記事を書いたけれど、実はDB_Pager 自体がそうとう古く、メンテもされてないので、これからは
PEAR :: Package :: Pager
使うのが吉。
ということで、早速、使い方を調べて、制作中のアプリに組み込んでみました。
$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は日本語訳マニュアルには載ってないので要注意。要するに、ページ番号以外に付与するデータ。
ここでは、googleのように、"q"に、URLエンコードした検索ワードを入れている。
他にもいろいろ便利なオプションがあって、DB_Pagerより高機能になっている。おすすめ★★★★★
コメント (1)
初心者ですいませんが、tenapaと申します、pagerを検索していたら、このサイトにたどり着きました。偶然ですが、小生も今泉在住で、まもなく還暦を向かえます。現在php+mysqlを勉強中の初心者ですが、ページングがうまく行きません、
環境はxp:apache:php5,mysql4でPagerを導入済みです。
不明点は、sqlでselectした$sql = "select count(*) as cnt from board" . $where;とpagerとの連動です。
マニュアルを見て色々試しまが巧くいきません。itemData'との連動はどの様すればいいのでしょうか?
初心者ですいませんが、ご指導いただけまっせんか!
投稿者: tenapa | 2006年05月26日 07:19
日時: 2006年05月26日 07:19