【PHP】 Smarty 【テンプレートエンジン】 第2章
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2010/03/29(月) 14:41:04ID:???具体的に言うと、php のプレゼンテーションからアプリケーションのロジックとコンテンツを分離して管理する事を容易にします。
これは、プログラマーとテンプレートデザイナーの役割が異なり、
これらの役割を違う人間が受け持っている場合に最適だと言えます。
0830nobodyさん
2011/06/30(木) 23:32:24.71ID:???ぱっとみてこれデザイナー向けじゃないですよね?
すごいプログラマーよりな感じがします。
自前の作るしかないかなぁ・・・
0831nobodyさん
2011/06/30(木) 23:40:19.31ID:???何のためにsmarty使うのかを理解しろよ
0832nobodyさん
2011/06/30(木) 23:49:39.32ID:???むしろそのくらいの設計にできないようじゃプログラマ側がアレだと思ってる。
0833nobodyさん
2011/07/01(金) 00:49:43.59ID:???{foreach from=$data item=value name=loop01}
<li>値は「{$value|escape}」</li>
{foreachelse}
表示させるデータがありません。
{/foreach}
だってこんなんだよ・・・
デザイナー無理だってこれ
0834nobodyさん
2011/07/01(金) 01:32:46.59ID:???さすがにそのくらい理解できるのでは。
0836nobodyさん
2011/07/01(金) 10:44:06.60ID:???デザイナには{}の中は無視しろって言えばおk
{}の中だけSmartyの世界で他はhtmlの世界だ
簡単だろ?
0837nobodyさん
2011/07/01(金) 11:22:32.48ID:???変数オンリーかなー
制御構造は入ったらマズイね
>>833の例だと
{$data}
で
if (!$data) {
echo "表示させるデータがありません";
}
foreach ($data as $key => $value) {
echo "<li>".htmlspecialchars($value,ENT_QUOTES)."</li>"
}
を呼び出すようにしないといけない
問題はタグがliに固定されることだね
{$data orderby=id limit=5}
<tr><td>{$data.key}</td><td>{$data.value}</td></tr>
{/$data}
みたいにできたらいいんだけどね
0838nobodyさん
2011/07/01(金) 11:24:20.73ID:???タグリファレンスみたいな感じで仕様書だけ用意して
デザイナーに書いてもらうつもりだったんだけど
プログラマーが書くものなの?
0839nobodyさん
2011/07/01(金) 11:56:54.49ID:???構造的/SEO的にまともなマークアップできるの?
DOMに沿ったCSSが書けるの?
0840nobodyさん
2011/07/01(金) 11:57:21.17ID:???そりゃそうだろ
デザイナが分岐なんてわかんねーだろ?
最初は適当に値を出力させるテンプレートを作って渡せばいいんだよ
あとはデザイナが力を発揮してhtmlをコーディングしてくれる
0841nobodyさん
2011/07/01(金) 12:03:31.80ID:???それじゃMVCの分業という概念から離れるじゃん・・・
Smartyマニュアルの
テンプレートデザイナのためのSmarty
プログラマのためのSmarty
どっちもプログラマ向けに見えるわ・・・
0842nobodyさん
2011/07/01(金) 13:25:05.24ID:???|∧
/ /
(^o^)/ てめえがMVCの分業という概念
/( ) って物があるってなら
(^o^) 三 / / >
\ (\\ 三
(/o^) < \ 三
( /
/ く まずはそのふざけた
幻想をぶち殺す
0843nobodyさん
2011/07/01(金) 14:15:09.35ID:???0845nobodyさん
2011/07/01(金) 14:22:46.99ID:???0846nobodyさん
2011/07/01(金) 14:43:54.96ID:???デザイナが主ならデザインに合わせる事になる
プログラマが主ならプログラムに合わせる事になる
0847nobodyさん
2011/07/01(金) 14:44:05.19ID:???って言われた事無いか?
それをするのはロジック的に負荷がかかったり、
技術的に無理な事もあるだろ。
0848nobodyさん
2011/07/01(金) 14:47:01.46ID:???俺が現状抱えている問題で、「カテゴリをパンくずにしてくれ」
ってのがあった。
DBからカテゴリ情報を取得して再帰してパンくず化するんだが、
それが凄く難しい。1行だけならともかく、複数行あるから。
出来る奴は出来ると思うけど、今の俺には無理だ
0850nobodyさん
2011/07/01(金) 16:28:11.90ID:???デザイナーから文句言われても仕方ないって話しだろ?
0851nobodyさん
2011/07/01(金) 16:32:08.82ID:???0852nobodyさん
2011/07/01(金) 17:57:00.24ID:???WordPressやMTのテンプレートに比べれば、Smartyの基礎なんて超簡単な部類だろう。
近年ではクライアントサイド(JS)で動的にページを生成する手法がメジャーになっているので、
変数や制御構文を理解出来ないデザイナは、完全に時代遅れだし、
それに合わせて設計するのが当たり前だとは思わない方が良い。
0853nobodyさん
2011/07/01(金) 22:15:28.39ID:???そもそもテンプレートエンジンなんて使う必要ないじゃん
0854nobodyさん
2011/07/01(金) 22:21:40.18ID:???無知を晒す前に5000回くらいテンプレートエンジンの意義と、
Smartyの思想を読んでから出直した方がいい。
0855nobodyさん
2011/07/01(金) 22:24:34.80ID:???<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td colspan="2">$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
</table>
こんなソースを吐くにはどのようにデザインしたらいいですか?
Nはインデックスでforeachでまわします。
assign側をどうしてテンプレート側ではどうしたらいいのでしょうか?
0856nobodyさん
2011/07/01(金) 22:38:44.43ID:???colspan="2" とする条件次第。
普通に{foreach}ループの中で{if}分岐書けばいい。
あまり複雑になるようならPHP側で配列を整理してからassignすればいい。
0857nobodyさん
2011/07/01(金) 23:06:23.35ID:???> echo '<html>';
> echo '<body>';
> echo "<p>$msg</p>";
> echo '</body>';
> echo '</html>';
> このように書けます
> <html>
> <body>
> <p>{$msg}</p>
> </body>
> </html>
こういうアホな説明を最初にされると使う気も起きなくなるな
<html>
<body>
<p><?=$msg;></p>
</body>
</html>
でおkってなってSmartyはやっぱいらないなとお帰りになるわけだ
0858nobodyさん
2011/07/01(金) 23:32:56.31ID:???0859nobodyさん
2011/07/01(金) 23:43:15.46ID:???なぜ<$>にしなかったし
やっぱxml形式のほうがコードが綺麗に見える
0860nobodyさん
2011/07/01(金) 23:45:24.77ID:???0861nobodyさん
2011/07/01(金) 23:46:50.05ID:???0862nobodyさん
2011/07/01(金) 23:46:56.09ID:???ビジュアルプロデュースだけからHTMLとCSSゴリゴリ
目の前の戦力を最大限利用する努力、調整をするしかあるまい
0863nobodyさん
2011/07/02(土) 00:25:28.15ID:???0864nobodyさん
2011/07/02(土) 01:33:59.03ID:???Smarty3からは{}で使ってる。全く問題無い。
>>862
それ言ったらキリが無いが、
それ程低レベルなデザイナならPHPよりSmarty使わせる方が楽だし、なにより安全じゃね?w
0865nobodyさん
2011/07/02(土) 06:38:35.50ID:???2から3にしたらトラブったとかない?
0866nobodyさん
2011/07/02(土) 14:36:45.11ID:???0868nobodyさん
2011/07/03(日) 20:22:56.52ID:???PHP5系なら選ばない理由は特に無いな。
0869nobodyさん
2011/07/23(土) 08:38:49.59ID:k0EfwZvh修飾子プラグインを作ったんですが、テンプレートファイル内で
以下のようにプラグインに渡す引数にNULLを指定したらそのNULLが文字列として処理されます
{$value|myplugin:NULL}
というか、引数が''で囲まなくても文字列として処理されてしまいます
これが正常な処理なんでしょうか?
0870nobodyさん
2011/07/23(土) 10:40:38.10ID:???0872nobodyさん
2011/07/23(土) 11:32:00.35ID:???主流なフレームワークは簡易テンプレートを含むはずだし、
デザイン優先の単純なページでも、今はAJAXでJavaScriptくらい使うんだろ?
0874869
2011/07/23(土) 13:23:19.85ID:k0EfwZvh小文字にしたら上手くいきました
もう一個だけ聞いていいですか?
phpで作った配列をjavascriptで処理したいです。現在以下のようにしていますが
上手く動きません
//PHP
$myary = array('a','b','c');
$this->view->myary = $myary;
//テンプレート
<script type="text/javascript">
var myary = {$myary};
{literal}
for(var i in myary){
alert(i);
}
{/literal}
</script>
どうやってjavascriptで使えるように割り当てるんでしょうか?
0875nobodyさん
2011/07/23(土) 16:36:24.95ID:???0876869
2011/07/23(土) 17:30:01.88ID:k0EfwZvhありがとうございます
すみません、var jsAry = new Array();でした。
それで、この中にphpからassignした $myAry を割り当てれば良いんだと思うんですが、
どうやったら良いんでしょうか
foreachで$myAryをループして代入していけば良いのかと思ったんですが
<script type="text/javascript">
var jsAry = new Array();
foreach(from=$myAry key="k" item="i"){
jsAry[$k]=$i;
}
</script>
こんなことやってもうまくいきません
どういう形で{literal}したらいいのか、わかりません。どうやるべきなんでしょうか
というか、皆さんどうやってJSに配列を渡してるんですか?すみませんが教えてください。よろしくお願いします
0877nobodyさん
2011/07/23(土) 18:23:57.95ID:???0878nobodyさん
2011/07/23(土) 18:37:01.58ID:???Phpの文法が合っててもjavascriptがあってるとは限らん。
まず、生成されたhtmlソースをみろ。
0879869
2011/07/23(土) 20:02:21.45ID:k0EfwZvhもう少し考えてみます、スレ汚しすみませんでした
0880869
2011/07/23(土) 20:28:39.69ID:???jsでの配列の定義部分を丸ごとPHPで記述して変数化&assignし、
それを<script></script>の中に入れるという方法です
//php
$myAry = "new Array('a','b','c');";
$this->view->myAry = urlencode($myAry);
//テンプレート
<script type="text/javascript">
jsAry = {$myAry|urldecode}
{literal}
for(var i in jsAry){
alert(jsAry[i]);
}
{/literal}
</script>
こんな感じです。正直、もっとマシな方法があるのではと思います
引っ張って申し訳ないのですが、自分はこうやってるという方法があれば
良かったら教えてください。よろしくお願いします
0881nobodyさん
2011/07/23(土) 21:30:10.45ID:???0882869
2011/07/23(土) 22:51:27.33ID:???配列を配列のまま渡して処理したいんです
(そうすることで解決する緊急の課題があるわけじゃないんですが)
上で書いたやり方は何か力技過ぎて美しくないような
たとえばDBへのクエリの返り値をテンプレートに表示する場合
名前は{$rs.name}です って感じにやるけど、同じ$rsをjavascriptで処理する時だけ
PHPでああいう形に整形して渡さざるを得ないというのはすっきりしないというか
わがまま言ってすみません
0883nobodyさん
2011/07/23(土) 23:11:13.81ID:???0884nobodyさん
2011/07/24(日) 00:00:09.30ID:???0885869
2011/07/24(日) 03:50:48.95ID:???ありがとうございました
やっぱりそのへんの技術を使うことになるんですね
勉強してみます。ありがとうございました
0886nobodyさん
2011/07/28(木) 07:10:07.80ID:???出力する数が固定なら登録する段階で単体の変数にわけてしまったほうがいいんでしょうか?
0887nobodyさん
2011/07/28(木) 08:05:12.33ID:???0889nobodyさん
2011/07/28(木) 14:12:58.79ID:???0890nobodyさん
2011/07/28(木) 15:46:35.98ID:???ああ、まあ意味的には定数ですね。すんません。
0892nobodyさん
2011/07/28(木) 22:18:06.65ID:???0893nobodyさん
2011/07/29(金) 12:36:57.48ID:Q3BOppda使ってるsmarty2からsmarty3に更新しようと思ってるんですが、yumとかで更新する方法はなくて
ftpでアップロードするしかないんですっけ?
0894nobodyさん
2011/07/30(土) 18:37:41.92ID:???0895nobodyさん
2011/07/31(日) 02:35:57.14ID:???どうもです、結局ftpしてしまいましたがwgetてのも試してみます
rootとってるなら出来た方が得ですね
0896nobodyさん
2011/08/02(火) 03:04:44.18ID:nQxK873/PHP Warning: Invalid argument supplied for foreach() in
/usr/lib/php/Smarty/sysplugins/smarty_internal_compile_private_print_expression.php on line 57
テンプレートファイルの{$var}を一つ消してページリロードしたら消す前よりも
出力エラーの数が一つ減ったので値の処理なのかなとは思ったんですが、その先がわかりません
smarty_internal_compile_private_print_expression.phpも見たんですが恥ずかしながらわかりませんでした
これは一体何が原因なんでしょうか?解決方法があれば教えてください、お願いします
0897nobodyさん
2011/08/02(火) 06:30:58.22ID:???エラーから見ると、foreachの引数が不正ってことじゃね。
とりあえず、テンプレートに渡してる変数全部確認すれ。
0898nobodyさん
2011/08/02(火) 07:58:17.32ID:???0899nobodyさん
2011/08/03(水) 00:08:24.67ID:???いやー、でもsmartyのforeachに渡してる変数の数よりエラーの数が多いんですよね
どうやらsmarty_internal_compile_private_print_expression.phpの内部処理からたどっていくしかないか。。
>>898
そうなのかな、いちおうそのへんも確認してみます
ありがとうございました
0900nobodyさん
2011/08/03(水) 00:18:48.05ID:???0901nobodyさん
2011/08/10(水) 11:44:04.91ID:???array相当の構文を実装するのは難しいのだろうか
0902nobodyさん
2011/08/10(水) 18:37:59.86ID:???http://www.php.net/archive/2011.php#id2011-06-28-1
0903nobodyさん
2011/08/10(水) 18:39:58.58ID:???0904nobodyさん
2011/08/29(月) 14:58:11.36ID:I91Mc7xAtemplates_cのパーミッションを書き換えて
書き込み可能にしたいのですが、レンタルサーバにteraterm
から接続してもtemplates_cのフォルダが見れません。
templatesフォルダやphpファイルは見えます。
どのようにしたらパーミッションを変更できるのでしょうか?
0905nobodyさん
2011/08/29(月) 17:06:05.45ID:???0906nobodyさん
2011/08/29(月) 20:12:27.02ID:???GITで管理しているのでコピーはローカルで行いました。
filezillaからなら見えますがパーミッションの変更は拒否されてできません。
0907nobodyさん
2011/08/29(月) 20:56:24.12ID:???0908nobodyさん
2011/08/29(月) 21:28:20.53ID:I91Mc7xAfilezillaからですか?
0909nobodyさん
2011/09/02(金) 23:48:39.09ID:???リモートでgit pullでいーんじゃね?
gitはできてるみたいだし
0910nobodyさん
2011/09/02(金) 23:58:15.17ID:???smarty3を使いはじめたら
PHP Notice: function call 'get_template_vars' is unknown or deprecated. in
/usr/lib/php/Smarty/sysplugins/smarty_internal_wrapper.php on line 57, referer:
ってエラーが出てきました
これは何が原因なんでしょうか
/usr/lib/php/Smarty/plugins
/usr/lib/php/Smarty/sysplugins
の中を見てみたもののそれを実行していそうなプラグインは見つかりませんでした
0911nobodyさん
2011/09/02(金) 23:59:43.86ID:ao5DUxKxうっかり下げてしまいました。あげさせてください
0912nobodyさん
2011/09/03(土) 00:09:17.43ID:???getTemplateVarsを使うといいよ。
Smarty upgrade notesも読むとよさげ。
0914nobodyさん
2011/09/09(金) 18:04:06.20ID:???0915nobodyさん
2011/09/09(金) 19:30:48.80ID:???0917nobodyさん
2011/09/19(月) 22:04:17.01ID:???"{$content|smarty:nodefaults}" unknown modifier "smarty"' in〜
とエラーが出たもので
Smarty2と3の変更点を検索したのですが見つけられませんでした
0919nobodyさん
2011/09/19(月) 22:59:42.74ID:???http://www.smarty.net/docs/ja/variable.default.modifiers.tpl
マニュアルには普通に載っているもので、自分だけとは言わないまでもどうなのかなと思いまして
Smarty2から移行するには色々と変更しなければいけないようですね
これと同じような挙動をさせるにはどのように変更すればいいのでしょうか?
0920nobodyさん
2011/09/19(月) 23:06:04.12ID:???説明不足だと思ったもので
エラーの表示ではsmartyという修飾子がunknownと書いているようなので、|smarty:を使った書き方全般が駄目なのか、それともnodefaultsの方が駄目なのか分かりませんで質問させてもらいました
0921nobodyさん
2011/09/22(木) 00:24:16.08ID:???0922nobodyさん
2011/10/01(土) 20:48:17.76ID:???そのまま手を加えずftpでupしたら白紙ページに
なったです・・・なんでだろ・・?????
こんな経験ありませんか?
0923nobodyさん
2011/10/02(日) 14:48:13.97ID:???0925nobodyさん
2011/10/02(日) 15:45:45.60ID:???キャッシュが更新されたんですね。
精進します。
0926nobodyさん
2011/10/09(日) 19:10:40.79ID:s8jfJMraWarning: Invalid argument supplied for foreach() in
~/Smarty3/sysplugins/smarty_internal_compile_private_print_expression.php on line 57
という警告が出ます
どのように解決させればいいのか分かりません
Webで検索しても、殆ど出てきません
出てくるのはこの2chのスレばかりです(苦笑)
海外サイト見ても解決策は見当たりませんでした
どのようにすればいいのかアドバイスいただけませんでしょうか?
0928nobodyさん
2011/10/11(火) 20:29:23.96ID:???このパラメータはまだ有効なのでしょうか?
Manualにはまだarray('escape:"htmlall"')と書いてあるようですが、配列で渡すと
SmartyCompilerException、配列抜きで渡すとforeach()エラーになります
ネットで検索して、register_variablefilterというのを見つけたのですが、英語なのでよく分からないのと
Manualに載っていないようなのでどうなのかと思いまして
0929nobodyさん
2011/10/12(水) 18:59:09.19ID:???ではないのですが、私もそのエラーが出て困ってました。
>>927,928
助言ありがとうございます。言われるように、
default_modifiers = array('escape:"html"');
としたらいけました。
0930nobodyさん
2011/10/15(土) 17:40:30.06ID:???Smartyにて上にも書かれてあるようにdefault_modifiers=array('escape:"htmlall"')とした場合、
文字列を.phpファイル上にてassign()によって変数hogeに割り当てたとします
その場合、テンプレートファイル(.tpl)の出力時に文字列が本当にエスケープされているかを確認したいのですがどのようにすればいいのでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。