はじめに
Smarty とは?
Smarty は PHP のためのテンプレートエンジンです。具体的に言うと、php
のプレゼンテーションからアプリケーションのロジックとコンテンツを分離して管理する事を容易にします。
これは、プログラマーとテンプレートデザイナーの役割が異なり、
これらの役割を違う人間が受け持っている場合に最適だと言えます。
例えば、新聞記事を表示するwebページを作成しているとします。
記事の $headline (見出し)、$tagline
(キャッチフレーズ)、$author (著者) および
$body (本文) が中身を構成する要素となります。
ここには、それをどのように表示するかという情報は含まれません。
これらはアプリケーションによって Smarty に
渡されます。
テンプレートデザイナーはこのテンプレートを編集し、
HTML タグや テンプレートタグ
を使用して、これらの 変数
と要素 (テーブル、div、背景色、フォントサイズ、スタイルシート、svg など)
の体裁を調整します。
ある日、プログラマーが (アプリケーションロジックを変更したなどの理由で)
記事の内容を取得する手段を変更する必要が出てきたとします。
この変更はテンプレートデザイナーに影響がないため、
記事には全く同じ内容のテンプレートが適用できるでしょう。
同様に、もしテンプレートデザイナーがテンプレートを完全に作り直したい場合でも、
アプリケーションロジックを変更する必要がありません。
したがって、プログラマーはテンプレートを作り直す事なくアプリケーションロジックを変更する事ができ、
テンプレートデザイナーはアプリケーションロジックを壊す事なくテンプレートを変更できます。
Smarty の設計の目標の一つとして、
ビジネスロジックとプレゼンテーションロジックの分離があります。
これは、プレゼンテーションのためだけという条件の下で
テンプレートにロジックを含める事が可能であるという事です。
他のテンプレートを include
したり、テーブル行の色を
変更 したり、変数を
大文字 にしたり、データの配列を
ループ させたり、それを
表示
したりといったことが、プレゼンテーションロジックの例になります。
これは、Smarty がビジネスロジックとプレゼンテーションロジックの分離を
強制している訳ではない事を意味しています。
Smarty はテンプレート内に置かれたものがビジネスロジックなのか何なのか全くわかりません。
また、テンプレートにロジックを 置きたくない
ならば、テキストと変数のみでコンテンツを作り上げることも可能です。
Smarty のユニークな特徴の一つは、テンプレートをコンパイルすることです。
つまり、Smarty がテンプレートファイルを読み込み、
それをもとにして PHP スクリプトを作成するということです。
一度作成してしまえば、その後はコンパイルされた PHP スクリプトが実行されるので、
各リクエスト時にテンプレートファイルのパースによるオーバーヘッドがありません。
さらに各テンプレートは、
eAccelerator、
ionCube、
mmCache
あるいは Zend Accelerator
のような PHP コンパイラやキャッシュソリューションを最大限に活用することができます。
Smarty の特徴
非常に高速
下仕事は PHP パーサが行うので能率的
コンパイルは一度だけ行われるので、テンプレートのパースによるオーバーヘッドが無い
再コンパイル
は変更があったテンプレートファイルのみで行うのでスマート
簡単に独自の 関数
や 変数の修飾子
を作成できるので、テンプレート言語を強力に拡張することが可能
テンプレートの
{デリミタ}
タグの記法を変更し、
{$foo}、{{$foo}}、
<!--{$foo}--> などを使用することが可能
{if}..{elseif}..{else}..{/if}
構文は PHP パーサが処理するので、{if...}
の条件式にはシンプルなものから複雑なものまで自由に指定可能
sections や if's
などは無制限にネスト可能
テンプレートファイル内に
PHP コードを埋め込む
ことも可能。しかし、エンジン自体が
カスタマイズ できるので、
これはおそらく不要 (そして非推奨)。
組み込みで キャッシュ機能 をサポート
任意の テンプレート ソース
カスタム キャッシュハンドラ
関数
プラグイン 機構
インストール
必要条件
Smarty は、PHP 4.0.6 以降が動作しているウェブサーバを必要とします。
基本的なインストール
Smarty のライブラリファイルを、ディストリビューションの
/libs/ サブディレクトリにインストールしてください。
これらの .php を編集してはいけません。
これらはすべてのアプリケーションで共有するものであり、
Smarty を新しいバージョンにアップグレードする際にのみ更新します。
以下の例で、Smarty の tarball の展開先は次のようになります。
*nix の場合は
/usr/local/lib/Smarty-v.e.r/
Windows 環境の場合は
c:\webroot\libs\Smarty-v.e.r\
必要な Smarty ライブラリファイル群
Smarty は、SMARTY_DIR
という名前の PHP の 定数
を使用します。これは、Smarty の libs/ ディレクトリへの
絶対パス を表します。
基本的にあなたのアプリケーションが Smarty.class.php
ファイルを見つける事が出来るなら
SMARTY_DIR
を定義する必要はありません。Smarty は自分でそれを考えます。
したがって、もし Smarty.class.php が
include_path
にないか、あなたのアプリケーションにてそれらへの絶対パスが指定されていないなら、
手動で SMARTY_DIR を定義する必要があります。
SMARTY_DIR は、
最後にスラッシュ / を含めなければなりません。
次の例では、PHP スクリプト内での Smarty インスタンスの作成方法を示します。
]]>
上のスクリプトを実行してみてください。
Smarty.class.php ファイルが見つからないというエラーが出た場合は、
以下のいずれかを行う必要があります。
手動で SMARTY_DIR 定数を定義する
]]>
ライブラリファイルの絶対パスを指定する
]]>
php.ini ファイルにライブラリへのパスを追加する
PHP スクリプト内での ini_set()
によるインクルードパスの追加
]]>
これでライブラリファイルは正常に設置できたので、
今度はあなたのアプリケーション内に Smarty 用のディレクトリを セットアップしましょう。
Smarty は、デフォルトで
templates/、
templates_c/、configs/ および cache/
と名づけられた4つのディレクトリが必要です。
これらの名前は、それぞれ
Smarty クラスのプロパティ
$template_dir、
$compile_dir、
$config_dir および
$cache_dir で定義することができます。
Smarty を使用する各アプリケーションにおいて、
これらのディレクトリを個別に設置する事を強く推奨します。
インストール例として、ゲストブックアプリケーションの
Smarty 環境をセットアップしてみます。
私達はディレクトリの命名規約の目的についてのみ取り上げました。
例のアプリケーション名を guestbook/
からあなたのアプリケーション名に置き換えれば、同様の環境を使用できます。
ファイル構造
あなたは web サーバのドキュメントルートの位置を知っている必要があります。
例ではドキュメントルートは /web/www.example.com/guestbook/htdocs/
とします。Smarty ディレクトリは Smarty ライブラリによってのみアクセスされ、
web ブラウザから直接アクセスされる事はありません。
したがってセキュリティの心配を避けるために、
これらのディレクトリをドキュメントルートの 外部
に配置する事を推奨します (ただし必須ではありません)。
ドキュメントルート下には最低1つのファイルが必要であり、
それは web ブラウザによってアクセスされるスクリプトです。
この例ではドキュメントルート /htdocs/
の下にサブディレクトリを作成し、その中に index.php
を配置します。
Smarty は
$compile_dir と
$cache_dir
(templates_c/ と
cache/) に
書き込み権限 でアクセスする必要があるので、
web サーバのユーザがこれらに書き込める必要があります
(windows ユーザはこの話を無視してください)。
通常は、このユーザは nobody
でグループは
nobody
です。OS X ユーザの場合は、デフォルトのユーザは
www
でグループは www
です。
もし Apache を使用しているなら、httpd.conf
ファイルを見ればユーザ名とグループ名がわかります。
パーミッションおよびディレクトリへの書き込み権限の付与
注意
chmod 770 は強固なセキュリティです。
これは、ユーザ nobody
とグループ nobody
のみにディレクトリのリード/ライトアクセスを許可します。
もし誰にでもリードアクセスを可能にしたい場合
(大抵はあなた自身がファイルを見るための利便性から)
は、代わりに 775 を使う事が出来ます。
次に、Smarty が表示するファイル index.tpl
を作成する必要があります。これは、
$template_dir の中に配置しなければなりません。
/web/www.example.com/guestbook/templates/index.tpl
テクニカルノート
{* Smarty *} はテンプレートの
コメント です。
これは必須ではありませんが、全てのテンプレートファイルのはじめに
コメントを書くのは良い習慣です。
これは、ファイルの拡張子に関わらずファイルを認識する事を簡単にします。
例えば、テキストエディタはファイルを認識して特有のシンタックスハイライトを有効にするでしょう。
では、index.php を編集しましょう。
Smarty のインスタンスを作成し、テンプレート変数を割り当て
(assign())、
index.tpl ファイルを表示
(display())
します。
/web/www.example.com/docs/guestbook/index.php の編集
template_dir = '/web/www.example.com/guestbook/templates/';
$smarty->compile_dir = '/web/www.example.com/guestbook/templates_c/';
$smarty->config_dir = '/web/www.example.com/guestbook/configs/';
$smarty->cache_dir = '/web/www.example.com/guestbook/cache/';
$smarty->assign('name','Ned');
//** 次の行のコメントをはずすと、デバッギングコンソールを表示します
//$smarty->debugging = true;
$smarty->display('index.tpl');
?>
]]>
注意
この例では、Smartyのディレクトリすべてを絶対パスで設定しています。
もし /web/www.example.com/guestbook/
が PHP の include_path にあるのなら、これらの設定は必要ありません。
けれどもこれらを絶対パスで指定する方が より効率的で、(経験上)エラーが少なくなります。
そうすれば、Smarty はあなたが意図したディレクトリからファイルを確実に取得できます。
では、web ブラウザから index.php ファイルを読み込んでみましょう。
"こんにちは、Ned。ようこそ Smarty へ!" と表示されるはずです。
これで Smarty の基本的なセットアップは完了しました!
拡張セットアップ
これは、基本的なインストール
の続きです。まず先にこちらから読んで下さい!
Smarty をより柔軟にするセットアップ方法は、
クラスを拡張
してあなたの Smarty の環境を初期化する事です。
ディレクトリパスの設定を同じ変数に何度も割り当てる代わりに、一箇所でそれらを行う事が出来ます。
新しいディレクトリ/php/includes/guestbook/
を作成し、setup.php という新しいファイルを作成しましょう。
この例の環境では /php/includes
が include_path です。
例と同じようにするか、あるいは絶対パスを使用して下さい。
/php/includes/guestbook/setup.php
Smarty();
$this->template_dir = '/web/www.example.com/guestbook/templates/';
$this->compile_dir = '/web/www.example.com/guestbook/templates_c/';
$this->config_dir = '/web/www.example.com/guestbook/configs/';
$this->cache_dir = '/web/www.example.com/guestbook/cache/';
$this->caching = true;
$this->assign('app_name', 'Guest Book');
}
}
?>
]]>
では、index.php ファイルを修正し、
setup.php を使うようにしてみましょう。
/web/www.example.com/guestbook/htdocs/index.php
assign('name','Ned');
$smarty->display('index.tpl');
?>
]]>
このように、アプリケーションのために全てを自動的に初期化する
Smarty_GuestBook()
クラスを使う事で、Smarty のインスタンスをとても簡単に作成することができました。