delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

php :: ページ送りするやつ(pager)のクラスをつくった

2009/9/15 (Tue) at 6:54 pm

エントリのアイコン

ながーい行数のデータを複数ページにまたがって表示するときに使うページ番号のリンクナビゲーションをpagerとかpagenationとかいいます。あれがないとページ送りができなくて困ります。非常によく使うものですが、これを自作するのはけっこうめんどくさい!いや、自分でやらなくてもありものがいろいろ出てるわけですが↓

PEAR::Pager (定番!)
jQuery Plugin::PAGINATION (jQueryだからお手軽!)

この度、勉強としてclassを自作してみました。データの総数を引数に渡すと<ul class="pager"><li>xxx</li>...</ul>みたいなhtmlを返します。それをcssでビューティに仕上げて一丁アガリ。引数はデータ総数だけですが、pagerの長さ、1ページに表示する行数、クラス名、クエリ文字列などをオプション指定できます。詳しくは後述。

いちおういっときますが、不肖、私、配列をどーこーするのが苦手です。冗長なコードだと思います。もう少し短くカッコよく書く方法があるんだろうなーと心のざわめきを覚えつつソースを公開しております。なにかありましたら、ツッコミよろしく。デモはこちら↓

http://1-pixel.com/sample/php-pager/sample.php

pagerにはいくつかのパターンがあります。いろんなサイトのpagerを観察すると、似てるけど動作が少し違うところがあったりします。みなさん工夫していらっしゃるのですね。今回のコレは、デモをいぢってもらえればわかりますが、ズラーと並べてみると以下のようなかんじで変化します。ページが進んでいくと、カレントページの前後へのリンクがあることに加え、... をはさんで、そのまたずーっと前のいちばん最初、ずーっと後ろのいちばん最後へのリンクが出ます↓

pager demo

classファイルはこちらから↓

pager.class.php.txt

使い方

pager.class.phpの中に記述されているメンバ変数を書きかえて設定します。以下の変数があります↓

  • public $linksNum = 6; // int, 番号リンクをいくつ表示させるか
  • public $parOnePage = 50; // int, 1ページに表示する行数
  • public $topEnd = 2; // int, 「いちばん最初」「いちばん最後」のところにいくつ表示させるか
  • public $between = '...'; // string, わかりますよね。なんて説明すりゃいいのか。
  • public $prevString = 'PREV'; // string, これもわかるでしょう。
  • public $nextString = 'NEXT'; // string, これもわかる!
  • public $query = 'page'; // string, ページ番号を指定するクエリ文字列
  • public $class = 'pager'; // string, ulタグに入るクラス値

これらを決めたら以下のようにインスタンスをつくりdoIt()というメソッドを呼びます。doIt()に対する必須の引数はひとつだけ。$totalはすべての行数(データ総数)です。

$Pager = new Pager;
$total = 2000; // データ総数
$str = $Pager->doIt($total);

これで、$strにリストタグのhtml文字列が入ります。こんなの↓

<ul class="pager">
  <li><span>1</span></li>
  <li><a href="/sample/php-pager/sample.php?page=2">2</a></li>
  <li><a href="/sample/php-pager/sample.php?page=3">3</a></li>
  <li>...</li>
  <li><a href="/sample/php-pager/sample.php?page=159">159</a></li>
  <li><a href="/sample/php-pager/sample.php?page=160">160</a></li>
  <li><a href="/sample/php-pager/sample.php?page=2">NEXT</a></li>
</ul>

これをechoするなりなんなり。ulタグに'pager'というクラス名がつきます。カレントページだけaタグの代わりにspanが入ります。それを元にcssで装飾します。デモのhtmlソースでcssを見れるんでそちらを参考にどうぞ。生成されるリンクの文字列は以下のようになります↓

(開いているファイルへのパス)?page=(番号)

urlに他のクエリ文字列を含めたいなら第二引数に配列で指定します。こんなかんじで↓

$Pager = new Pager;
$total = 2000;
$query = array(
  'sort' => 'descend',
  'misc' => 'orange',
);
$str = $Pager->doIt($total, $query);

これでやるとurlはこうなります↓

(開いているファイルへのパス)?sort=descend&misc=orange&page=(番号)

※でも、pagerを呼び出したurlにfoo=barナントカのクエリがついてる場合はそのまま引き継がれるので、いちいち指定する必要はないです。

メンバ変数のオプション指定は、いったんキメたらそう変えないもんだと思うんでpager.class.phpに直書きするという仕様にしたのですが、メソッドを呼ぶ度に値を変えたいときがあるかもしれません。そのときはインスタンス作成のときに引数を渡して、メンバ変数を変えることもできます。以下のようにやりますと、$optionsで指定されたものだけ上書きされます↓

$options = array(
  'linksNum' => 10,
  'prevString' => '前へ',
  'nextString' => '次へ',
);
$Pager = new Pager($options);
$total = 2000;
$str = $Pager->doIt($total);

だいたいこんなふうに使います。

あ、mod_rewriteなどを使ってですね、こんなかんじのurlにするパターン↓

http://www.yourdomain.com/pages/11

みたいなヤツには対応してませんので、コレ系でやるならば、doIt()メソッドの後半部分を変える必要があります。

てわけでした。

delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

コメント・プリーズ!

お名前 (your name)
(required)
url
(optional) ※公開されます。
メールアドレス (email)
(optional) ※公開されません。管理者にだけわかります。
コメント (comment)
(required)

※クッキーに保存すると次回から入力を省略できるので便利ですが、お使いのコンピュータに情報が残りますので、公共のパソコンなどからアクセスするような場合はチェックをはずしたほうがよいでしょう。

※コメント中のhtmlタグは実体参照に変換されます。たとえば、『<』は『&lt;』というかんじになりますのでhtmlタグをそのまま書き込んでくださってオッケーです。

one-px-ffffff-tl one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

PROFILEcaption

藤居ヒロヤ。ウェブデザイナー/ウェブディレクター。ウェブデザインオフィス、3OT NET主宰。名古屋市中区。「優しいデザイン」「激しいデザイン」「正しいデザイン」「セクシーなデザイン」「泣けるデザイン」「もっともなデザイン」... 。あなただけのウェブデザインを丹精込めておつくり致します。見積り依頼等、お気軽にお問い合わせ下さい。

お問い合わせフォーム

RECENT ENTRIEScaption

RECENT COMMENTScaption

TOOLScaption

BOOKMARKScaption

RESOURCEScaption

ARCHIVEcaption