【PHP】 Smarty 隔離スレ 【テンプレート】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/02(土) 00:21:09ID:6cKcKeTp0588nobodyさん
2009/08/03(月) 20:12:30ID:???0589nobodyさん
2009/08/03(月) 21:44:15ID:???とりあえず君のすばらしい経験談と、DB捌きっぷりをこのスレに轟かせれば、
もう少しましな流れになるんじゃないかな?
(^o^)でーたべーす は すごく すごい!・・・なぜなら、すごいから!
(^o^)でーたべーす の すごさがわからないやつは すごくない!
0590nobodyさん
2009/08/03(月) 22:23:10ID:???丸く納まってよかった。
0591nobodyさん
2009/08/03(月) 22:34:30ID:???開発ペース遅すぎるよね。
0592nobodyさん
2009/08/04(火) 00:10:08ID:???0595nobodyさん
2009/08/04(火) 01:51:48ID:???基本的にはFSじゃないかね。
DBは使う必要があれば使えばいい。
あまり思い浮かばないし、実例も聞かないけどね。
0597nobodyさん
2009/08/04(火) 09:05:44ID:???0599nobodyさん
2009/08/04(火) 11:24:56ID:???0600nobodyさん
2009/08/10(月) 18:05:18ID:euq/7Zv+テンプレートファイル内で、{php}〜{/php}って形で、phpのプログラムを実行出来ますが、
この「〜」の部分で、assignされた変数を操作することは出来ないでしょうか
{php}
//ここで{$name}の中身を変更したり、{$name}をキーにして画像を出力する関数を実行したい
{/php}
私の名前は{$name}です
こんな感じで…
よろしくお願いします。
0601nobodyさん
2009/08/10(月) 18:19:27ID:???やった事ないけど、Smartyインスタンスをなんらかの形で参照すれば出来るんじゃない?
グローバル変数にするとか、シングルトン使うとか、etc
0602nobodyさん
2009/08/10(月) 18:26:43ID:euq/7Zv+ありがとうございます、やっぱり呼び出し元でやるべきなんでしょうか?
いまassignされて引き渡されるデータが配列一つなので、それを元にテンプレートでやった方がスマートなんですよね
呼び出し元で各値の条件分岐分やるとassign assign assign…とassignだらけになってしまうので
テンプレ長くする方が問題かなぁ
0603nobodyさん
2009/08/10(月) 18:35:23ID:???もしかしてこんな感じで解決しない?
if(...) {
$a=1;
} else {
$a=2;
}
$smarty->assign('a',$a);
0604nobodyさん
2009/08/10(月) 18:43:35ID:euq/7Zv+ありがとうございます、そうですねー、確かにassign段階で書くとそんな感じですよね
決めました。そうします。
テンプレかアクションかどっちかが絶対ゴチャゴチャするなら一緒ですねもう。
いや、テンプレ変更する時のデメリットの方が大きそうだし。。
アドバイスありがとうございました!
0606nobodyさん
2009/08/10(月) 19:21:31ID:???テンプレートとロジックの切り分けは、そのゴチャゴチャを纏める事にあるんだよw
アクションとテンプレ両方で値を編集しちゃうと、
どこでバグが発生したか突き止められなくなっちゃうでせう。
0607nobodyさん
2009/08/10(月) 19:38:15ID:???例えば、入力任意のファックス番号とかあったとして、必須入力だったら確かにテンプレでは配列そのまま使って
FAX:{$ary.faxNum} で済むけど、必須じゃないんでその前段階のアクションで
if($ary['faxNum'];){$faxNum = $ary['faxNum'];}
else{$faxNum = "-";}
//assign処理
ってやる必要あるじゃないですか。それが嫌だったんですよ。
必須入力じゃない項目の数だけassignしまくらなきゃいけない。めんどくさいなぁと。
そこでphpかsmartyの構文で、テンプレの中で{if}とかしようと思ったんだけど…
でも、確かに>>606の言う通り、あっちこっちにまたがって値を編集しちゃダメですね。
smarty構文はデザインとか見た目(まさにテンプレート)を自動生成するためだけに使わなきゃなぁと
ようやく結論づきました。
0608nobodyさん
2009/08/10(月) 20:32:12ID:???if(!isset($ary['faxNum'])) ($ary['faxNum'] = "-";
って書いて、$ary変数だけassignすればいいんじゃない?
その程度の表示分岐処理なら、テンプレート側でもOKかと思う。
{$ary.faxNum|default:"-"}
でいけない?
0609nobodyさん
2009/08/10(月) 20:50:18ID:???ひょっとしたら先々仕様変更で「入ってまへんで、へよへよ」と表示するようになるかもしれん。
そのとき内部データにそんな値(内容)入れたくないだろ?
608の後半みたいにテンプレ側でやった方がいいよ。
0611nobodyさん
2009/08/10(月) 23:13:31ID:???{if}--{/if}の中で、smarty変数を生成できないの? assignと同じことをしたいんだけど
{if $var eq "hoge"}
$newVar = "hogeでした";
{/if}
みたいな…
0612nobodyさん
2009/08/10(月) 23:15:44ID:???0614nobodyさん
2009/08/11(火) 01:09:27ID:???0616nobodyさん
2009/08/11(火) 03:33:31ID:???assignタグすら知らんかったのか。
0617nobodyさん
2009/08/11(火) 12:14:27ID:???0618nobodyさん
2009/08/12(水) 05:56:44ID:???[0] => Array ( [id] => 7 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明1 [photoName] => galleryPic7 [photo_on] => 1 )
[1] => Array ( [id] => 9 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明2 [photoName] => galleryPic9 [photo_on] => 1 )
[2] => Array ( [id] => 10 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明4 [photoName] => galleryPic10 [photo_on] => 1 )
)
という配列があります。
これのphotoNameを引き出したくて以下のものを実行してますがうまくいきません。何が原因でしょうか?
{foreach from=$hogeAry item=varAry}
名前は:{$varAry.photoName}<br />
{/foreach}
{$hogeAry.0.photoName} なら、ちゃんとgalleryPic7が出力されます
0619nobodyさん
2009/08/12(水) 06:23:13ID:???0620nobodyさん
2009/08/12(水) 08:01:33ID:???{foreach from=$hogeAry item=varAry}
{foreach from=$varAry item=item key=key}
{$key}={$item}<br>
{/foreach}
{/foreach}
で中身表示テストしてみ。
0621nobodyさん
2009/08/12(水) 10:23:00ID:u9+iooGY0=z
0=z
0=z
とだけ出力して終わってます。。ループ自体はしてるってことですよね?
なんでだろ? 配列じゃないのかな。
上で書いた配列は、以下の実行結果です。(zendFWを使った、クエリの結果)
function gallery($uType,$uId){
$table = $this->_config->table->gallery;
$stt = $this->_db->fetchAll("SELECT * FROM {$table} WHERE `uType`=? AND `uId`=? AND `photo_on`=1 ORDER BY `id` LIMIT 10", array($uType,$uId));
return $stt;
}
$this->view->hogeAry = $this->_db->gallery('spot',$uId);
0622nobodyさん
2009/08/12(水) 10:32:56ID:???Smarty側に正常にassign出来てない可能性大。
1. hogeAryが正常な配列か確認。
var_dump($this->view->hogeAry);
2. hogeAryがSmartyにassignされてるか確認。
0623nobodyさん
2009/08/12(水) 11:18:13ID:u9+iooGYvar_dump($this->view->hogeAry); の結果は
$hogeAry = Array (
[0] => Array ( [id] => 7 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明1 [photoName] => galleryPic7 [photo_on] => 1 )
[1] => Array ( [id] => 9 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明2 [photoName] => galleryPic9 [photo_on] => 1 )
[2] => Array ( [id] => 10 [uId] => 10237 [uType] => hoge [photo_text] => 写真の説明4 [photoName] => galleryPic10 [photo_on] => 1 )
)
.tplでの
{$hogeAry|@var_dump} の結果は
Array ( [0] => [1] => [2] => ) 1
{$hogeAry.0.photoName} の結果は
galleryPic7
ちゃんとテンプレートまでassignされてきてるってことですよね?
foreachだけがうまくいかないってことかなー
0624nobodyさん
2009/08/12(水) 11:41:14ID:???0625nobodyさん
2009/08/12(水) 12:16:00ID:u9+iooGYすみません、varAryの中身のチェックの方法がわからなかったもので。。
{foreach item=varAry from=$hogeAry}
{$varAry|@var_dump}<br />
{/foreach}
とりあえず思いつく限りで上記をやったら
string(0) ""
string(0) ""
string(0) ""
が返ってきます
{foreach item=varAry from=$hogeAry}
{$varAry.photoName}<br />
{/foreach}
だと何も返ってきません(改行3つだけです)
ほんとに済みませんでした
0626nobodyさん
2009/08/12(水) 12:34:49ID:???本当にDBから値は取れてるのか、違う関数コールしてないか、
ただの配列なら表示できるのか、などなど。
可能だったら再現するコードも貼って。
0627nobodyさん
2009/08/12(水) 13:54:35ID:???0628nobodyさん
2009/08/12(水) 17:19:17ID:u9+iooGYどうもありがとうございます
普通の配列なら大丈夫です。同じDBから同様の手続きで取得してるクエリ結果(通常の配列)があるんですが、
それはforeachで解析できています。
{debug}はdisplay形式じゃないとダメみたいで、僕のやり方がそうじゃないので動きませんでした。
それで、今ループ処理をsection形式で試してみたんですが、section なら二次元配列の処理大丈夫でした。(以下が動きました。)
{section name=varAry loop=$hogeAry}
{$smarty.section.counter.total}<br> (このカウンターは動きませんでした)
要素: {$hogeAry[varAry].id}<br>
要素: {$hogeAry[varAry].photoName}<br>
要素: {$hogeAry[varAry].photo_text}<br>
{/section}
とりあえず、お騒がせして申し訳なかったですが、foreachは諦めてこっちで極力対応したいです。
0629nobodyさん
2009/08/13(木) 16:40:28ID:???0630nobodyさん
2009/08/21(金) 13:05:34ID:WhelcFIUテンプレート中の {$hoge}って変数に対してphpのクラス中のメソッドを実行するって可能でしょうか?
これまでは、php中で
$hoge=$instance->method($hoge1,引数1,引数2);
として、適切な値を返してたんですが、同じ事をテンプレートの中でやりたいと思います。
{$hogetext|nl2br}などでphp関数を実行できるのは知ってるんですが、調べたところメソッドの実行は
見つけられませんでした。無理なんでしょうか?
assign 前に実行すべき?
0631nobodyさん
2009/08/21(金) 14:42:48ID:???0633nobodyさん
2009/08/21(金) 22:16:33ID:???0634nobodyさん
2009/08/21(金) 22:16:56ID:???0635nobodyさん
2009/08/22(土) 00:43:33ID:qs0RE9DR{$num}というsmarty変数に対して、
function smarty_modifier_NUMtoTEXT($num,$aryName){
return $allAry[$aryName][$num];
}
というプラグインを実行したいんですがどう書いたら良いんでしょうか?
{NUMtoTEXT:$num:"boyAry"}とかやってみたんですがうまくいきません。
0636nobodyさん
2009/08/22(土) 00:59:28ID:???http://www.smarty.net/manual/ja/language.modifiers.php
0640nobodyさん
2009/08/25(火) 00:15:56ID:???php用テンプレートなのにわざわざ特殊な書式だし、頭に入らなくてしょっちゅうマニュアル見てる
頭悪くて悲しいな
0643nobodyさん
2009/08/26(水) 12:19:29ID:???検索フォームがあったとして
<input name="keyword" type="text" value="{$smarty.post.keyword}">
として検索後にデフォルト値を入れてるんだけど、
キャッシュしたらこういう事が出来ないと思って。
0644nobodyさん
2009/08/26(水) 13:37:23ID:???insertタグで出来るんじゃね?
あと検索結果画面だと思うけど、それってキャッシュするべきじゃなくね?w
するにしてもSmarty側でするもんじゃないと思う。
0645nobodyさん
2009/08/26(水) 14:37:50ID:???0646nobodyさん
2009/08/26(水) 23:01:41ID:???ページのサイドバーをキャッシュしているんだが、
その箇所に検索フォームやログインフォームが入っているんだよ。
確かにキャッシュするべきじゃないが、
部分毎にわかるとキャッシュする意味がないかな?とも思ったり。
やっぱり、設計に問題あるかも・・。
0647nobodyさん
2009/08/28(金) 14:54:05ID:45fY5t7Edbの返り値次第でサイドバーのデザインが数パターンに変わる場合、smartyのif文で書き分けするしかないのかな?
正直{if}に限らず醜いんで多用したくないんですよね…
部分的にデザインパターンを読み込むなど、他の解決方法はないですか?
0648nobodyさん
2009/08/28(金) 15:03:05ID:???0649nobodyさん
2009/08/28(金) 15:25:18ID:???0650nobodyさん
2009/08/28(金) 16:29:28ID:45fY5t7Eそうですね、それがいいですね
ありがとうございました
0651nobodyさん
2009/08/28(金) 16:30:15ID:45fY5t7Eありがとう
0652nobodyさん
2009/08/28(金) 17:53:20ID:MIAE9vSw呼び出すことはできないのでしょうか?
0653nobodyさん
2009/08/28(金) 19:07:18ID:???0654nobodyさん
2009/09/02(水) 05:34:35ID:55UeyG/q{assign var=uType value=$resultAry.uType|NumToText} みたいなことをしたいんですが
試してみてもタグがモロ出しになって修飾子が実行されてないようです。
仕様でしょうか?
書き方が変だとしたら、対処法を教えてください。よろしくお願いします。
0655nobodyさん
2009/09/02(水) 09:19:59ID:???0658nobodyさん
2009/09/06(日) 21:25:22ID:???1000アクセスある場合を想定してテストしたんだが、
約10〜15%ほどページの読み込みが早かった
0659nobodyさん
2009/09/07(月) 08:07:01ID:???0661nobodyさん
2009/09/07(月) 23:17:57ID:K7GASBY+Warning: htmlspecialchars() expects parameter 1 to be string, array given in パス modifier.escape.php on line 26
というエラーが出ます。
調べたところ、色々なサイトで同じ問題を扱ってるのを見つけました。
http://questionbox.jp.msn.com/qa4209668.html
http://pcmemorogu.blog14.fc2.com/blog-entry-20.html など
が、これらでの答えの通り、FOREACHする配列全てに $ary|smarty:nodefaults としてみたんですが
まだ完全に上記のエラーが消えません。
他にどんな可能性があるでしょうか?
配列だけでなく、通常のassignされた変数に対しても文字列でなければセットすべきなのでしょうか?
とりあえずやっていますが、変化がありません
0662nobodyさん
2009/09/07(月) 23:25:11ID:???つか二次元配列を出力しなければならない例が思いつかないけど
0663nobodyさん
2009/09/07(月) 23:49:42ID:K7GASBY+ありがとうございます
すいません、お礼書きつつ修正重ねてたら上手くいきました
foreachやsectionの中の配列だけでなく、ifの条件節部分でも配列に対しては|smarty:nodefaultsする必要があったようです。
if($testAry|count >0) を
if($testAry||smarty:nodefaults|count >0) にしたら治りました
お騒がせしました。ありがとうございました
0664nobodyさん
2009/09/08(火) 00:19:32ID:???0665nobodyさん
2009/09/08(火) 00:25:48ID:qSoCHGpfどう修正したらいいのやら、、と、調べたらありました。
http://blog.asial.co.jp/309
-----
# function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
# {
# // 配列が渡ってきたら何もせずにreturn
# if (is_array($string)) return $string;
# switch ($esc_type) {
# case 'html':
たしかにこれでよさそう。
664さんが別の方法で対応してるなら教えてもらえると嬉しいです。比べつつ勉強したいので。
自分で弄る自信はまだないんですよね、知らないところで悪影響でそうで…
0666nobodyさん
2009/09/08(火) 00:43:09ID:???if (is_array($string)) return $string;
で運用してるけど特に問題は無いよ。
配列が来た場合は、全ての要素を再帰的に処理するとかも試したけど、何か不都合があって止めた記憶・・・。
plugins_fix ディレクトリを作り、modifier.escape.php をコピーして修正を施す。
$smarty->plugins_dirの先頭にplugins_fixディレクトリを追加する。
って方法で修正を当てている。
default_modifiers使うと{debug}にも影響が出るから、同様に修正を当てたファイルをplugins_fixディレクトリに置いてる。
0667nobodyさん
2009/09/08(火) 00:47:00ID:qSoCHGpf詳しい説明ほんとにありがとうございました
debugってまだやったことないのでそっちはわからないですが、参考にさせてもらいます
ありがとうございました。
0668nobodyさん
2009/09/20(日) 18:33:32ID:???クソ公式落ちまくっててDLできないんだけど
http://www.smarty.net/
だれかソースくらいは分散しとけって忠告してやれよ
0669nobodyさん
2009/09/20(日) 18:55:26ID:???0670nobodyさん
2009/09/20(日) 19:52:57ID:???0671nobodyさん
2009/09/24(木) 18:00:24ID:???JavaScriptのライブラリのように互いに干渉してしまったりするのでしょうか?
また、調べてみると、何かテンプレートを扱う為にはPHPを学んでいても1〜数週間は馴れるまでかかると書いてありました
ですのでまず最初に一つテンプレートを使用してみようと思っているのですが、やはりSmartyが一番良いのでしょうか?
0672nobodyさん
2009/09/24(木) 18:07:40ID:???0673nobodyさん
2009/09/25(金) 14:31:20ID:???何だコレ?って感じ
今までPHP学習してきたのってあんま意味無いじゃんって思ったよ
例えばforeachとかさ
HTML?っても最初思った
0674nobodyさん
2009/09/25(金) 14:34:03ID:???0675nobodyさん
2009/09/25(金) 15:24:47ID:???それを不毛と感じるか、テンプレートエンジンの利点に気がつけるかでPGとしての資質がわかる。
0676nobodyさん
2009/09/25(金) 15:39:52ID:???0677nobodyさん
2009/09/25(金) 21:46:51ID:???0678nobodyさん
2009/09/25(金) 21:47:21ID:???0679nobodyさん
2009/09/25(金) 22:57:18ID:???0680nobodyさん
2009/09/25(金) 22:59:20ID:???0681nobodyさん
2009/09/25(金) 23:47:30ID:???0682nobodyさん
2009/09/26(土) 02:10:40ID:???[24-Sep-2009] Yes, yes I know. The Smarty 3 beta is taking much longer than expected, but we wanted to be sure we had everything right.
Our preliminary performance tests are already showing us very promising speed improvements over Smarty 2 (2-5x on average), and we're not done! To recap,
Smarty 3 is a 100% rewrite from the ground up, and it is PHP 5 only. We will be getting a feature list up with the Beta, but let me give a quick summary:
0683nobodyさん
2009/09/26(土) 04:04:41ID:???0684nobodyさん
2009/09/26(土) 09:50:48ID:???むしろ直結するのはバグ率。
0685nobodyさん
2009/09/26(土) 15:22:15ID:???まだかなりバギーだし仕様も固まり切ってないみたいだし、正式リリースは来年末くらいじゃね。
0687nobodyさん
2009/09/28(月) 17:38:33ID:???■ このスレッドは過去ログ倉庫に格納されています