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'] = '&lt; 前へ';
        $config['next_link'] = '次へ &gt;';
        $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;
}


画面

いい感じ。
簡単にページ切り替えリンクができたよん。

さて明日は何試そうかな。
今日やる予定だった登録画面を作るかな。