トップページphp
981コメント365KB

【PHP】 Smarty 【テンプレートエンジン】 第2章

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2010/03/29(月) 14:41:04ID:???
Smarty は PHP のためのテンプレートエンジンです。
具体的に言うと、php のプレゼンテーションからアプリケーションのロジックとコンテンツを分離して管理する事を容易にします。
これは、プログラマーとテンプレートデザイナーの役割が異なり、
これらの役割を違う人間が受け持っている場合に最適だと言えます。
0931nobodyさん2011/10/16(日) 16:13:23.67ID:???
普通に出力して比較すれば良いんでね?
エスケープされるはずの文字列を。
0932nobodyさん2011/10/19(水) 20:50:23.39ID:???
上にあるescapeのhtmlとhtmlallの違いが分かりません
具体的にはどのような文字をエスケープするのでしょうか?
09339322011/10/19(水) 20:57:09.49ID:???
すみません、質問方法を変えます
http://web.shikaku-zukan.com/smarty/func/escape.html
でありますが、htmlallの方の挙動が分かりません
何故あいうえおなどの文字列まで全部エスケープされているのでしょうか?
いったいどういう文字をエスケープし、どういう仕様なのかが分かりません
これを見ると、htmlallよりhtmlの方がいいのかなと思いますが、マニュアルにはhtmlallが指定されています
実際問題どちらがいいのでしょうか?
0934nobodyさん2011/10/23(日) 05:25:39.09ID:XgYAMZND
smarty3で質問します
phpで 変数animalに「犬」とassignされてて
テンプレートファイルの<script>タグ内でそのsmarty変数を受け取って利用したいとき
どう処理したら良いんでしょうか?
<script>
animal = {$animal};
alert(animal+"を飼っています");
</script>
という形で「犬を飼っています」と表示させたいのですが
{}の処理がわかりません
09359342011/10/23(日) 06:28:57.04ID:???
すみません、変な勘違いしてました
上の質問は無視してください
0936nobodyさん2011/10/26(水) 15:36:49.28ID:JKF2j1ik
Phalanger - The PHP Language Compiler for the .NET Framework
http://ja.wikipedia.org/wiki/Phalanger
0937nobodyさん2011/11/02(水) 17:28:27.54ID:???
smarty3に対応したvimのsyntax fileってないかなぁ。vim.orgでは
古いのしか見つけられなかった。
0938nobodyさん2011/11/15(火) 14:37:54.73ID:hT8eAUMs
Smartyのテンプレートの中に {#AAAAA#} みたいな記述があったんだけど、どういう意味?
0939nobodyさん2011/11/15(火) 15:34:18.71ID:???
>>938
それは設定ファイルから読み込まれた変数

ttp://www.smarty.net/docs/ja/language.config.variables.tpl
0940nobodyさん2011/11/15(火) 16:43:57.31ID:hT8eAUMs
ありがとう
0941nobodyさん2011/11/21(月) 22:03:04.64ID:+dtlHn11
質問です。
以前までは普通にtplファイルをviでごりごり弄ってても、ちゃんとブラウザで表示できたのに
急に真っ白な画面しか出なくなってうまく表示されません
文字コード、改行コードなどは正しいです
簡単なコード(<h2>test</h2>)だけで試しても表示されません

ちなみにApacheのログには何も出ません
原因は恐らくコンパイルされなくなった事にあると思いますが、理由がわかりません
同じような症状になった人とかいますか?
よろしくお願いします
0942nobodyさん2011/11/21(月) 22:27:40.35ID:+dtlHn11
941です。書き忘れてました

templatesディレクトリの中身を消してもダメでしたし、cacheは利用していません
0943nobodyさん2011/11/22(火) 00:44:39.57ID:???
PHPのコードでエラー出て止まってるんじゃね?
0944nobodyさん2011/11/22(火) 02:12:50.43ID:???
httpdだけじゃなくてphpもエラーログ出せるよ
開発環境なら出力してチェックすべし
0945sage2011/11/22(火) 06:24:40.86ID:rTYRxhVU
今まで正常に動いていたphpを使用しているためphpに問題はありません
不思議なのは更新日が新しくなるとダメだという事
(mvで名前変更はアウト、cpは-aを付けないとアウト)

Smartyの処理の流れは正確にはわからないのですが、
tplファイルを編集→tplファイルが以前の日付よりも新しくなっていたらコンパイルファイルを更新 と認識しています
したがってコンパイルが出来なくなっているのが原因ではないかと書きました
0946nobodyさん2011/11/22(火) 06:26:28.47ID:???
下がってない。寝起きスマソ
0947nobodyさん2011/11/22(火) 08:14:29.85ID:???
templates_cのパーミッションは大丈夫?
0948nobodyさん2011/11/22(火) 08:38:20.14ID:???
諸事情により767になってるから問題ない。ユーザー、グループはApacheです
ちなみに、SELinuxはEnforcingだけどDocumentRootのコンテキストタイプはディレクトリ、ファイルともにhttpd_sys_content_tになってる
09499412011/11/22(火) 11:32:32.97ID:???
自己解決しました
Smarty.class.phpに不要なメソッドが追加されていたのが原因でした
削除したところ無事動きました

お騒がせしました
0950nobodyさん2011/11/22(火) 21:12:01.83ID:???
カスタマイズされたのは別物だぁな
0951nobodyさん2011/11/23(水) 00:48:14.76ID:???
>>949
>不要なメソッドが追加されていたのが原因でした

"追加していたのが" or "追加されていたのが(本人の意図しないところで)"

そもそも、不要なメソッドを追加したのが、ご自身ならばコーディングミス。
そうではなくて意図しない所でメソッドが変更されていたなら危機感を感じた方が良いよ。
0952nobodyさん2011/11/23(水) 00:51:00.68ID:???
まあまあ、良いじゃねーか。
原因分かった後にどうするのかはSmartyとは関係ないんだし。
0953nobodyさん2011/11/23(水) 04:17:43.61ID:???
>>951
簡単に言うと開発環境と実環境が同期されていなかった事が原因です
色々な事情により開発環境と実環境の同期は手作業なため、その部分でミスがありました
0954nobodyさん2011/12/14(水) 22:49:06.35ID:???
html_checkboxesでselected指定をarrayにすると、
Warning: htmlspecialchars() expects parameter 1 to be string, array given in 〜
となるのですが、原因がどうしてもわかりません。
Stringにすると通ります。

すみませんが教えていただけますと幸いです。
よろしくおねがいしますm(_ _)m
0955nobodyさん2011/12/15(木) 02:00:17.85ID:???
そのまんまだ
ていうか自己解決してるじゃないか
配列を引数で渡しちゃいけない
0956nobodyさん2011/12/16(金) 01:22:42.74ID:???
>>955
checkboxなら複数選択って状態があるはずだし配列で渡せないとおかしくない?
と思ってマニアル確認したら渡せることになってるみたい

http://www.smarty.net/docsv2/ja/language.function.html.checkboxes.tpl

今試せる環境がないんでバグなのかマニアルのミスなのかわからないけど
違う原因じゃないかな
0957nobodyさん2011/12/16(金) 01:39:30.81ID:???
って、エラーは"htmlspecialchars()"かー
selectedは checked="checked"になるわけで
その値をhtmlspecialchars()するとは考えにくいので

>html_checkboxesでselected指定をarrayにすると
が原因じゃなくて、他の指定がおかしいんじゃないだろかと予想してみる

どう指定してるかを貼り付けたほうがよさそう
0958nobodyさん2012/01/05(木) 17:15:17.69ID:fe3IZupl
質問させてください。
smartyに渡したオブジェクトの変数から、
smarty内でそのオブジェクトのメソッドを呼びたいのですが、
どのように書けばいいのでしょうか?
もしかして無理なのでしょうか。

教えていただけると幸いです
0959nobodyさん2012/01/05(木) 18:08:21.78ID:fe3IZupl
すみません解決しました。
普通に->()が使えるのですね。失礼しました
0960nobodyさん2012/01/12(木) 09:23:32.21ID:iHCFQcsC
キャッシュのことで質問させてください。

$smarty = new MySmarty();
$smarty->setCaching(NugiSmarty::CACHING_LIFETIME_SAVED);
$smarty->setCacheLifetime(60); // 60秒間キャッシュ
$smarty->setCompileCheck(false);

このような設定で、キャッシュが60秒ごとに更新されるまでは確認できたのですが
templates_cディレクトリの解析済みキャッシュが更新されておらず、
cacheディレクトリのキャッシュのみが更新されるため、
実質、表示上は更新されないという状況になっています。
(template_cのファイルが更新されないことには、それをもとに更新されるcacheのファイルの内容に変化はない)

どういう指定が必要なんでしょうか。
0961nobodyさん2012/01/12(木) 09:38:27.74ID:iHCFQcsC
960追記
Smartyのver3.1.3です
0962nobodyさん2012/01/12(木) 10:35:24.13ID:???
キャッシュはテンプレートに入れるデータをキャッシュ
テンプレートはテンプレートをPHPフォーマットにしたものをキャッシュ
テンプレートに変更がなければテンプレートは更新されない
もっと良くマニュアル読んで
09639602012/01/12(木) 10:54:47.62ID:iHCFQcsC
>>962
どもです。そういえば意識してなかったんですが、>>960はテンプレートの変更で試していました。
一応今、次のようなコードでとりあえず更新されるようになりました。

if (!$smarty->isCached($tmpl,$cache_id)) {
//コンパイル済みのファイルがチェックされ、結果的に更新される
$smarty->setCompileCheck(true);

//以下は効かなかった(cacheの更新のみ)
//$smarty->clearCache($master_tmpl,$master_cache_id);
//$smarty->clearAllCache();
}

なんか変は気はするけど、おそらく>>962で説明していただいた違いなんですよね。
つまり最初の設定で
$smarty->setCompileCheck(false);
としているため、再コンパイルの可能性は考慮されない、と。
0964nobodyさん2012/01/12(木) 11:03:01.62ID:???
解決したならいいけど、そんな度々再コンパイルするような使い方だとしたら
キャッシュもテンプレートエンジンもあまり意味ないんじゃないの
09659602012/01/12(木) 11:20:02.82ID:iHCFQcsC
>>964
60秒はあくまでテストです。
定期的に更新される外部ファイルを1日1回
全ページ共通のメインテンプレートに埋め込む感じなので。
もちろん、他の実装も可能でしょうけど、
埋め込んでしまえばその都度のinclude分、節約できるかと。
0966nobodyさん2012/01/12(木) 11:32:10.40ID:???
普通は

# 1.キャッシュがあるか
 あればキャッシュから出力して終了

# 2.キャッシュが無かったのでデータ作成
 キャッシュさせて出力

こんな順序で、テンプレートのコンパイルは特に意識しない
テンプレートのコンパイルが必要なのはテンプレートを書き換えた時のみ

共通テンプレートを使うことはよくあるのでテンプレートIDをそれぞれのアクセスに対して付ける
多くの場合はアクセスURLをIDにしておくと事足りる
$tplid = md5($_SERVER['REQUEST_URI']);
とか
09679602012/01/12(木) 12:01:23.53ID:iHCFQcsC
>>966
>テンプレートのコンパイルは特に意識しない

たしかにそうですよね・・・ちょっと組み合わせ方がよくないかもです。
結局今だと、Smartyにデータ(外部ファイル)を再取得するかどうかを判断させちゃっているし
それも再コンパイルが必要な操作なわけだから、それはプログラムのコードの方での判定と、
再コンパイルではなくキャッシュの更新で対応すべきということですよね。
再考してみますm(_ _)m
0968nobodyさん2012/01/12(木) 21:58:31.95ID:enIWBzTv
$smarty->template_dir = "aaaaa";

とかでtemplate_dir、compile_dirを変更しようとしてもデフォルトのとこしかみてくれないんですが、
これだけじゃ変更できないんでしょうか・・。
0969nobodyさん2012/01/12(木) 22:11:11.29ID:???
new Smarty()からdisplay()までのソースを貼れ
0970nobodyさん2012/01/13(金) 01:18:12.35ID:IZyFHZTp
test
0971 忍法帖【Lv=4,xxxP】 2012/01/21(土) 02:49:11.98ID:???
htmlspecialchars()の第一引数に日本語だけを指定すると文字が表示されなくて困ってるんですがどうしてなんでしょうか?
とんちんかんなこと聞いているかもしれませんがエスパーの方いらしたらお願いします
0972nobodyさん2012/01/21(土) 04:32:54.63ID:???
文字コードちゃんと指定してる?
実質必須だよ
0973nobodyさん2012/01/21(土) 08:43:16.52ID:???
文字コードで困ったらutf-8で統一すると、楽。
0974 忍法帖【Lv=4,xxxP】 2012/01/21(土) 23:00:14.33ID:???
>>972, 973
ありがとうございます
ロケールを指定したら解決しました!
0975!ninja2012/01/22(日) 01:46:03.48ID:???
fopen()の第一引数に変数を指定したいんですがどうすればいいですか?
たとえば
fopen('$x .txt', 'r')
のように変数(x)と文字(.txt)を結合したいです
0976nobodyさん2012/01/22(日) 01:46:23.87ID:???
fopen()の第一引数に変数を指定したいんですがどうすればいいですか?
たとえば
fopen('$x .txt', 'r')
のように変数(x)と文字(.txt)を結合したいです
0977nobodyさん2012/01/22(日) 01:47:14.02ID:???
すみません
エラーが出たので連投してしまいました
0978nobodyさん2012/01/22(日) 03:40:30.08ID:???
smarty関係ねーし
"{$x.txt}"
つーか、クォートくらい覚えろよ
0979nobodyさん2012/01/22(日) 03:40:57.43ID:???
つーか間違えたしw
"{$x}.txt"
0980nobodyさん2012/01/30(月) 01:25:51.34ID:???
>>975
> のように変数(x)と文字(.txt)を結合したいです

結合演算子は「.」(ピリオド)。

なので

$x . '.txt'

で結合できるお。
0981nobodyさん2012/01/30(月) 11:13:04.04ID:???
そんなレベルの低い話がこのスレで出てくるのがおかしいだろ
質問スレとか初心者スレとか書いてあるならまだしも、ここSmartyスレだし
レス数が950を超えています。1000を超えると書き込みができなくなります。