旧サイト時代に書いた記事
【CodeIgniter】Smartyを使いたい場合の方法の一つ
が、最新のcodeigniterで動かない!という事が分かりましたので、記事アップデートの巻。ニンニン。
CodeIgniterが2.0.3になって、よりオブジェクト指向に!
codeigniterは元々、PHP4時代からあるフレームワークですので、PHP4のフレームワークでした。
PHP4のクラスはprivateやprotectedといった概念が無かったので、codeigniterはルールとして、
アンダーバーで始まるクラス変数・クラスメソッドはプライベート扱い
となっていました。
codeigniterもバージョン2になった時にPHP5必須となりました。
細かい調整などは入っていましたが、まだまだクラス変数はvarで宣言されていたし、クラスメソッドにもprivateやpublicといった記述はあまり厳密に入っていませんでした。
ところが、久し振りに最新版を使おうと思って、2.0.3を落としてみたのですが、この辺りが結構厳密になってきており(もちろん良い事なのですが)、以前に何となく作っていたSmartyライブラリがそのままでは動作しないという事態に陥ったのです。
よって、少しいじってみることにしました。
高須クリニックでいじると高そうなので自力で。
Smartyライブラリ
/application/libraries/Smarty.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
// Smarty.class.php へのパス
require_once(APPPATH.'libraries/Smarty/Smarty.class.php');
class MY_Smarty extends Smarty
{
private $tpl_path;
function __construct()
{
parent::__construct();
$this->tpl_path = dirname($_SERVER['SCRIPT_FILENAME']);
$this->compile_dir = APPPATH . "views/templates_c"; // コンパイルファイル置き場。パーミッション777とかにする
$this->template_dir = $this->tpl_path; // viewファイル置き場。この例ではフレームワークのルート
$this->left_delimiter = "{{";
$this->right_delimiter = "}}";
$this->allow_php_tag = TRUE;
log_message('debug', "Smarty Class Initialized");
}
public function view($template)
{
$CI =& get_instance();
$CI->output->set_output($this->fetch($template));
}
}
実に大した修正はしておらず、前は、
$CI->output->final_output
という変数に出力内容を入れていたのですが、この変数がprotectedになったので、final_outputに代入する為のメソッド set_output(append_outputでも可)を呼ぶようにしました。
使い方
- 上記ソースを
/application/libraries/Smarty.php
に配置。 - Smarty最新版をゲットして解凍。
中にある、libs 以下を、
/application/libraries/Smarty/
以下に配置。 - /application/views/templates_c/
というディレクトリを作成し、パーミッションを777とかにしておく。 - /application/config/autoload.php
の、
$autoload['libraries']
配列に、’smarty’ を追加 - そして、コントローラー内で以下の様に使う。
—–
$this->smarty->assign(‘hoge’, $hoge);
$this->smarty->view(‘/hoge/hoge.tpl’);
—–
補足
- 拡張子は入れないっていう書き方がCodeIgniterのビューの標準仕様で、それに合わせた方が良いのかも?と思ったものの、拡張子を省略する意味が分からないので、その点は何も考慮していません。
拡張子省略させたい人は、viewメソッドのfetch部分を
$CI->output->set_output($this->fetch($template.’.tpl’));
とかに書き換えてください。 - テンプレートファイル(viewファイル)にちょっとJavaScriptのコードを書いたり、Style書いたりしたいときにいちいち{literal}書くのが嫌なので、デリミタは好みで「{{」「}}」にしていますが、気持ち悪い人は変更もしくはコメントアウトしてください。
- viewファイルの置き場が気持ち悪い人は、$this->template_dir を変えてください。
- viewの第2引数にdataを渡してassignっていう仕様も、事前にassignすれば良いだけだし、第3引数をTRUE指定すれば文字列を返すっていうのも、Smartyの場合は直接fetchすれば良いだけだと思うので、MY_Smartyクラス自体はシンプルにしてあります。その辺の機能に慣れている人は処理を足して使いましょう。