WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

PEAR::Pager – 大きなデータをページング処理で分割する

      2012/12/14

PEAR::Pagerとは?

掲示板などの大きなデータを一気に1ページで表示すると、ページが非常に長くなってしまいます。
そのような大きなデータを持つページを何ページかに分けて表示することをページング処理といいます。

例えば、検索エンジンの検索結果もページング処理がされています。
PEAR::PagerはPHPでそのようなページング処理を行うためのライブラリです。

PEAR::Pagerのインストール

pear list コマンドでインストール済みのライブラリを確認できます。
その一覧の中に Pager がない場合は下記コマンドでインストールを実行します。

# pear install pager

Pagerの使い方

テストスクリプト

下記のテストスクリプトを使って Pager の挙動を確認してみましょう。

test4pager.php
<?php
require_once("Pager/Pager.php");    // ライブラリの読み込み

// ページングの対象となるアイテムの配列を定義
for ($i = 1; $i <= 1000; $i++) {
    $items&#91;$i&#93;&#91;'title'&#93; = $i . "番目のタイトル";
    $items&#91;$i&#93;&#91;'content'&#93; = $i . "番目の本文";
}

// パラメータを定義
$params = array(
    "itemData" => $items,
    "perPage" => 20,
    "delta" => 10,
    "firstPagePre"=> "{",
    "firstPageText"=> "最初",
    "firstPagePost"=> "}",
    "lastPagePre"=> "{",
    "lastPageText"=> "最後",
    "lastPagePost"=> "}",
);

// ページング情報の取得
$pager = Pager::factory($params);    //上記で定義したパラメータを引数にインスタンスを生成
$navi = $pager->getLinks();    // ナビゲーションリンクを取得
$scope = $pager->getOffsetByPageId();// オフセットの取得
$data = $pager->getPageData();// 現在のページのデータを取得

// 以下HTML出力部分
echo "{$navi['all']}<br />\n";
echo $pager->numItems() . "件中<br />\n";
echo $scope['0'] . "件目から" . $scope['1'] . "件目を表示 <br/>\n";
echo "<table>\n";
foreach ($data as $key => $value) {
    echo "<tr><th>{$value['title']}</th><td>{$value['content']}</td></tr>\n";
}
echo "</table>\n";
echo "{$navi['all']}<br />\n";

パラメータの解説

テストスクリプトで factoryメソッド を実行してインスタンスを生成する際にいくつかパラメータを渡していましたが、それらの意味は下記の様になります。

itemData [array] ページング処理の対象となるアイテムの配列
totalItems [integer] ページング処理の対象となるアイテムの数
perPage [integer] 1ページ辺りに表示するアイテム数
delta [integer] 現在のページの前後に表示するページ番号の数
prevImg [string] 前のページへのリンクテキスト。imgタグも利用可能
nextImg [string] 次のページへのリンクテキスト。imgタグも利用可能
firstPagePre [string] 最初のページ番号の前の文字
firstPageText [string] 最初のページ番号を表すテキスト
firstPagePost [string] 最初のページ番号の後の文字
lastPagePre [string] 最後のページ番号の前の文字
lastPageText [string] 最後のページ番号を表すテキスト
lastPagePost [string] 最後のページ番号の後の文字

上記は一部に過ぎません。さらに詳しく見たい場合は公式マニュアル(下記URL)が参考になります。
http://pear.php.net/manual/ja/package.html.pager.factory.php

メソッドの解説

Pager によって生成されたナビゲーションリンクは getLinksメソッド で取得することができます。

Pager::getLinks()
array Pager::getLinks ([integer $pageID = NULL])
引数 : $pageID (ページIDを指定する。省略可能。デフォルト値は現在のページID)
返り値 : 連想配列で「戻る/次/最初/最後のリンクとページリンク」をそれぞれ返す

getLinksメソッド は連想配列で「戻る/次/最初/最後のリンクとページリンク」をそれぞれ返します。下表に大まかにまとめます。

キー 内容
back 前ページへのリンク
next 次ページへのリンク
first 最初のページへのリンク
last 最後のページへのリンク
pages 各ページへのリンク一覧
all 全ての要素(順序はfirst/back/pages/next/last)

また、アイテム数やページ数などの情報を取得するための下記の様なメソッドが用意されています。

array getPageData(int $pageID=NULL) 現在のページデータを配列で返す
array getOffsetByPageId(int $pageID=NULL) オフセットを配列で返す(例えば、pageID が1で perPage 制限が10の場合、(1, 10)を返す)
int numItems() アイテムの総数を返す
int numPages() ページの総数を返す
bool isFirstPage() 最初のページの場合は真を、そうでない場合は偽を返す
bool isLastPage() 最後のページの場合は真を、そうでない場合は偽を返す

 - PEAR , , ,