Smartyの使い方について相談です。


私は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の使い方を誤認している場合もご指摘下さい)

回答の条件
  • 1人2回まで
  • 登録:2009/03/03 18:42:26
  • 終了:2009/03/10 18:45:02

回答(2件)

id:bayan No.1

bayan回答回数99ベストアンサー獲得回数132009/03/07 17:29:52

ポイント35pt

$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

http://www.smarty.net/manual/ja/

id:k27w

詳しい解説ありがとうございます。参考にさせていただきます。

2009/03/09 16:35:14
id:rryu No.2

りゅう回答回数30ベストアンサー獲得回数22009/03/08 19:01:38

ポイント35pt

Smatyにはテンプレートリソースという機能があって、テンプレートの取得方法をプラグインで拡張できるようになっています。

テンプレートを変数に入れて渡すのは、そういうプラグインを入れて実現しているのだと思います。

参考:http://www.smarty.net/manual/ja/template.resources.php


で、template_dirを使うのは組み込みのfileリソースですが、

このリソースタイプを無効にする方法は無いので、たとえ使わなくてもtemplate_dirを用意する必要があります。


Smartyはコンパイル済みのテンプレートをキャッシュしようとします。

この挙動はリソースタイプによらず共通なので、compile_dirは常に必要です。


というわけで、両方作っておく必要があります。

id:k27w

やっぱり、最低限「compile_dir」は必要なんですね。

そう認識したいと思います。

2009/03/09 16:36:25
  • id:esecua
    SmartyのキャッシュをDBに保存することは効いたことがありますが、(Flickrなど)テンプレート自体はどうでしょう、、、
  • id:k27w
    テンプレートもキャッシュみたいに保存(作成)されるんですが、そもそもその行為自体を無くしたいんです。キャッシュは作れなく出来るので、テンプレートも出来る気がするのですが・・。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません