CodeIgniter はじめてみた3 ~ページネーション~

データベースへの接続が出来るようになったら、次に考えなくてはならないのはページネーションだ。

CakePHP の場合だと、コントローラで指定し、モデルと協力してデータの絞込み等を行い、ビューではヘルパーから提供を受けて HTML を出力するという、三位一体でほとんど自動化してくれる。

ところが CI の場合は、コントローラで呼び出すところまでは一緒だが、この時点で HTML が吐き出されるので、モデルのデータ絞り込みも、ビューへのセットも自分で行わなければならない。

Caker だとこれを不便と感じるかもしれないが、どこで何をやっているのか良くわかるし、モデルによらないデータのページングをしたいときとかも直感的に実装できる(CakePHP も可能だが)。

CI のページネーションで不便だと思うのが、コントローラで毎回 HTML を生成するので、デザイン等を仕込む場合毎度毎度設定するのが手間になるということ。

なので今回はコントローラをオーバーライドして、ページネーション用のメソッドを作ってしまうことにした。

    /**
     *
     * @param string $path          パス (コントローラ/メソッド)
     * @param number $cur_page      現在のページ数
     * @param number $total_rows    項目総数
     * @param number $per_page      1ページあたりの項目数
     * @param number $num_links     前後に表示するリンク数
     * @param number $uri_segment   ページ番号として利用するセグメントの順番
     */
    protected function _paging($path = '', $cur_page = 0, $total_rows = 0, $per_page = 20, $num_links = 5, $uri_segment = 3) {
        $config['base_url'] = base_url($path);
        $config['cur_page'] = $cur_page;
        $config['total_rows'] = $total_rows;
        $config['per_page'] = $per_page;
        $config['num_links'] = $num_links;
        $config['uri_segment'] = $uri_segment;
        $config['page_query_string'] = false;
        $config['first_link'] = '最初';
        $config['last_link'] = '最後';
        $config['full_tag_open'] = '<div class="paging">';
        $config['full_tag_close'] = '</div>';
        $config['cur_tag_open'] = '&nbsp;<strong class="btn btn-xs btn-default">';
        $config['cur_tag_close'] = '</strong>';
        $config['anchor_class'] = 'class="btn btn-sm btn-info"';

        $this->pagination->initialize($config);
        return  $this->pagination->create_links();
    }

なお独自仕様なため汎用性はあんまりないので参考程度で。

ボタンのデザインは bootstrap を利用している。

CI のページネーションはライブラリでの提供となるので、 $autoload['libraries'] に指定しておくか、使うときにロードする必要がある。