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') を行う。