特集
2004/02/19 23:50:00 更新

全3回「WebプログラミングPHP言語入門」
特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (2/4)


テンプレートエンジン Smartyとは

 テンプレートとは、Webアプリケーションのスクリプトからデザイン部分だけを完全に切り離したものである。コントローラから渡されたモデルの処理結果を使い、情報をレイアウトするためのプログラムが、スクリプトエンジンである。

 PHPで利用できるテンプレートエンジンには幾つか候補があるが、今回はSmartyというテンプレートエンジンを使用する事にした。

 Smartyを選択した主な理由は、Smartyの使い方を解説しているサイトが多く存在し、和訳したドキュメントを公開しているサイトが存在している点である。XOOPS(コミュニティサイト構築用ソフト)でもSmartyを採用している事からも、PHPのテンプレートエンジンの中で、最も多く使われているのではないだろうか。

 もし、お使いのレンタルサーバがSmartyに対応していなければ、サーバ上の自分のホームディレクトリにSmartyをインストールする事も可能である。但し、Smarty関連のファイルだけで0.3メガバイト強を消費するので、残容量には注意してほしい。また、インストール方法については、前述のサイトにあるドキュメントに詳しく書かれているので、そちらを参照するとよいだろう。

Smartyを使ってみよう

 詳しく解説する前に、実際にSmartyを使った動作を見てもらおう。以下の4つのファイルは、ビューを構成するために使う最低限の構成を抜き出したものだ。

サンプル1-1:CommonView.php -- ビューの基底クラス
_smarty = new Smarty;
        $path = $_SERVER['SCRIPT_FILENAME'];
        $path = substr($path, 0, strrpos($path, '/'));
        $this->_smarty->template_dir = $path;
        $this->_smarty->compile_dir = $path . '/tmp';
//     $this->_smarty->default_modifiers = array('escape:"htmlall"');
    }
    // テンプレートに値を割り当てる
    function assign($name, $obj) {
        $this->_smarty->assign($name, $obj);
    }
    // テンプレートの処理結果を取得
    function fetch($template) {
        return $this->_smarty->fetch($template);
    }
    // テンプレートの処理結果を表示
    function display($template) {
        echo $this->fetch($template);
    }
}
?>
サンプル1-2:TestView.php -- テスト用のビュークラス
_device = $obj->device;
        parent::assign("title", $obj->title);
        parent::assign("date", $obj->date);
        parent::assign("message", $obj->message);
    }
    function fetch($template) {
        $content = parent::fetch($template);
        switch ($this->_device) {
        case 1: // デバイスが 0 以外なら iモード用に変換
            Header("Content-type: text/html; charset=ShiftJIS"); 
            $content = mb_convert_encoding(mb_convert_kana($content, "kas"), "SJIS");
            break;
        default: // その他のデバイスはそのまま出力
            break;
        }
        return $content;
    }
}
?>
サンプル1-3:test1.tpl -- テンプレート

{$title}

今日は{$date.today}です。
明日は{$date.tomorrow}です。

{$message}
サンプル1-4:view.php -- ビュークラスを実行するスクリプト
device = $device;
        $this->title = "ビューのテスト";
        $this->date = array (
            "today"     => date("Y-m-d"),
            "yesterday" => date("Y-m-d", time() - 86400),
            "tomorrow"  => date("Y-m-d", time() + 86400)
        );
        $this->message = "このスクリプトはSmartyのテスト用です。";
    }
}
$obj = new TestObject(0);
$view = new TestView($obj);
$view->display("test1.tpl");
exit;
?>

 これら4つのファイルをWebサーバの公開ディレクトリに配置した後、そのディレクトリにtmpというディレクトリを作成してほしい。このディレクトリは、Smartyがテンプレートをコンパイルする際に使用される一時ディレクトリとして必要となる。

 もし、PHP実行時のユーザー権限の都合でtmpディレクトリに書き込みができない場合は、適切なパーミッションを設定する必要があるので注意してほしい。

 全て準備が整ったら、Webブラウザからview.phpにアクセスしてみよう。何も問題が無ければ、次のような結果がWebブラウザに表示されるはずだ。

結果1:Smartyを使ったサンプルの出力結果

ビューのテスト

今日は2004-02-16です。
明日は2004-02-17です。

このスクリプトはSmartyのテスト用です。

「4つもファイルを用意しておきながら、たったこれだけ?」と、Smartyの機能に疑念を抱きそうな出力結果である。だが安心してほしい。Smartyは、その疑念を払拭して更にお釣りが返るくらい、とても便利な機能を搭載しているのだ。

 次章は、Smartyが持っているアドバンテージについて解説する。

前のページ | 1 2 3 4 | 次のページ

[照井進吾,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.