CodeIgniter はじめてみた2 ~テンプレート出力~

CodeIgniter を使っていて、まず気づいたのがテンプレート機能が貧弱だということ。

と言うか、アレをテンプレート機能と呼んで良いのか疑問である。

ビューを呼び出すときに変数をセットして、埋め込んでビュー側で使えるようにする、ただそれだけの機能しかない。

これでは1つのビューに丸ごと全て HTML を書かなくてはならない。

効率が悪すぎる。

色々検索すると、これに不満を覚えている人は多いようで、そこそこの記述が発見できた。

それぞれがそれぞれのやり方で解決しているようだったが、どれも自分にはなじまなかったので、やはり自分も独自でライブラリを作ることに決めた。

一番参考にしたのはこちらのサイト
Codeigniter2 用のLayout library を作ったよ - localdisk

今回の開発用件のうち重要なのが DB 接続だ。

CodeIgniter のモデルはどんな機能なのかとわくわくしていたのもつかの間。

モデルからメソッドを実行するのに、毎回テーブル名の指定が必要だと気づいたときには、若干めまいを覚えた。

「テーブルにアクセスしてデータを取り出すためのメソッド」をテーブルごとにまとめてライブラリ化したもの、それが CI のモデルらしい。

毎回テーブル名を指定しなければならないというのは、なかなかに苦痛なので、独自でモデル名とテーブル名の命名規則を作り、コアのモデルファイルをオーバーライドしたファイルを用意することにした。


application/core の配下はオーバーライドしたファイルの置き場所となっている。

ここの下に MY_Model.php と言うファイルを作り、以下のように記述した。

class MY_Model extends CI_Model
{
    /**
     * テーブル名
     *
     * @var string
     */
    protected $_table;

    public function __construct() {
        parent::__construct();

        $className = get_class($this);
        $this->_table = strtolower(substr($className, 0, strrpos($className, '_')));
    }

    /**
     * 範囲 を指定してデータを取得する
     *
     * @param number $limit     件数
     * @param number $offset    開始位置
     */
    public function find($limit = 10, $offset = 0) {
        return $this->db->get($this->_table, $limit, $offset)->result();
    }

    /**
     * 全てのデータを取得する
     *
     */
    public function find_all() {
        return $this->db->get($this->_table)->result();
    }

    /**
     * id を指定してデータを取得する
     *
     * @param number $id
     */
    public function find_by_id($id) {
        return $this->db->where(array('id' => $id))->get($this->_table)->row();
    }

    /**
     * 件数を取得する
     *
     */
    public function get_count() {
        return $this->db->count_all($this->_table);
    }
}

非常に簡単なものしか用意していないので、参考までに。

本当はもっとがつっとオーバーライドして get() 自体をどうにかしようと思ったのだけど、そこまでやってしまうと普通の CI に戻れなくなりそうなので、今回は見送り。


命名規則は以下の通り。

テーブル名 モデルファイル名 モデルクラス名
tables tables_model.php Tables_model

と言う感じに使う。

アンダースコアがテーブル名に入る場合も使えるようにしてあるけれど、今回はそういうテーブルを使わなかったので試してはいない。

常に DB に問い合わせを行うサイトの場合は、 aplication/config/autoload.php の55行目あたりにある $autoload['libraries'] の配列内に database を入れておくと良いと思う。

それほどでもなく、特定のページのみ DB 接続を行うのなら、それぞれのコントローラのメソッド内で $this->load->libraries('database') を行う。