Pear::Pagerが簡単で便利!MDB2と連携してみた。

Googleの検索結果のように、たくさんあるデータを複数ページで表示したいことってよくあると思います。
そうしたページ送りの機能を自分で実装しようとすると、できないことはないのですが、意外と面倒くさく感じるものです。
まさにそうした面倒な作業から開放してくれるのがPear::Pagerです。

Pagerの使い方自体はたくさんサイトがあるので、そちらを参照してください。
ここでは同じくPearで提供されているMDB2と連携する方法について触れています。
MDB2はDBに接続するためのAPIでです。

Pagerで設定できるOption一覧はこちらのサイトが充実していて見やすかったです。
Pagerクラスのオブジェクトの作成

Pagerをインストールすると「PEAR/docs/Pager/examples/Pager_Wrapper.php」というファイルが見つかると思います。
このPager_Wrapper.phpを「PEAR/Pager/」にコピーします。

Pager_Wrapper.php内には様々なDB接続手段に対応するWrapper Functionが用意されています。
例えば今回使うMDB2に対応したFunctionは次の通り
[php]function Pager_Wrapper_MDB2(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = MDB2_FETCHMODE_ASSOC)
{
if (!array_key_exists(‘totalItems’, $pager_options)) {
//be smart and try to guess the total number of records
//rewriteCountQuery内でクエリにLimitなどを追加してくれるので
//大量のデータでもDBへの負荷は少なそうです。
if ($countQuery = rewriteCountQuery($query)) {
$totalItems = $db->queryOne($countQuery);
if (PEAR::isError($totalItems)) {
return $totalItems;
}
} else {
//GROUP BY => fetch the whole resultset and count the rows returned
$res =& $db->queryCol($query);
if (PEAR::isError($res)) {
return $res;
}
$totalItems = count($res);
}
$pager_options[‘totalItems’] = $totalItems;
}
require_once ‘Pager/Pager.php’;
$pager = Pager::factory($pager_options);

$page = array();
$page[‘links’] = $pager->links;
$page[‘totalItems’] = $pager_options[‘totalItems’];
$page[‘page_numbers’] = array(
‘current’ => $pager->getCurrentPageID(),
‘total’ => $pager->numPages()
);
list($page[‘from’], $page[‘to’]) = $pager->getOffsetByPageId();
$page[‘limit’] = $page[‘to’] – $page[‘from’] +1;
if (!$disabled) {
$db->setLimit($pager_options[‘perPage’], $page[‘from’]-1);
}
$page[‘data’] = $db->queryAll($query, null, $fetchMode);
if (PEAR::isError($page[‘data’])) {
return $page[‘data’];
}
if ($disabled) {
$page[‘links’] = ”;
$page[‘page_numbers’] = array(
‘current’ => 1,
‘total’ => 1
);
}
return $page;
}
[/php]

Pagerを使うページはこんな感じ
[php]// Pager_Wrapper.php内でPager/Pager.phpを呼び出しているので
//ここではWrapperファイルだけを呼び出せばOKです。
require_once(“Pager/Pager_Wrapper.php”);

//表示したいデータを呼び出すクエリ
$Query = “SELECT * FROM hogehoge”;

//Pagerのオプション
$Options = array(
‘perPage’ => 5,
‘delta’ => 3,
‘currentPage’ => $_GET[‘p’],
‘mode’ => ‘Sliding’,
‘linkClass’ => ‘Links’,
‘urlVar’ => ‘p’,
‘curPageLinkClassName’ => ‘NowLink’,
‘separator’ => ”,
‘spacesBeforeSeparator’ => 0,
‘spacesAfterSeparator’ => 0,
‘prevImg’ => ‘≪前へ’,
‘nextImg’ => ‘次へ≫’,
‘firstPagePre’ => ‘≪≪’,
‘firstPageText’ => ‘先頭’,
‘firstPagePost’ => ”,
‘lastPagePre’ => ”,
‘lastPageText’ => ‘最後’,
‘lastPagePost’ => ‘≫≫’
);

//Wrapper Functionを呼び出す。
//Pager_Wrapper_MDB2の引数は
/**
* @param object PEAR::MDB2 instance
* @param string db query
* @param array PEAR::Pager options
* @param boolean Disable pagination (get all results)
* @param integer fetch mode constant
* @return array with links and paged data
*/

//$PagerDataには総件数、総ページ数、現在のページ、表示するデータなどが配列の形で帰ってきます。
$PageData = Pager_Wrapper_MDB2($db, $Query, $Options);
[/php]

表示するHTML
[html]


[/html]

生成されるリンクのデザインは、こちらのサイトを参考にさせて頂きました。
ページ送りのサンプル色々です。

ここから少し修正を加え
[css].Pager {
margin:15px 0 10px 0;
}
.NowLink, .Links {
margin:0 2px;
padding:5px 13px;
background: #eeeff7;
text-decoration:none;
vertical-align:middle;
}
.Links a:hover{
color:#000;
background:#ccf;
border-color:#00f;
}
[/css]

完成したリンク部分はこうなります。

スポンサーリンク

シェアする

スポンサーリンク