T

Pagerを使ってイケてないコードを書いていた

PEARのPagerは「全件の配列を渡して使う」ものだと思っていた。だから、件数が多いところではちょっと使えないし、PEARのディレクトリのdoc/Pager/examples/Pager_Wrapper.phpもなんだか使うのは勇気がいるなあという感じで、しょうがないから自分たちでなんとかするかと思っていた。

ところが、factoryのマニュアルをよくよく見ると

REQUIRED options are:
fileName IF append==FALSE (default is TRUE)

itemData OR totalItems (if itemData is set, totalItems is overwritten)

と書いてある。つまり、itemDataで全件の配列を渡したいるところは、totalItemsとして件数だけ渡してあげればちゃんとページング処理をやってくれるということだ。もちろん、getPageDataでページ内に表示するためのデータだけ切り出して受け取ることはできないが、GETで受け取るページ番号からOFFSETを設定する。

/* PEAR Pagerのサンプル */
require_once 'lib/Pager/Pager.php';

//1ページ内に表示する項目数
$perPage = 2;

//全件数
$totalItems = 10;

//今のページは?
$currentPage = (integer)$_GET['pagenum'];

//このページ内で表示する項目を取得
//普通はDBからデータを取得したりする
$array = array();
for($i = 1; $i <= $perPage; $i++){//ここは$totalItemsじゃない!
        array_push($array, $i);
}

//Pagerに渡すパラメータ
$params = array(
          'mode' => 'Jumping', //他にSlidingを指定することもできる
          'perPage' => $perPage, //1ページ内に表示する項目の数
          'delta' => $totalItems, //項目の合計
          'totalItems' => $totalItems,
          'urlVar' => 'pagenum', //ページ番号を受け渡す際のGETのパラメータ
//          'itemData' => $array,//使わねえよ
          'currentPage' => $currentPage,
//          'extraVars' => $extra //GETで受け渡す他の値があればここにセット
);

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

foreach($array as $key => $val){
    //do something sweet
}

echo $links['pages'];//ココでナビゲーション機能を表示
//echo $links['back'] . " " . $links['next'];//こんな表示もできる

恥だ恥だ恥だ。

Posted by on 2月 15, 2007 in PHP

コメントを残す