CodeIgniterのページングがあまり好きではないので
Paginationクラスを作成してみた。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * Pagination Class * * @package MyNETS2 * @subpackage Libraries * @category Pagination * @author KUNIHARU Tsujioka 2009-07-10 */ class MYNETS_Pagination { private $base_url = ''; // リンクのベースになるURL private $total_rows = ''; // トータルのレコード数 private $per_page = 10; // 1ページに表示する最大レコード数 private $num_links = 2; // リンクに表示させるページ番号数 private $cur_page = 1; // 初期ページ番号 private $first_link = '‹ 最初'; private $next_link = '>'; private $prev_link = '<'; private $last_link = '最後 ›'; private $uri_segment = 3; // URLセグメント内のページ番号の場所 private $full_tag_open = ''; private $full_tag_close = ''; private $first_tag_open = ''; private $first_tag_close = ' '; private $last_tag_open = ' '; private $last_tag_close = ''; private $cur_tag_open = ' <strong>'; // 現在のページ番号での表示コントロール private $cur_tag_close = '</strong>'; private $next_tag_open = ' '; private $next_tag_close = ' '; private $prev_tag_open = ' '; private $prev_tag_close = ''; private $num_tag_open = ' '; private $num_tag_close = ''; private $page_query_string = FALSE; // クエリーパラメータでページ番号を渡すかどうか private $query_string_segment = 'per_page'; // クエリーパラメータでページ番号を渡す際のパラメータ名 private $jumpping = FALSE; // リンク表示でのページをジャンプさせるかスライドさせるか private $num_pages = 1; /** * Constructor * * @access public * @param array initialization parameters */ function __construct($params = array()) { if (count($params) > 0) { $this->initialize($params); } //log_message('debug', "Pagination Class Initialized"); } // -------------------------------------------------------------------- /** * Initialize Preferences * * @access public * @param array initialization parameters * @return void */ function initialize($params = array()) { if (count($params) > 0) { foreach ($params as $key => $val) { if (isset($this->$key)) { $this->$key = $val; } } } } // -------------------------------------------------------------------- /** * Generate the pagination links * * @access public * @return string */ function create_links() { if ($this->total_rows == 0 OR $this->per_page == 0) { return ''; } // トータルのページ数 $this->num_pages = ceil($this->total_rows / $this->per_page); if ($this->num_pages == 1) { return ''; } // セグメントまたはパラメータからページ番号を取得する $CI =& get_instance(); if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { if ($CI->input->get($this->query_string_segment) != 0) { $this->cur_page = $CI->input->get($this->query_string_segment); $this->cur_page = (int) $this->cur_page; } } else { if ($CI->uri->segment($this->uri_segment) != 0) { $this->cur_page = $CI->uri->segment($this->uri_segment); $this->cur_page = (int) $this->cur_page; } } $this->num_links = (int)$this->num_links; // セグメントまたはパラメータのページ番号が数字じゃない場合は0ページとする if ( ! is_numeric($this->cur_page) OR $this->cur_page == 0) { $this->cur_page = 1; } // トータルレコード数より現在のページ番号が大きい場合 // セグメントの値をページ番号にする if ($this->cur_page > $this->num_pages) { $this->cur_page = $this->num_pages; } // base url の生成 if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'='; } else { $this->base_url = rtrim($this->base_url, '/') .'/'; } $output = ''; // 表示ページ数が0の場合、次へ、前へのみのリンクとする // 携帯の場合に使う? if ($this->num_links < 1) { // 最初へのリンクを生成 $output .= $this->_start_link(); // 前へのリンクを生成 $output .= $this->_prev_link(); // 次へのリンクを生成 $output .= $this->_next_link(); // 最後へのリンクを生成 $output .= $this->_last_link(); } else { //最初のリンク $output .= $this->_start_link(); // 前へのリンクを生成 $output .= $this->_prev_link(); // ページ番号リンクの生成 $output .= $this->_generate_page_link(); // 次へのリンクを生成 $output .= $this->_next_link(); // 最期のリンクを作成 $output .= $this->_last_link(); } $output = preg_replace("#([^:])//+#", "\\1/", $output); $output = $this->full_tag_open.$output.$this->full_tag_close; return $output; } // 最初のリンクを生成 private function _start_link() { if ($this->cur_page > $this->num_links) { return $this->first_tag_open .'<a href="'.$this->base_url.'">'.$this->first_link.'</a>' .$this->first_tag_close; } return ''; } // 最後のリンクを生成 private function _last_link() { if (($this->cur_page + $this->num_links) < $this->num_pages) { return $this->last_tag_open .'<a href="'.$this->base_url.$this->num_pages.'">'.$this->last_link.'</a>' .$this->last_tag_close; } return ''; } // 前へのリンクを生成 private function _prev_link() { if ($this->cur_page > 1) { $i = $this->cur_page - 1; if ($i == 0) $i = ''; return $this->prev_tag_open .'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>' .$this->prev_tag_close; } return ''; } // 次へのリンクを生成 private function _next_link() { $tag = ''; if ($this->cur_page < $this->num_pages) { $i = $this->cur_page + 1; $tag = $this->next_tag_open .'<a href="'.$this->base_url.$i.'">'.$this->next_link.'</a>' .$this->next_tag_close; } return $tag; } // ページ番号リンク生成時の最初の頁番号 private function _start_page() { /*if ($this->jumpping) { } else {*/ if (($this->cur_page - $this->num_links) > 0) { return $this->cur_page - $this->num_links; } else { return 1; } /*}*/ } // ページ番号リンク生成時の最後の頁番号 private function _end_page() { /*if ($this->jumpping) { } else {*/ if (($this->cur_page + $this->num_links) < $this->num_pages) { return $this->cur_page + $this->num_links; } else { return $this->num_pages; } /*}*/ } private function _generate_page_link() { $start = $this->_start_page(); $end = $this->_end_page(); $tag = ''; // ページ番号リンクの生成 for ($loop = $start; $loop <= $end; $loop++) { if ($this->cur_page == $loop) { // 現在のページの生成 $tag .= $this->cur_tag_open.$loop.$this->cur_tag_close; } else { $tag .= $this->num_tag_open . '<a href="'.$this->base_url.$loop.'">'.$loop.'</a>' . $this->num_tag_close; } } return $tag; } } // END MYNETS_Pagination Class /* End of file MYNETS_Pagination.php */ /* Location: ./system/mynets/libraries/MYNETS_Pagination.php */
あまりちがいはないですが、CIのページネーションと同じよびだしかた、パラメータで動きます。
ひとつ違うところは、携帯の場合ページ番号を並べるリンクだと、へたしたら数百ページの場合
たいへんなことになるので、
表示するページの前後をいくつにするか、
$num_links
を0にしたら、エラーで戻すのではなく、次へ、前へ、のみを表示し、ページ番号のリンクを生成しないようにしました。
TO DO
JUMP表示を取り入れる。PEARにはあったと思いますが、表示固定でそのページを超えるまではリンクは変わらないってやつです。
いらないかなw
携帯向けに、ページ総数、総レコード数などを見えるようにする、現在のページ番号を取得で来るようにする、というのは入れたいな。