CodeIgniterの学習 19 - 一覧画面にページリンクを設置してみる(ページネーションクラスの使用)
今日は一覧画面のページネーションを試してみることにする。
マニュアルのページネーションクラスの説明を見ながら、タスクリストに組み込んでみる。
試してみると特に難しくなくあっけなく出来た。すばらしい。
今日は変更した部分のみ載せる。
元ソースは昨日のエントリ http://d.hatena.ne.jp/dix3/20081009/1223487950 (簡単のためモデルは使っていない)
1)コントローラ:application/controllers/tasklist.php
変更点:
1)index() は page() を呼び出すだけにした
index()は、page(0) を呼び出している。
ページ切り替えリンクの遷移先URLは、 /tasklist/page/オフセット である。
(たとえば3ページ目に遷移するURLは<a href="/tasklist/page/10">3</a>が生成され、tasklistコントローラのpage(10)が呼ばれる。page/以下のパラメータが、pageメソッドの引数になる)
2)クエリのlimit の設定
遷移すると、オフセットが引数でpage($offset)に渡ってくるので、
$this -> db -> limit( $limit, $offset );と指定して、
SELECT * FROM (`tasklist`) LIMIT $offset , $limitが呼ばれるようにしている。
3)トータルページ数算出用にトータルレコード数を取得
トータルレコード数を
$totalRows = $this -> db -> count_all( 'tasklist' );で取得している。
4)ページネーションクラスの読み込み
_setPage($limit, $totalRows)で、ページネーションの見え方を調整し、ページリンクのタグを生成して戻している。
引数で、1ページあたりの行数と、トータルレコード数を渡している。
application/controllers/tasklist.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); // タスクリストというかいろいろ実験 class Tasklist extends Controller { // コンストラクタ function Tasklist() { parent :: Controller(); // ログイン認証、ログインしてなければログイン画面に飛ばされる // $this -> freakauth_light -> check(); // 開発中はscaffoldingを有効に //if ( config_item( 'my_debugger' ) ) { // $this -> load -> scaffolding( 'tasklist' ); // テーブル名とクラス名は同じでなくてもいい //} // urlヘルパ $this -> load -> helper( 'url' ); // フォームヘルパ $this -> load -> helper( 'form' ); // モデルの読み込み todo:後でモデルに寄せる // $this -> load -> model( 'tasklist_mdl' ); } // デフォルトインデックス function index() { $this -> page( 0 ); //indexは page(0)の扱い } function page( $offset = 0 ) { // HTML テーブルクラスを使ってみる $this -> load -> library( 'table' ); $limit = 5; //1ページあたりの最大行数 // 全行数のカウントを先に取得(ページネーション用) $totalRows = $this -> db -> count_all( 'tasklist' ); //変なパラメータを直接書かれた時用 $offset = is_numeric($offset) ? (int) $offset : 0 ; // 全行数よりもオフセットが多い時の対策(ページ番号直接指定時) $offset = ( ( int ) $totalRows < $offset ) ? (int) $totalRows - $limit : $offset; // データ取得のリミットとオフセット $this -> db -> limit( $limit, $offset ); // データ取得 $q = $this -> db -> get( 'tasklist' ); // テーブルのヘッダ $this -> table -> set_heading( 'id', '済', 'タスク名', '内容', '完了予定日', '期限' ); // テーブルの生成 foreach ( $q -> result() as $row ) { $this -> table -> add_row( $row -> id , form_checkbox( 'done', 'true' ), $row -> title , $row -> note , $row -> target_date , $row -> limit_date ) ; } // ページネーションの生成 $data['pagination'] = $this -> _setPage( $limit, $totalRows ); // テーブルの生成 $data['tblList'] = $this -> table -> generate(); // ビューの生成 $this -> _setTpl( "tasklist_index" , $data ); } function _setPage( $limit, $totalRows ) { // ページネーションクラスの読み込み // configはconfig/pagination.phpにプリセットすることも出来るらしい $this -> load -> library( 'pagination' ); $config['full_tag_open'] = '<p class="pagination">'; $config['full_tag_close'] = '</p>'; $config['first_link'] = '最初へ'; $config['last_link'] = '最後へ'; $config['prev_link'] = '< 前へ'; $config['next_link'] = '次へ >'; $config['base_url'] = '/tasklist/page/'; //遷移先URL $config['total_rows'] = $totalRows ; //全行数 $config['per_page'] = $limit; //1ページあたりの行数 $this -> pagination -> initialize( $config ); return $this -> pagination -> create_links(); } // ビューの生成 一カ所にまとめた function _setTpl( $viewName, $data = array() ) { // 大枠のテンプレート側の変数(ヘッダ部分のタイトルと、xajax用javascriptタグ) $tpl["page_title"] = "タスクリストにようこそ"; // タスクリスト(実験ソース)のテンプレートにデータをセット $tpl["main_content"] = $this -> load -> view( $viewName, $data , true ); // 大枠のテンプレートに、タスクリストのビューをはめ込む $this -> load -> view( 'base_view', $tpl ); } } //Endofclass /** * タスクリストのテーブル、適当なので後で、完了日時とかユーザーidとか項目を追加 * CREATE TABLE tasklist ( * id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, * user_name VARCHAR(128) NULL, * title VARCHAR(255) NULL, * note TEXT NULL, * target_date DATETIME NULL, * limit_date DATETIME NULL, * del_flg INTEGER NOT NULL DEFAULT '0', * created timestamp NULL DEFAULT CURRENT_TIMESTAMP, * modified timestamp NULL DEFAULT '0000-00-00 00:00:00', * PRIMARY KEY(id), * INDEX idx_tasklist_id(id), * INDEX idx_tasklist_tdate(target_date), * INDEX idx_tasklist_ldate(limit_date) * ); */ /** * End of file tasklist.php */ /** * Location: ./application/controllers/tasklist.php */ ?>
2)ビュー(中身):application/views/tasklist_index.php
$paginationを追加<h2>タスクリスト</h2> <?= $pagination ?> <?= $tblList ?> <?= $pagination ?>
css : ドキュメントルート/css/style.css
昨日からの差分のみp.pagination{ margin:3px 0; padding:0; } .pagination a , .pagination b{ margin-left:2px; }
画面
いい感じ。簡単にページ切り替えリンクができたよん。
さて明日は何試そうかな。
今日やる予定だった登録画面を作るかな。