【PHP】 Smarty 隔離スレ 【テンプレート】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/02(土) 00:21:09ID:6cKcKeTp0706nobodyさん
2009/10/11(日) 15:43:55ID:???おれはHTMLの頭から終わりまでstripで囲ってるよ。
改行、空白によるブラウザの変なバグにも遭遇しないし、
何より若干ではあるものの軽くなる。
かっこいいかどうかで言えば、おれは改行なしのほうがかっこいいと思う。
0707nobodyさん
2009/10/11(日) 16:11:57ID:???<textarea>の中身とか
0708nobodyさん
2009/10/11(日) 17:59:26ID:???おおー、そうだそれがありました
ありがとうございました
>>707
<textarea><$hoge|nl2br></textarea>じゃ対処できないもの?
0709nobodyさん
2009/10/11(日) 18:22:54ID:???逆にliteralで囲う。
0710nobodyさん
2009/10/12(月) 00:52:20ID:???0711nobodyさん
2009/10/13(火) 01:13:00ID:???そこまで気にするなら
{if}
{assign var="hoge"}
{else}
{assign var="hoge"}
{/if}
<textarea>
{$hoge}
</textarea>
0712nobodyさん
2009/10/13(火) 23:52:48ID:B+0jNtpm0713nobodyさん
2009/10/14(水) 00:10:46ID:k/3ZY/k4↓の、アンパサンドって何の意味があるのでしょうか?
$smarty =& new Smarty;
0714nobodyさん
2009/10/14(水) 00:27:06ID:???0715nobodyさん
2009/10/14(水) 00:36:04ID:???ないよ。
PHP4でも5でもnewはリファレンスを返すんだけど、
PHP5でそれが明言されるまではnewを=するとnewなオブジェクトがコピーされるという迷信があった。
だから=&と書いてるところがたまにあるけど、Smartyマニュアルでも普通に=だ。
要するに、単なる誤解が生んだもの。
0717nobodyさん
2009/10/14(水) 01:06:18ID:???0718nobodyさん
2009/10/14(水) 01:30:24ID:???つ ttp://jp2.php.net/manual/ja/language.oop.newref.php
どこでそんな嘘をきいたん?
ちなみに5でも代入で変数のコピーが行われるのは同じ。
違うのはオブジェクトのコピー時の内部動作がハッシュテーブルの複製から
オブジェクトの実体の参照カウンタ操作になっている点。(zvalの参照カウンタとは別ね)
0719nobodyさん
2009/10/14(水) 03:14:45ID:???俺面倒だからパスね
0720nobodyさん
2009/10/15(木) 18:15:01ID:???俺も使った覚えないわ、マニュアル本にも例なんてないし。損してるんだろうか。。
0721nobodyさん
2009/10/16(金) 11:58:47ID:???使い道が思いつかんでもないが実際に
使う場面ってそうそうなさそうな。
0722nobodyさん
2009/10/20(火) 06:10:16ID:???0723nobodyさん
2009/10/20(火) 10:43:32ID:???0724nobodyさん
2009/10/21(水) 00:53:52ID:???extendリソースがあるんだけど、使い方解る人いる?
0725nobodyさん
2009/10/21(水) 10:25:55ID:???というかコレが核だと思う
後は必要に応じて・・・って感じで十分だし
0726nobodyさん
2009/10/21(水) 10:59:25ID:???どこら変がPHP5 OOPなんだよ
0727nobodyさん
2009/10/21(水) 22:34:20ID:???一方、__callでメソッドの外部化をしてる
extendリソースってどれ??
0728nobodyさん
2009/10/22(木) 01:31:12ID:???sysplugins/internal.resource_extend.php
ソースコメント読む限りでは他テンプレートエンジンのextendっぽいんだけど、
リソースとして定義されてるので、どう使っていいかよくわからんw
getTemplateSource()読むと、超強引にblockタグとか置換してるみたいなのであまり有用ではなさそうだけど・・・('A`;
2から乗り換える利点がまだ見えないなぁ
0730nobodyさん
2009/10/24(土) 20:08:39ID:???0732nobodyさん
2009/10/25(日) 08:28:37ID:???別にsmartyに限らず、独自の記法などで対応してるところはある。
Smartyじゃないとダメなら自分で作ればいいジャマイカ。
0733nobodyさん
2009/10/27(火) 00:14:32ID:???<%hogehogeLoop>と書いたら{section name=hoge loop=$id} になるように置換してるブログシステムはあるかもしれない
大体は自前でやってるか、MovableTypeの改造版じゃないかな
0736nobodyさん
2009/10/27(火) 20:55:46ID:???ttp://shop-pro.jp/
ブログじゃなくてネットショップだけど、テンプレートにsmarty使ってるね
EC CUBEの改造版なんだろうけど
0737nobodyさん
2009/10/27(火) 21:04:25ID:???ユーザー大量にいたらキャッシュ効かせても厳しい気がする
0738nobodyさん
2009/10/28(水) 05:06:51ID:???0739nobodyさん
2009/10/28(水) 11:11:33ID:???0740nobodyさん
2009/10/28(水) 13:46:19ID:???0742nobodyさん
2009/10/29(木) 11:06:44ID:???0743nobodyさん
2009/10/29(木) 21:54:28ID:???{include file="/home/gooblog/Smarty/blog/templates/comment_link.tpl"}
パスにSmarty入ってますがな
0744nobodyさん
2009/10/30(金) 22:56:36ID:???0745nobodyさん
2009/11/01(日) 07:20:38ID:ZF01kyEW0746nobodyさん
2009/11/01(日) 10:57:23ID:???確かにできないな
まあ元々プログラマーと別環境で作業すること自体難しい気はするが。
>>745
モノリンガルの俺には厳しいようだ
0748nobodyさん
2009/11/09(月) 13:54:09ID:jgJG5jObSmarty errorが表示されます。
このエラーを表示しない方法はないのでしょうか?
PHPのエラー表示をしない事で対処するしかないのでしょうか?
0749nobodyさん
2009/11/09(月) 14:06:20ID:???0750nobodyさん
2009/11/09(月) 20:59:58ID:I33d9sv+↑これ?
0751nobodyさん
2009/11/11(水) 19:01:43ID:0BFUpwQjある変数の値によって、特定の領域の内容をかなりダイナミックにレイアウトごと変更させたいんだけど
変化のバリエーションがかなり多いんで{if}でパターン分け記述するのはあまり現実的じゃないんだよね
外部でhtmlとして整形したものを丸ごとコントローラでassignさせて飲み込ませるしかないかな?
0752nobodyさん
2009/11/12(木) 03:03:02ID:???0753nobodyさん
2009/11/12(木) 07:44:56ID:dv0ticwo0754nobodyさん
2009/11/12(木) 11:31:04ID:???おー、サンキューサンキュー♪
includeって機能があったんだね、この辺から調べてみるよ
たすかったわほんと、ありがとね
0755nobodyさん
2009/11/12(木) 12:04:54ID:???0756754
2009/11/12(木) 19:22:51ID:SoSJwGM8hoge.tplに
{insert name="hogeAction" title="テスト" script="hoge_action.inc.php"}
って書いて、
同じディレクトリにあるhoge_action.inc.php に
<?php
function smarty_hogeAction($param, $smarty){
return 'あいうえお';
}
?>
って書いたんだけど「あいうえお」の出力がされない。
($param, $smarty)の引数を消して function smarty_hogeAction(){… とやってもダメだ。
何が問題かな? ご意見よろしくお願いします
0757nobodyさん
2009/11/12(木) 19:58:44ID:???× smarty_hogeAction
○ insert_hogeAction
でやってます
0758756
2009/11/12(木) 22:52:47ID:???お騒がせしました
0759nobodyさん
2009/11/13(金) 13:18:08ID:???0760756
2009/11/13(金) 14:36:48ID:???要するに
.tplでの記述は {insert name="hogeAction"}
スクリプトファイルは insert.hogeAction.php
ファイルの格納場所は /pluginsディレクトリ
として入れてりゃ良いだけの話だった。自前modifierとかわらんかった。
insertタグのscript属性とかなくても良いものを必須みたいに書いてたり、
関数名(function insert_hogeAction(-,-){-})を嘘書いてるサイトみて
変なことやりまくってたよ。恥。
0761nobodyさん
2009/11/13(金) 14:58:34ID:???0762756
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から必要データを取得できたらいいなと思ったんですが
すればいいのでは?
■ このスレッドは過去ログ倉庫に格納されています