【PHP】 Smarty 隔離スレ 【テンプレート】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/02(土) 00:21:09ID:6cKcKeTp0562nobodyさん
2009/07/31(金) 10:54:30ID:???第三者からみたら、有益な討論してるように感じるんだから。
0566nobodyさん
2009/07/31(金) 15:05:22ID:???0567nobodyさん
2009/07/31(金) 16:10:10ID:???0568nobodyさん
2009/07/31(金) 18:56:10ID:???答えられない質問には煽る…典型的な厨ですね。
定量的も何も、FSの場合は >>559の 実装コストはほぼゼロ。
DBで作った場合のコストは?低学歴な僕には検討もつきません><おしえてください。
0569nobodyさん
2009/07/31(金) 19:46:53ID:???俺も低学歴だけど頑張ってみる
XOOPSみたく、ベースはファイルで、そっからDB突っ込む奴で考えてみた
> ・DBコネクション等の負荷が無い
キャッシュファイル使えばテンプレ本体がDBにあっても関係ない
> ・当然PHP側のコードもシンプル
プラグインで済むから同じ
> ・SVN等のバージョン管理システムが使える
ベースのテンプレートをファイルにすれば同じ
> ・使い慣れたエディタで直接編集が可能
コピペすれば一緒かと
> ・使い慣れたソフトでアップロード/ダウンロード/バックアックも自由自在
phpMyAdminは使い慣れたソフトってことで
> ・当然複雑な管理画面も不要になる為実装コストは激減
テキストボックスで十分じゃん
> 同等の管理画面等を作るコストも入れてくれよな。
phpMyAdminで十分
テンプレートがDBに入ってて便利なのは、
出先とかでftp,シェルが使えない環境でもブラウザで更新出来るに尽きるんじゃないかと
頑張れば携帯でも更新出来るし。。。
0570nobodyさん
2009/07/31(金) 19:49:07ID:???DB操作用のSQLでは、後者の方が自由度高いと思うけどな
0572nobodyさん
2009/07/31(金) 20:58:48ID:???0574nobodyさん
2009/07/31(金) 23:21:12ID:???> キャッシュファイル使えばテンプレ本体がDBにあっても関係ない
テンプレート更新確認の為に、DB接続されるよ。
> プラグインで済むから同じ
プラグイン作成、テストの工数がかかるよ。
> ベースのテンプレートをファイルにすれば同じ
一括でコミットしたり、指定リビジョンにロールバックしたい場合とか困るよね。
> コピペすれば一緒かと
エディタで編集→管理画面を開く→コピペ→DBにコミット→確認が、直接編集と同じ手間と?
> phpMyAdminは使い慣れたソフトってことで
ファイルやディレクトリ単位での権限管理はどうするの?
例えば一時的にディレクトリ名を変えてバックアップ取りたい場合とか、運営者にSQLを書かせるの?
> テキストボックスで十分じゃん
見た目上はそうかもしれないが、内部実装は相応のコストがかかると思うよ。
複数ファイル同時に更新しなきゃいけない場合とかもあるしさ。
> phpMyAdminで十分
上に同じ。
> テンプレートがDBに入ってて便利なのは、
> 出先とかでftp,シェルが使えない環境でもブラウザで更新出来るに尽きるんじゃないかと
> 頑張れば携帯でも更新出来るし。。。
これはDBかFSかは関係無くね?制作者的にはSQL回す方が楽ではあるだろうけど。
>>571
>>568 で答えてるよ。FSならコストゼロ、DB実装なら相応。要件次第。
高学歴の君に、DBで同等の実装をした場合のコストを教えて欲しいな。
0575nobodyさん
2009/08/01(土) 01:20:41ID:???お前がせっかく書いたレスも陳腐な物になるぞ
0577nobodyさん
2009/08/02(日) 01:41:46ID:???0579nobodyさん
2009/08/02(日) 03:05:41ID:???DB憶えたての頃は俺も無闇にDB化したがったものだ
0580nobodyさん
2009/08/03(月) 01:13:56ID:???テンプレートをDBに入れずにファイルで読み書きしてるのかな?
0581nobodyさん
2009/08/03(月) 03:29:39ID:???使ってるところは使ってるだろう(ハテナとか、スケーラビリティか何かを考慮してDBをファイル置き場に使ってるとか)
要件次第なんじゃない?
それなりの資金と開発期間があり、WEBベースで不特定多数が編集するシステム開発
とかだったらDB化した方が遙かに楽だろう。
0584nobodyさん
2009/08/03(月) 17:52:34ID:???最初から『意味も無く』FSをDBに置き換えるのがナンセンスと書いてるじゃないかw
揚げ足取りはいいから、具体的なメリットデメリットを提示してくれよ、
大手が使ってるとか、Open系CMSが使ってるからでは話にならん。
0585nobodyさん
2009/08/03(月) 18:04:36ID:???0586nobodyさん
2009/08/03(月) 18:24:53ID:???どちらも都合のいいように解釈しすぎで、この話はいつまで経っても平行線。
0587nobodyさん
2009/08/03(月) 18:59:14ID:???DB厨がファビョっているだけだ。
0588nobodyさん
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された変数に対しても文字列でなければセットすべきなのでしょうか?
とりあえずやっていますが、変化がありません
■ このスレッドは過去ログ倉庫に格納されています