CodeIgniter2 を試す (Smarty 編)

スポンサーリンク

前回の記事を書いた翌日に CodeIgniter2 がリリースされ,やる気が出てきたので続きを書く。

IDE は NetBeans,テスト環境は XAMPP を使っている。

スポンサーリンク

動作確認

まず,いつも通り PHP のプロジェクトを作成する。CodeIgniter2 をダウンロードして,NetBeans に作成したプロジェクトに放り込む (index.php は上書き)。

XAMMP で Apache を起動して,ブラウザでアクセス (例: http://localhost/test/) してみると,デフォルトコントローラとして設定されている welcome のページが表示される。

次に,コントローラ名を指定してアクセス (例: http://localhost/test/index.php/welcome) してみる。当然,先ほどと同じページが表示される。

URL の短縮

URL から “index.php” を取り除きたいので,次のような .htaccess ファイルをアプリケーションのルートディレクトリ (index.php があるとこ) に置く。これにより http://localhost/test/welcome のような URL でアクセスできるようになる。

RewriteEngine on

RewriteCond $1 !^(index\.php|css|user_guide|.+\.gif$|.+\.jpg$|.+\.png$|.+\.js$)
RewriteRule ^(.+)$ index.php/$1 [L]

MY_Controller の作成

すべてのページに共通する処理を一括して指定できるように,自前の継承元コントローラを用意する。以下のような内容の application/core/MY_Controller.php を作成すれば良い。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

class MY_Controller extends CI_Controller {

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

}

これを継承するように,welcome コントローラ (application/controllers/welcome.php) を次のように変更する。

//class Welcome extends CI_Controller {
class Welcome extends MY_Controller {

Smarty の導入

出力の XSS 対策は view で行ないたいので,HTML パーサとして Smarty を使えるようにする。

まず,Smarty の Web サイトから 2.6 をダウンロードして (3 は動かなかった) 解凍する。その中の lib フォルダを “smarty” にリネームして,application/libraries フォルダに入れる。

次に,Yet Another Smarty をダウンロードする。解凍して config フォルダと libraries フォルダの中身を application 内の該当フォルダに入れる。

ただし CodeIgniter2 から cache ディレクトリの位置が変更された (application/cache/) ので,このままでは正常に動かない。これに対応するために,application/config/smarty_parser.php を次のように変更する。

// The directory where compiled templates are located
//$config['compile_dir'] = BASEPATH.'cache/';
$config['compile_dir'] = FCPATH.APPPATH.'cache/';

MY_Controller のコンストラクタから smarty_parser をロードする。

function __construct() {
	parent::__construct();
	
	$this->load->library('smarty_parser');
}

テンプレートのヘッダ (例: application/views/header.tpl) とフッタ (例: application/views/footer.tpl) を作成する。ここで,Smarty では中括弧が構文として認識されるので,JavaScript や CSS などでこれらの文字が使われている場合は {literal} {/literal} で囲う必要がある。

<html>
<head>
<meta charset="utf-8">
<title>Welcome to CodeIgniter</title>
<style type="text/css">
{literal}
(中略)
{/literal}
</style>
</head>
<body>
</body>
</html>

さらに welcome のビュー (例: application/views/welcome/index.tpl) を作成する。

{include file='ci:header.tpl'}
<h1>てすと</h1>
<pre><code>てすと

{include file=’ci:footer.tpl’}

作成した view を読み込むように,welcome コントローラ (application/controllers/welcome.php) を変更する。

function index() {
	$this->smarty_parser->parse('ci:welcome/index.tpl', array());
}

ブラウザでアクセスして,次のように表示されれば成功だ。

今日はここまで。


(2011/06/10 追記)

補足的な記事を書いてくださっている方がいたのでリンクを張っておく。


(2011/08/31 追記)

CodeIgniter の仕様変更により,さらに application/libraries/Smarty_parser.php の 87 行目周辺と 114 行目周辺に下記の修正が必要になった。

//$CI->output->final_output = $template;
$CI->output->set_output($template);
//$path = $CI->load->_ci_view_path.$file;
$path = APPPATH.'views/'.$file;

(2011/09/03 追記)
PHP 5.3 では設定によっては以下のメッセージが出る。

A PHP Error was encountered
Severity: 8192
Message: Call-time pass-by-reference has been deprecated
Filename: libraries/Smarty_parser.php
Line Number: 77

これを消すには,application/libraries/Smarty_parser.php の 77 行目付近を以下のように修正する。

//$this->assign(&$data);
$this->assign($data);

コメント

  1. front/移植/2011-06-27

    CIへの移植手順 ▲ ▼CI2+Smarty2の準備 CIにはSmartyが含まれていないので、Smartyを持ってきて使えるようにする Smarty3ではCSのSmartyプラグインが一部動かないので、Smarty2と統合 手順: S…

  2. front/移植/CIへの移植手順

    CIへの移植手順 ▲ ▼CI+Smartyの準備 CI2をダウンロードして展開 CI2にはSmartyが含まれていないので、Smartyを持ってきて使えるようにする Smarty3ではCSのSmartyプラグインが一部動かない…

タイトルとURLをコピーしました