私はSmartyに反映させるテンプレートをデータベース(MySQL)に保存し、
テンプレートのソースを変数に入れて出力しています。
簡単な例です:
$sql = "SELECT * FROM template";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$body_var = $row["body"];
$body = $Smarty->fetch("var:body_var");
echo $body;
これでデータベースに保存していたテンプレートは出力されますし、その中にSmarty用のタグを埋め込めば反映できます。
しかし、こういう使い方の場合「template_dir」や「compile_dir」というテンプレートを保存するフォルダが必要ありません。
しかし、これらのディレクトリを指定しないと、Smarty上でエラーになります。
そこで質問ですが、テンプレート用のフォルダを作成しなくてもエラーにならない方法を教えて下さい。
(私がSmartyの使い方を誤認している場合もご指摘下さい)
$body = $Smarty->fetch("var:body_var");
変数からテンプレートを取得するようなリソースプラグインを
用意されているのでしょうか。便利そうですね。
[1] template_dir
テンプレートを全てデータベースに格納して、PHPの変数経由で渡す
ということであれば、テンプレートファイル を格納する template_dir は
不要になると思います。
template_dir は指定しなければ ./templates になりますが、
ディレクトリが無くてもエラーにはならないと思いますがどうでしょう。
[2] compile_dir
こちらは Smarty がテンプレートをコンパイルした結果を
保存しておくディレクトリですね。
compile_dir は指定しないと ./templates_c になりますが、
ディレクトリがないと fetch() を呼んだ際に Fatal error になりました。
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist, or is not a directory.
マニュアルをざっと読んだ限りでは、コンパイル済みテンプレートを
作らせないフラグ、みたいなものは見つかりませんでした。
テンプレートをPHPのコードにコンパイルして保存しておき、
変更されるまで再利用するという Smarty の仕組みからして、
compile_dir は欠かせないのではないかなぁと思います。
http://ml.php.gr.jp/pipermail/php-users/2004-April/021876.html
Smatyにはテンプレートリソースという機能があって、テンプレートの取得方法をプラグインで拡張できるようになっています。
テンプレートを変数に入れて渡すのは、そういうプラグインを入れて実現しているのだと思います。
参考:http://www.smarty.net/manual/ja/template.resources.php
で、template_dirを使うのは組み込みのfileリソースですが、
このリソースタイプを無効にする方法は無いので、たとえ使わなくてもtemplate_dirを用意する必要があります。
Smartyはコンパイル済みのテンプレートをキャッシュしようとします。
この挙動はリソースタイプによらず共通なので、compile_dirは常に必要です。
というわけで、両方作っておく必要があります。
やっぱり、最低限「compile_dir」は必要なんですね。
そう認識したいと思います。
詳しい解説ありがとうございます。参考にさせていただきます。