サイト制作や運営に関するトピックスとかドラムネタとか満載??WEB制作や運営に関する楽屋話 Binbo-Special

CodeIgniterでSmartyを使う方法

 

旧サイト時代に書いた記事
【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クラス自体はシンプルにしてあります。その辺の機能に慣れている人は処理を足して使いましょう。

関連記事

RSSのご案内

当ブログ(Binbo-Special)に初めて訪れた方や、何度かお越しいただいている方々へ。
もし、もしも、もしかして、ひょっとすると、万が一、まさかの、不足の事態によって当ブログを気に入って頂けましたら、RSSリーダーへの登録を是非よろしくお願い致します。
feed


Google Search

Menu

Subscribe

Account

 

Tag Cloud

 

Monthly Archive

 

Old Contents

Popular Posts