Webアプリケーションではページングの処理を行うことがよくありますが、実際にこの仕組みを作るには少々手間がかかるので、この処理を肩代わりしてくれるライブラリがほしいところです。
この手のライブラリは、PHPではPEAR::Pagerが有名かと思います。
簡単な例
とりあえず、使ってみましょう。(動作確認したVersionは2.4.4です)
require_once('Pager/Pager.php');
$params = array(
'mode' => 'sliding',
'delta' => 5,
'perPage' => 5,
'prevImg' => '<<',
'nextImg' => '>>',
'totalItems' => '1000'
);
$pager =& Pager::factory($params);
echo $pager->links;
上記のphpスクリプトをブラウザで表示すると、以下のように表示されます。
8ページ目に移動してみます。
表示するページ番号などもちゃんと変更されていて、前のページへのリンク(<<)もついています。とても便利です。しかし、ちょっと生成されるリンクテキストをよく見てみましょう。
[最初のページ] 前のページ n~m番目のページ 次のページ [最後のページ]
という順にならんでいます。もしかしたら、人によっては↓のように並んでいる方がわかりやすいかもしれません。
PEAR::Pagerでは最初にインスタンスを生成する際にいろんなオプションを指定できるのですが、この並び順を入れ替えるオプションはありません。(多分)
でも、どうにかして順番を入れ替えたいので、うまい方法を探してみましょう。
PEAR::Pagerのソースを読んでみる
PEAR::Pagerのソースを読んでみると、Parger.phpのほかにCommon.php、HtmlWidgets.php、Jumping.php、Sliding.phpなどがあります。Common.phpはファイル名が抽象的なのに対して、ほかのファイル名はより具体的です。また、PEAR::Pagerはページングのためのライブラリです。よって、コアとなる処理はCommon.phpにあると考えられます。そして、そのままCommon.phpを眺めていくと、buildという関数があります。
function build()
{
//reset
$this->_pageData = array();
$this->links = '';
$this->_generatePageData();
$this->_setFirstLastText();
if ($this->_totalPages > (2 * $this->_delta + 1)) {
$this->links .= $this->_printFirstPage();
}
$this->links .= $this->_getBackLink();
$this->links .= $this->_getPageLinks();
$this->links .= $this->_getNextLink();
$this->linkTags .= $this->_getFirstLinkTag();
$this->linkTags .= $this->_getPrevLinkTag();
$this->linkTags .= $this->_getNextLinkTag();
$this->linkTags .= $this->_getLastLinkTag();
if ($this->_totalPages > (2 * $this->_delta + 1)) {
$this->links .= $this->_printLastPage();
}
}linksという変数にgetにょろにょろLinksという関数の値をどんどん連結していってるところを見ると、これがリンクテキストを生成している部分だと想像できます。そして、_printFirstPage関数が呼ばれた後に_getBackLink関数が呼ばれていて、また、_getNextLink関数の後に_printLastPage関数が呼ばれているのが確認できます。ということはこの順序を入れ替えてやればうまくいきそうです。
書き換え後のbuild関数
function build()
{
//reset
$this->_pageData = array();
$this->links = '';
$this->_generatePageData();
$this->_setFirstLastText();
$this->links .= $this->_getBackLink();
if ($this->_totalPages > (2 * $this->_delta + 1)) {
$this->links .= $this->_printFirstPage();
}
$this->links .= $this->_getPageLinks();
$this->linkTags .= $this->_getFirstLinkTag();
$this->linkTags .= $this->_getPrevLinkTag();
$this->linkTags .= $this->_getNextLinkTag();
$this->linkTags .= $this->_getLastLinkTag();
if ($this->_totalPages > (2 * $this->_delta + 1)) {
$this->links .= $this->_printLastPage();
}
$this->links .= $this->_getNextLink();
}これでリンクを並び替えることができます。