【PHP】 Smarty 隔離スレ 【テンプレート】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/02(土) 00:21:09ID:6cKcKeTp0762756
2009/11/13(金) 15:11:57ID:???うん、公式がイマイチわからなくて他のサイトみてたらハマっちゃって。
今また公式見返してるけどやっぱりよくわからない
http://www.smarty.net/manual/ja/language.function.insert.php
「{insert} 関数の名前は、 ネームスペースの衝突を避けるために "insert_" によって始まる必要があります。」
ってあるけど、それじゃ上手くいかなくて
smarty_insert_hogeAction() って形でやっと上手くいったからなぁ…
こっちの方が公式よりわかりやすかった、俺が物わかり悪いんだろうけど
http://www.y2sunlight.com/ground/?PHP5.0%2F8.Smarty%A4%F2%CD%FD%B2%F2%A4%B9%A4%EB
0763nobodyさん
2009/11/13(金) 15:22:56ID:???http://www.smarty.net/manual/ja/plugins.naming.conventions.php
>PHP ファイル内で定義する プラグイン関数 は次のように指定します。
>smarty_type_name()
0764756
2009/11/13(金) 16:02:41ID:???そうなの。おおお、疑問の本質に近づいてきた、質問させて。
じゃあsmarty_insert_xxx じゃなくて insert_xxx()ってのはプラグイン(別ファイル自動読み込み)じゃないのか。
そもそもinsert_xxx()ってどこに書くの?
$smarty->assign("msg","hello"); みたいな処理を書いてるコントローラ?の.php?
それがわからなくてあっちこっち見る迷走がスタートしたんだ
0765nobodyさん
2009/11/13(金) 16:19:30ID:???0766nobodyさん
2009/11/13(金) 20:01:32ID:???0767nobodyさん
2009/11/14(土) 14:51:09ID:???0768nobodyさん
2009/11/14(土) 19:37:58ID:???みなさんは、どこまで、どんな方法でテンプレートを利用していますか?
<p class="error">※必須項目です。記入してください。</p>
<p><input type="text" name="mail" value=""></p>
1. エラーメッセージは最初からpでマークアップ済み、そのままassign、smartyには{}のみ
{$errors.mail}
2. エラーメッセージはテキスト、assign時に空欄かどうか判定してpでマークアップ、smartyには{}のみ
{$errors.mail}
3. $errorsにはテキスト、そのままassign、smartyで{if}処理
{if $errors.mail}<p class="error">{$errors.mail}</p>{/if}
4. $errorsにはテキスト、そのままassign、smartyで関数処理
{$errors.mail|markupFunction}
デザイナさんと分業する場合、
プログラム側がマークアップに関わらない3.が一番いい気がしているのですが、
少しテンプレートファイルが煩雑になるのが気になったりもします。
エラーメッセージマークアップ用の小さなテンプレートファイルを作っておいて、
4.のmarkupFunctionから読み出して利用すると比較的キレイな気もしますが、
テンプレートファイルが小分けになるのも煩雑といえば煩雑な気もします。
0769nobodyさん
2009/11/15(日) 03:44:59ID:???Apacheの連続アクセステストしたけど、アクセス回数が多ければ多いほど
キャッシュの効果は効いたよ。ただし、1.2〜3倍速くなる程度だけど。
>>768
ブログのテンプレみたいなのを作ってるが、3が一番良いよ。
MTなんかもそうだし。
0770nobodyさん
2009/11/15(日) 07:22:36ID:???エラーは常に埋め込まれ、CSSで非表示にしておく。もしエラーなら親要素にerrorというクラスを与えて、その子要素のエラーを表示するCSSを書いておく。
div p{ display:none }
div.error p{ display:block }
これでエラー時のテキストもデザイナー側で書ける。
親要素は
<div class='{$error.title}'>
って感じで、タイトル項目がエラーなら error.title に 'error' を assign しておくだけ。
0771潔癖プログラマ
2009/11/15(日) 10:24:50ID:???やはり3.ですか。
ただその場合
$errors.mailに値があればいいんですけど、
値がなくifがfalseになると、その行末の改行が無視されて
次の行のインデントが崩れちゃうのが気になります。
{/if}のあとに空白1文字入れとくと回避できますが、
「よろしくないテクニック」っぽくて好きになれません。
>>703でも話題にでていたようですが、
このsmartyの仕様は気に入りません(苦笑)。
{if $errors.mail}
<p class="error">{$errors.mail}</p>
{/if}
こんな感じで3行使うのがいまのところ最善か。
テンプレートファイルがますます煩雑に…(苦笑)。
>>770
CSSのdisplayだけで制御するのは、
自分も一瞬頭をよぎったことはありますが、
やはり気持ちが悪いですごめんなさい。
あとエラー時のテキストが「入力内容をご確認ください」程度ならいいけど、
「メールアドレスが正しくありません」
「必須入力項目です」
「文字数が多すぎます」
とか丁寧に表示してあげる場合に対応しにくい気がします。
0773nobodyさん
2009/11/15(日) 22:48:09ID:???errに <p class="error">エラーメッセージ</p> ぶち込みだわ。
0774nobodyさん
2009/11/16(月) 00:55:30ID:???汎用性やら考えると3じゃないかな。
他の方法だと、特定箇所だけ見た目を変えたい時にデザイナ側で対応しにくい気がする。
テンプレートを関数もどきとして使うような方法もありかもしれない。
// エラー表示箇所
{include file="error.tpl" error=$errors.mail}
// エラー表示テンプレート error.tpl
{if $error}
<p class="error">{$error}</p>
{/if}
0775潔癖プログラマ
2009/11/16(月) 09:18:08ID:???なるほど。4.の別解のような感じですが、
それだとincludeするテンプレファイルまでデザイナさんに任せられるので、
複数パターンのテンプレファイルが用意できたり汎用性が高そうですね。
図らずも(?)、{if}による改行問題も、
別ファイルに追い出すことで解決できてるし、
なかなか良いかもしれません。
0776nobodyさん
2009/11/16(月) 12:51:37ID:tubifOLG1秒2秒遅くなった経験がある人いるんでしょうか?
0777nobodyさん
2009/11/16(月) 23:39:48ID:???「遅い」って感じるのは鯖が悪いんだろ
0778nobodyさん
2009/11/17(火) 02:12:17ID:???古いサーバPC上でキャッシュを無効にして使っても、0.001秒の処理が0.002秒になる程度。
数値的には2倍だが、体感的にはまずわからない。
素のPHPコードに比べたら遅いと言えるが、
個人的にはメリットの方が桁違いに上かな。
0779nobodyさん
2009/11/17(火) 02:16:05ID:???よかったー。いかにもノロノロしてるような状態になるのかと思いました。
安心して作れます、ありがとう
0780nobodyさん
2009/11/17(火) 03:18:29ID:???0781nobodyさん
2009/11/17(火) 06:08:10ID:???ペース早いな
0782nobodyさん
2009/11/17(火) 13:05:14ID:???更新が少ないもしくは、更新タイミングが決っている場合にキャッシュ有効にすればいい。
大規模サイト用のチューニング項目だと思えばいいんじゃないかね。
0784nobodyさん
2009/11/19(木) 15:56:07ID:???掲示板とかね
有効にしといて書き込まれたタイミングでキャッシュ削除するのかな
0785nobodyさん
2009/11/20(金) 13:27:52ID:???りなくす
Smartyでテンプレートが無い場合に白い画面になっちゃうんで、エラーをハンドリングしたいんですけど出来ないでしょうか?
テンプレートがあるか判定なんてめんどーなことしないといけないんですかね?
0786nobodyさん
2009/11/20(金) 13:53:02ID:???そもそもfatal errorなり出るはず
0787nobodyさん
2009/11/20(金) 13:55:42ID:???0788nobodyさん
2009/11/20(金) 14:07:49ID:L1RHfQMx{
$smarty->display($tpl);
}
catch
{
なんたら
}
みたいにやりたいです。
エラーレポ調べてみます。
0789nobodyさん
2009/11/20(金) 14:24:17ID:L1RHfQMx3に設定して見ましたが例外はキャッチできませんでした。3が間違いなんでしょうか?
>>786
それは戻り値として出るということですか?
0792nobodyさん
2009/11/20(金) 14:32:43ID:L1RHfQMx素直にtemplate_exist使いたいとおもいます。
>>786
voidですね。
0793nobodyさん
2009/11/20(金) 15:02:58ID:???0794nobodyさん
2009/11/20(金) 15:05:46ID:L1RHfQMx↓
display_errors = On
httpd restart
error_reporting(E_ALL);
try
{
$smarty->display($tpl);
}
catch
{
なんたら
}
>>791
XAMPPじゃないです。それぞれソースからいれました。
0795nobodyさん
2009/11/20(金) 15:09:05ID:L1RHfQMx>>793
789への自己レスです。
0796nobodyさん
2009/11/20(金) 15:12:27ID:???(2)Smartyのファイルを調べてみる
画面が真っ白になった原因として、Smartyのファイルが壊れていることがあるのです。
http://xoops-manual.net/modules/smartsection/item.php?itemid=17
0797nobodyさん
2009/11/20(金) 15:14:35ID:???テンプレートファイルが無かった場合に出るエラーは
Smarty.class.phpの1591行目くらいにある
$this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
でしょ?
で、例外をスローさせるための案
1.当該箇所を書き換える
2.Smartyクラスを継承したMySmartyクラスを作って_fetch_resource_infoメソッドをオーバライドする
3.set_error_handler関数でwarningが発生した時に例外投げるようにする
xamppじゃないとのことなので真面目に答えてみました
0798nobodyさん
2009/11/20(金) 15:25:36ID:L1RHfQMxおぉ、まさに欲しかった回答です。
ありがとうございます。
そのワーニングで間違いないです。
1…書き換えるのは好きじゃないです。
2…うーん、処理に悩みそうです。
3…これが簡単そうです。
ちょっとがんばってみます。
たすかります。
0799nobodyさん
2009/11/21(土) 10:25:34ID:???0800nobodyさん
2009/11/21(土) 11:47:09ID:???0801nobodyさん
2009/11/21(土) 13:04:20ID:???ありがと、メールのテンプレか
就活してたときの毎ナビか何かの企業からメールに
『こんにちわ寒くなりましたね、{$username}さん』
とか、書いてあったのを思い出した
0803nobodyさん
2009/11/26(木) 11:34:27ID:tP8Fcb0Cparent.tpl中で、includeを使ってテンプレート化したヘッダを読み込ませたいと思ってるんですが
テンプレート(header.tpl)をページの種類に応じて動的に変更させたいときの手順がよくわからないです。
たとえば、動物の紹介ページでは動物の一覧を、自動車の紹介ページでは自動車の一覧をヘッダに表示したい時、
表示対象の画像や情報(動物写真/自動車写真、それぞれの名前情報など)は、includeタグの中に変数として
持ち込むしかないのでしょうか?
自分のイメージでは{include file='header.tpl' pageType='animal'}として、
変数値animalを受け手のテンプレで解釈してそれを元にDBから必要データを取得できたらいいなと思ったんですが。
(なるべく一カ所で取得プロセスを管理したいので)
そんなのは無理で、あらかじめ親のparent.tpl=parent.phpで必要データを取得して、
それをincludeに変数で渡すしかないという結論でいいのでしょうか?
今思いついた方法は、incudeタグ中の変数でpageType='animal'と渡して、それをheader.tplで
自前のmodifierに譲渡しそこから必要データ取得→出力の流れです。
もっとスマートなやり方ないでしょうか? アドバイスお願いします
0804nobodyさん
2009/11/26(木) 15:51:29ID:???何を言ってるのか良く分からないけど
>変数値animalを受け手のテンプレで解釈してそれを元にDBから必要データを取得できたらいいなと思ったんですが
すればいいのでは?
0805nobodyさん
2009/11/26(木) 15:52:24ID:???0806nobodyさん
2009/11/26(木) 16:04:59ID:???なぜmodifier?function作れば?
0807803
2009/11/26(木) 23:09:48ID:tP8Fcb0C>>804
header.tplって、単独のページとしては存在しないあくまでパーツのテンプレートなので、
index.tplに対するindex.phpの様なコントローラ(?)のファイルってheader.tplにはないのではと
考えたのですが…(header.phpにアクセスすることはないと思うので)
思い違いなのでしょうか?
>>806
勉強不足なのかもしれません、functionについて調べてみます。ありがとうございます。
0809803
2009/11/27(金) 01:09:41ID:???あ、親のページでってことですか、、なるほど!
1)ページのテーマ(animalとか)を引き渡されてDBに働きかけるphpを外部化し、
2)それをheader.tplの親のanimal.php, car.phpなどに読み込んで、
3)結果をincludeタグ渡す
って感じでいいかな。
これならデータの取得部分が複数にばらけることもないのか。。
これのデータ取得の順番を変えたものがfunctionでやるってパターンかもしれない
ありがとうございます。チャレンジしてみます
0810nobodyさん
2009/11/29(日) 07:42:11ID:wdDHDadn<?php
$var = "abc";
function smarty_function_hogefunc($params, &$smarty){
global $var;
return $var;
}
?>
上記の内容で <div>text</div>{hogefunc} としてもabcを出力しません、なぜでしょうか?
パスが通ってることは確認済みで、 $var="abc"; を echo "abc" とした場合、
abc<div>text</div>の形で出力するようです。
変数のスコープのチョンボをしてるのかなと考えてはみたんですが…
function …{〜} の外に書かれたものは正常に処理されないという仕様なんでしょうか?
申し訳ありませんが、ご意見宜しくお願いします
0811nobodyさん
2009/11/29(日) 13:22:28ID:???0812nobodyさん
2009/11/29(日) 14:16:45ID:???してみればいいじゃない。
0813810
2009/11/29(日) 23:16:09ID:???functionの中でreturn "abc"; すると、それは返すんです。
なんでかなぁ
>>811
わかりにくかったみたいですみません
0814nobodyさん
2009/11/30(月) 09:19:43ID:???・print_r($_GLOBALS)してみる
・echo $varしてみる
0815nobodyさん
2009/12/02(水) 14:25:43ID:1PNbu+TXhttp://www.youtube.com/watch?v=DyzzLwlIcpE
http://www.myspace.com/ametsub3110
http://www.youtube.com/watch?v=BDD9MZUTQzs
http://www.myspace.com/serphinjapan
(http://www.apple.com/jp/quicktime/download/)
http://www.jimbeard.com/boomer.html
http://www.jimbeard.com/Beard%20mp3s/Song%20of%20the%20Sun%20128/Camieff%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Song%20of%20the%20Sun%20128/Parsley%20Trees%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Truly%20128/Hand%20to%20Hand%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Truly%20128/Gonna%20Tell%20on%20You%20Wb.01_01.mp3
0816nobodyさん
2009/12/04(金) 17:16:31ID:???ブラウザで見るソースとcacheフォルダのキャッシュを見ると、DOCTYPEタグより上にプラグインの中身が出てしまってるんです
0817816
2009/12/05(土) 18:55:21ID:???insertプラグインって中でechoしちゃダメなのかreturnしないとイケないのか
キャッシュオフのときは正常に見えるから気付かなかった
0818nobodyさん
2009/12/07(月) 16:47:15ID:???0819nobodyさん
2009/12/09(水) 10:32:51ID:AWY/enbH0820819
2009/12/10(木) 15:56:47ID:???0821nobodyさん
2009/12/13(日) 22:00:00ID:???これだとだめなん?
ttp://www.smarty.net/manual/ja/caching.cacheable.php
0823nobodyさん
2009/12/15(火) 15:00:29ID:???のエラーが出る際に、
自分で作った404エラーページ(のテンプレ)を読み込むことはできますでしょうか?
0824nobodyさん
2009/12/15(火) 15:56:24ID:???$error_reportingを参照したらいいとおもう。
0825823
2009/12/15(火) 16:39:30ID:???0826nobodyさん
2009/12/25(金) 18:27:23ID:???マニュアルはサンプルとか説明が簡単すぎて知りたい情報が出てこないのですが・・・
例えばdefault_resource_typeプロパティで、デフォルトのfile以外の値を知りたいのに、それどころかサンプルすら書かれていなかったり困ります
リソースプラグインの事ももっと知りたいんですが見つかりません
PEARでも感じましたが、なんでこう情報が少ないんでしょうかね?
マニュアルとそのコピー以外の情報が出てきません
0827nobodyさん
2009/12/25(金) 19:02:01ID:???無いのは君の理解力だろう。
Smartyに至ってはマニュアルあれば大抵は事足りる。
リソースプラグインに関しても、マニュアル読んでわからん人には無縁なんじゃねぇかな。
あれ以上丁寧な解説求めるなら金払ってスクールにでも通えばいい。
0828nobodyさん
2009/12/25(金) 21:36:44ID:???謎があったら追い掛けてみたら?
0830nobodyさん
2009/12/27(日) 00:20:26ID:???「俺の知りたい情報が無い」ってだけじゃ、教える側もわからんだろう
default_resource_typeにしたって、リファレンスのテンプレートリソースとリソースプラグインの項目に十二分な情報載ってると思うしなぁ
ここまで枯れた技術なのに、情報が足りないってのは調べる力か理解力が無いとしか思えないんだが
0831nobodyさん
2009/12/27(日) 11:58:44ID:???0832nobodyさん
2009/12/27(日) 13:02:13ID:???0833nobodyさん
2009/12/27(日) 19:56:19ID:???「もし情報があったとしたら〜」なら同意できるんだけどな。
ブログなんかでちょこっと取り上げているサイトはあっても
ユーザー同士で語り合うようなコミュニティは無い。
マニュアル見ろよってのは当たり前の行為で、
Smartyはそれ以上の使い方(サイト構築のテンプレ利用など)があるから
使い方やアイディアをまとめたサイトがあれば良いとは思う。
0834nobodyさん
2009/12/27(日) 21:01:57ID:???0836nobodyさん
2009/12/29(火) 11:34:24ID:???0837nobodyさん
2010/01/06(水) 21:51:18ID:???マニュアルって簡潔にまとめられてるからね
>>833の言ってるようなことは俺は分かるね
Webだけじゃなく、他にも構築する時にここどうすればいいんだっけ?って時に調べられないからね
情報が少なすぎて
0838nobodyさん
2010/01/07(木) 09:11:46ID:???日本語で複数出版されてるのは恵まれてる方だと思う。
まとめサイトは自分で立ち上げて、ある程度充実させられれば
他の人も情報を集めてくれるようになるかもよ。
0839nobodyさん
2010/01/07(木) 15:20:10ID:???Smarty入門しか知らないけれど・・・?
0840nobodyさん
2010/01/07(木) 16:37:46ID:???0841nobodyさん
2010/01/07(木) 23:58:21ID:???$smarty->assignで割り当てるのは変数だからキャッシュじゃないし
0842nobodyさん
2010/01/08(金) 00:03:40ID:???0843nobodyさん
2010/01/08(金) 09:13:25ID:???WEBに溢れている情報を漁るだけで、大抵の事は答え一歩手前まで調べられるだろ・・・
0844nobodyさん
2010/01/08(金) 10:58:43ID:???0845nobodyさん
2010/01/08(金) 11:57:09ID:???0846nobodyさん
2010/01/08(金) 12:11:21ID:???0847nobodyさん
2010/01/09(土) 17:17:11ID:???0848nobodyさん
2010/01/17(日) 19:36:43ID:???0849nobodyさん
2010/01/18(月) 03:14:17ID:???0850nobodyさん
2010/01/18(月) 11:28:14ID:???2枚以上のテンプレートをdisplay()する場合もあるし
0851nobodyさん
2010/01/18(月) 14:06:09ID:AGLkXiCO$smarty->assign('pref', array('01' => '北海道', '02' => '青森'));
{$pref.01}
で北海道が取れていたのだけど、
Smarty3Beta板では
{$pref['01']}
としないと取れなくなったのは仕様変更ですか?
0852nobodyさん
2010/01/18(月) 14:06:25ID:YiIR+7Mx$hoge = array(
array("name" => "aaaaa", "value" => 1),
array("name" => "bb", "value" => 2),
array("name" => "ccc", "value" => 3),
array("name" => "dddddd", "value" => 4)
);
$fuga = array(
array("value" => 2), array("value" => 4)
);
上記二つのような配列変数があります。
Smartyを使って、$hogeの内容をチェックボックスとして表示しようと思っています。
また、$fugaの内容と一致するvalueの部分を選択状態にしておきたいです。
(例)
□aaaaa ■bb □ccc
■dddddd
テンプレート側でどのように指定すれば、上記方法を実現できるでしょうか。
{foreach}を使おうと思ってるんですが・・・
0855nobodyさん
2010/01/18(月) 15:59:06ID:???foreachでやるなら普通にループさせて
要素を出すところでifで比較してchecked入れればいいんじゃない?
$fugaのデータ構造がそのまま使えなくてちょい面倒だけど
予め使いやすいように変換するか、更にループさせて全件比較すればいいかと
0856nobodyさん
2010/01/20(水) 22:11:47ID:q80CCbb+interface iSmarty { const MY_NAME = "foo"; }
class MySmarty extends Smarty implements iSmarty {/*設定*/}
{$smarty.const.MY_NAME}
値fooが表示されることを期待したのですが、MY_NAME(定数名)が表示されてしまいます。
マニュアルの{$smarty.const}の項を見ると、defineによる例が掲載されていて
確かにdefineで定義されていれば正しく値が表示されます。
バージョン2.1なのでちょっと古いのかなとも思うんですが、
php5のコードを追加するのは無理でしょうか。
0857856
2010/01/20(水) 23:35:47ID:???拡張も考えてみたのですが、もとがphp4ですから、こちらのPHP環境と合わせて考えると
サブクラスで定義した"クラス定数"をテンプレートから呼び出すことは
おそらく無理と判断しましたm(_ _)m
確かなことは言えませんが、クラスを変数で参照できるphp5.3以降でなら
プラグイン等で機能追加できるような気がします。
0858nobodyさん
2010/01/21(木) 04:40:11ID:???マニュアルの例はもうちょっと落ち着いて見直してみたほうがいいと思うけど
0859nobodyさん
2010/01/29(金) 18:46:34ID:???インサートプラグインが1ページに5、6個あるとかなり速度低下してきてしまう
0861859
2010/01/30(土) 10:34:45ID:???今はindex.tplに{insert name="hoge"}って書いて
[insert.hoge.php]
function smarty_insert_hoge($params, &$smarty) {
if(!$smarty->is_cached('plugin_hoge.tpl', "plugin|hoge")) {
DBからデータを取ってきてassign
}
return $smarty->fetch('plugin_hoge.tpl', "plugin|hoge");
}
DBに更新を加える時にclear_cacheという感じでやってるんですが、作り方としておかしいですか?
こういうインサートプラグインが増えてくると、is_cachedとfetchをその分しなきゃいけないんで遅くなってると思うんですが
smarty3だと改善されてるんでしょうか?
0862nobodyさん
2010/01/30(土) 11:59:30ID:???■ このスレッドは過去ログ倉庫に格納されています