about paging of codeaigniter
TRANSCRIPT
CodeIgniterのページネーションについて
@simultechnology
/shop_ci/system/libraries/Pagination.php
ページネーションクラスの場所
CI_Pagination
ページネーションクラスのクラス名
実際のソース:class CI_Pagination {
var $base_url = ''; // The page we are linking tovar $total_rows = ''; // Total number of items (database results). . .
ページネーションクラスの公開メソッド
メソッドは2つだけなので、非常に。
●initialize($params = array())初期化用。引数に設定条件の配列。
●create_links()リンクの文字列を生成し、返します。
ページネーションクラスの使い方①
コントローラ内でロードします。
$this->load->library('pagination');
ページネーションクラスの使い方②
ロードした後、設定値を設定します。以下の3項目は必須。
$config['base_url'] = 'http://example.com/index.php/test/page/';// ベースなるURL$config['total_rows'] = '200'; // 総件数$config['per_page'] = '20'; // 1ページあたりの件数
ページネーションクラスの使い方③
以下の項目も設定した方がいいかも。
デフォルトは「2」$config['num_links'] = 2;
個人的に「5」くらいがいいかも。「5」だとこんな感じです。
< 1 2 3 4 5 6 7 8 9 10 11 > Last ›現在ページから左右に5個リンクができます。
ページネーションクラスの使い方④
設定後、initializeメソッドを呼び出します。
$this->pagination->initialize($config);
ページネーションクラスの使い方⑤
最後に、initializeメソッドを呼び出します。
$link = $this->pagination->create_links();
戻り値の$linkはページネーションの文字列なので、これを画面に渡せば、OK!
VIEWでのページネーション①
画面ではこんな感じ。
base_urlがhogeコントローラのsearchメソッドだとすると…
「1」のリンク -> /CodeIgniter/hoge/search/「2」のリンク -> /CodeIgniter/hoge/search/20「3」のリンク -> /CodeIgniter/hoge/search/40「11」のリンク -> /CodeIgniter/hoge/search/200
VIEWでのページネーション②
つまり、、
VIEWでのページネーション③
リンクの数字が「1つ」増えると、コントローラで設定した1ページあたりの件数分だけ、増えている!!
「1」のリンク -> /CodeIgniter/hoge/search/「2」のリンク -> /CodeIgniter/hoge/search/20「3」のリンク -> /CodeIgniter/hoge/search/40「11」のリンク -> /CodeIgniter/hoge/search/200
VIEWでのページネーション④
URLの引数はコントローラで取得できます。
つまり、次の場合「2」のリンク -> /CodeIgniter/hoge/search/20
hogeコントローラのsearchメソッドではこんな感じ。public function search($param = 0){// $paramは20。(引数の数字がない場合は0が設定される)
ページネーションとDB①
ところで、、、
オフセットって知ってますか?
ページネーションとDB②
ぐぐったら、一番最初に以下が表示されました。
オフセットとは、あるデータの位置を、基準点からの差(距離)で表した値のこと。「offset」は英語で「差し引き計算する」という意味で、そこから転じて、必要なデータの位置を基準点からの差(距離)で表した値のことをオフセットと呼んでいる。
オフセットとは 【offset】 - 意味/解説/説明/定義 : IT用語辞典
ページネーションとDB③
何やら、小難しい説明だけど、、、
「必要なデータの位置の基準点からの差」
「0」が基準点で、「オフセット = 20」で「20」の差があるとすると、次は「21」番目、だよねっ??
ページネーションとDB④
20番目まで、次のページが21番目から40番目まで、次のページが41番目から60番目まで、次のページが61番目から80番目まで、次のページが101番目から120番目まで、、、
羊を100匹数えるみたいな気分になります(汗)
要するに、上のようなデータをとればいいんですね?
ページネーションとDB⑤
最初の20番目までのレコードを取得するにはSELECT * FROM tbl LIMIT 20;
21番目から40番目までのレコードを取得するには
SELECT * FROM tbl LIMIT 20,20;
これは以下のように読めます。オフセット番目から、20件分(->1ページあたりの件数)
ページネーションとDB⑥
CodeIgniterでのLIMIT句を使うとこんな感じです。
// LIMIT句の生成$this->db->limit($per_page, $offset);※$per_pageは1ページあたりの件数
// クエリ実行。$query = $this->db->get('t_shop_item');
ページネーションとDB⑦
ページネーションの総件数の設定はこうでした。$config['total_rows'] = 'XXX'; // 総件数
これはデータベースのcount分で取得します。
$count = $this->db->count_all_results('t_shop_item');
戻り値が表示総件数です。
まとめ
$this->db->limit($per_page, $offset);で、
$per_page(1ページあたりの件数)はコントローラで設定(画面から入力される場合もあるけど)$offsetは画面のページネーションのリンクからgetメソッドで渡される。ページネーションの総件数はcount文で取得。
ページネーションとDBはとっても密接な関係!!
まとめ②
以下が参考のリンクです。
CodeIgniter ユーザガイド 日本語版 Version 1.7.2
http://codeigniter.jp/user_guide_ja/libraries/pagination.html