- ベストアンサー
PEAR::Pagerのページ番号の変更
現在Pagerを使ってページ間のリンクを作成しています。 通常ページ番号は 1 2 3 ・・・ と表示されますが、これを 1-100 101-200 201-300 ・・・ という表示に変える事は可能でしょうか。 ご存知の方いらっしゃいましたら教えて下さい。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
PEARモジュールを改修する方法としては、 PEAR/Pager/Jumping.php をエディタで開いて、 ▼編集前 for ($i=$limits[0]; $i<=min($limits[1], $this->_totalPages); $i++) { if ($i != $this->_currentPage) { $this->range[$i] = false; $this->_linkData[$this->_urlVar] = $i; $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i); } else { $this->range[$i] = true; $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost; } $links .= $this->_spacesBefore . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : ''); } return $links; } ▼編集後 for ($i=$limits[0]; $i<=min($limits[1], $this->_totalPages); $i++) { $page_tx = ($i - 1) * $this->_perPage + 1 . '-' . $i * $this->_perPage; // 追加行 if ($i != $this->_currentPage) { $this->range[$i] = false; $this->_linkData[$this->_urlVar] = $i; $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $page_tx); } else { $this->range[$i] = true; $links .= $this->_curPageSpanPre . $page_tx . $this->_curPageSpanPost; // $iを$page_txに修正 } $links .= $this->_spacesBefore . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : ''); } return $links; } と3か所修正するだけでできます。 ですが、他でもPagerを使用する場合は、 改修したセットを別フォルダにしたほうがよいかもしれません。 また、受け取ったPHP側で実現するには、 ベタな方法しかありません。 // $navi_allにpagerの結果($navi['all'])を代入 $navi_all = $navi['all']; for($i=1;$i<10;$i++){ // $navi_all内を1~10までループ $first = ($i - 1) * $perPage + 1; // 開始数 $last = $i * $perPage; // 終了数 $regexp = ">{$i}</a>"; // ページリンクのマッチ文字列を生成 $num = ">" . $first . "-" . $last . "</a>"; // 置換文字列を生成 $navi_all = str_replace($regexp, $num, $navi_all); // マッチ文字列を置換 $regexp = " {$i} "; // 現在ページのマッチ文字列を生成 $num = " " . $first . "-" . $last . " "; // 現在ページの置換文字列を生成 $navi_all = str_replace($regexp, $num, $navi_all); // マッチ文字列を置換 } print($navi_all."<br/>\n"); もっと効率的な書き方もあるかと思いますが、 例えば、このような置換処理をすることになるかと思います。
お礼
回答どうもありがとうございます。 実は週末に解決してしまったのですが、頂いた回答も参考にさせて頂きました。 Pagerは複数箇所で使用しているため、PHP側で処理するようにしています。 回答の「$perPage 」の参照の仕方がイマイチ解らなかったのですが、 $perPage ⇒ 100 と書き換えたらうまくいきました。 ちなみに下記の方法でもうまく行きました。↓↓ function getPage($matches){ $w_page = trim($matches[0], '<>'); $start = $pager->perPage*($cp-1)+1; $end = $pager->perPage*$cp; return '>'.start .'-'.$end.'<'; } $links['all'] = preg_replace_callback('/>[1-9]+</', 'getPage', $links['all']); Pager側の変更もとても参考になりました。 詳しい解説をありがとうございました。