大量のデータを複数ページに分割して表示したい場合に便利だというPagerを使ってみた。

ページのナビはパラメータを設定してやればいいだけなので簡単だがデータ表示の部分は自分で作らないといけない。

パラメータを説明しているサイトは結構ありましたが、表示部分のサンプルがまったく無く初心者の自分は結構苦労しました。

肝は開始インデックスの求め方。普通の人なら簡単にわかるのでしょうが自分は大苦戦・・・

苦労の末、やたら長くわかりづらいコードを書いてしまいましたが、PEAR入門 PHP標準ライブラリを極める! にとても素晴らしい開始インデックスの求め方が書いてありました。

開始インデックス=(ページID-1)*表示件数

上記を使って書き直したらかなりすっきりしました。

お隣の情報備忘録のRSSを5件ずつ表示するサンプル

PHP

  1. <?php
  2. class Rss_Display{
  3.  
  4.     var $all_num;
  5.     var $title = array();
  6.     var $link = array();
  7.     var $description = array();
  8.     var $author = array();
  9.     var $category = array();
  10.     var $pubDate = array();
  11.  
  12.  
  13.     function Rss_Display()
  14.     {
  15.         // PEAR RSS.php読み込み
  16.         require_once("XML/RSS.php");
  17.  
  18.         // RSSファイルへのURIをコンストラクタの引数に渡す
  19.         $rss = new XML_RSS("http://www.kantenna.com/info/index.xml");
  20.  
  21.         // RSSファイルをパースする
  22.         $rss->parse();
  23.  
  24.         /**
  25.         * getItemsメソッドを使用して全item要素を2次元配列で取得
  26.         */
  27.  
  28.         $rss = $rss->getItems();
  29.         $this->all_num = sizeof($rss);
  30.         $i=0;
  31.         for($i=0; $i<$this->all_num; $i++){
  32.  
  33.             /**
  34.              * 要素ごとの処理
  35.              * @title タイトル
  36.              * @link リンク先
  37.              * @description 本文
  38.              * @author 著者
  39.              * @category カテゴリー
  40.              * @pubDate 日付
  41.              */
  42.             $this->title[$i] = mb_convert_encoding(strip_tags($rss[$i]["title"]), $code);
  43.             $this->link[$i] = htmlspecialchars($rss[$i]["link"]);
  44.             $this->description[$i] = mb_convert_encoding(strip_tags($rss[$i]["description"]), $code);
  45.             $this->author[$i] = mb_convert_encoding(strip_tags($rss[$i]["author"]), $code);
  46.             $this->category[$i] = mb_convert_encoding(strip_tags($rss[$i]["category"]), $code);
  47.             $this->pubDate[$i] = date("Y/m/d", strtotime($rss[$i]["pubdate"]));
  48.  
  49.         }
  50.     }
  51. }
  52.  
  53. require_once("Pager/Pager.php");
  54.  
  55. // RSSフィードを取得
  56. $rss = new Rss_Display();
  57.  
  58. // 1ページの表示件数
  59. $perPage = 5;
  60.  
  61. // Pagerに渡すパラメータの設定
  62. $param = array(
  63.                 "perPage" => $perPage, //1ページのデータ数
  64.                 "totalItems" => $rss->all_num, //総データ件数
  65.                 );
  66.  
  67. // オブジェクト生成
  68. $pager = Pager::factory($param);
  69.  
  70. // ナビゲーション取得
  71. $navi = $pager->getLinks();
  72.  
  73. //現在ページのID
  74. $pID = $pager->getCurrentPageID();
  75.  
  76. //開始インデックス
  77. $index = ($pID - 1) * $perPage;
  78.  
  79.  
  80. for($i=$index; $i<$index+$perPage; $i++){
  81. echo "<dl>";
  82. print <<< RSS
  83. <dt class="pub">{$rss->pubDate[$i]}</dt>
  84. <dt><a href="{$rss->link[$i]}">{$rss->title[$i]}</a></dt>
  85. <dd>{$rss->description[$i]}</dd>
  86. RSS;
  87. echo "</dl>";
  88. }
  89.  
  90. // ナビ表示
  91. print($navi["all"]);
  92. ?>

※Rss_Display()はRSSフィードを要素ごとに配列で取得する自作クラス

実行結果


Warning: require_once(XML/RSS.php): failed to open stream: No such file or directory in /home/users/1/lolipop.jp-dp07173486/web/_/themes/default/views/pg/2007/05/pearpager_1.php on line 184

Fatal error: require_once(): Failed opening required 'XML/RSS.php' (include_path='/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Archive_Tar:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Calendar:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Console_Getopt:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Net_UserAgent_Detect:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Net_UserAgent_Mobile:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/PEAR:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Structures_Graph:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/Text_Highlighter:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/XML_Parser:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear-pear.php.net/XML_Util:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear/archive_tar:/home/users/1/lolipop.jp-dp07173486/web/_/vendor/pear/console_getopt:/home/users/1 in /home/users/1/lolipop.jp-dp07173486/web/_/themes/default/views/pg/2007/05/pearpager_1.php on line 184