トップページphp
981コメント365KB

【PHP】 Smarty 【テンプレートエンジン】 第2章

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/03/29(月) 14:41:04ID:???
Smarty は PHP のためのテンプレートエンジンです。
具体的に言うと、php のプレゼンテーションからアプリケーションのロジックとコンテンツを分離して管理する事を容易にします。
これは、プログラマーとテンプレートデザイナーの役割が異なり、
これらの役割を違う人間が受け持っている場合に最適だと言えます。
0082nobodyさん2010/04/22(木) 23:59:07ID:???
>>79
> postfilterもしくはoutputfilter内で必要部分をSmatyタグに置換して、再帰的にSmartyテンプレートとして実行すればいいんじゃないのかね。
これの意味がわからね
どういう動作させる気なの?
0083nobodyさん2010/04/23(金) 00:02:20ID:???
>>結果は「できない」
お前がそう思うんならそうなんだろうな・・・お前の中では。


再帰的に処理したいならフィルタ書くなり、再帰的にfetchする実装を行えばいいだけでさほど難しくないよ。
逆に再起処理は自前で実装して再起回数を制御しないと無限ループしてしまうと思うんだけど。

Smartyがしょぼいんじゃなくて、使いこなせてないだけだろw
0084nobodyさん2010/04/23(金) 00:17:01ID:???
>>82
<a href="test{$hoge}test">を実行する。
<a href="testHOGE_VALUEtest">という出力になる。
outputfilterで<a href="{"testHOGE_VALUEtest"|urlchange}">という風に置換して、再度実行する。
別にoutputfilterでなくてもいいけど、好きなタイミングで再起処理すればいいんじゃないかね。


どうしても自前で構文解析して、一度の実行で処理したいなら{capture}タグあたりへの置換を駆使すればいいと思うよ。
0085nobodyさん2010/04/23(金) 10:10:58ID:???
いくらなんでも、
Smartyの出力処理 → HTML構文解析処理 → Smartyタグを新たに自動挿入 → Smartyの出力処理

と、毎回のアクセスでやるのは動作が重すぎるので…

>逆に再起処理は自前で実装して再起回数を制御しないと無限ループしてしまうと思うんだけど。
それこそ無限ループさせる人間がしょぼいと思うんですが…
while文は無限ループする可能性があるので実装しない。みたいなもんで、本末転倒かと
0086nobodyさん2010/04/23(金) 11:52:30ID:???
{capture}を使うことで、狙った通りの挙動が可能なのを確認しました。
今件はこれで終わりにしたいと思います。
色々ありがとうございました。
0087nobodyさん2010/04/23(金) 13:07:05ID:???
まったく役に立ってないけどな
再起処理は自前で実装して再起回数を制御しないと無限ループしてしまう(キリッ
0088nobodyさん2010/04/23(金) 13:35:31ID:???
capture関数を見ていたところ、素直にオリジナルのブロック関数を作ればよいということがわかりました。
報告しておきます。
0089nobodyさん2010/04/23(金) 15:05:36ID:???
器の小さい話だけど1人でサイト作る時は、smarty便利じゃない?
またはデザインが先に出来てて、仕組みを後から作るときとかも。

会員サイト作る時はセッションセキュ考えるのめんどくさいからFWつかっちゃうけど、
joinの嵐サイト作る時は、smartyのみ使う。

2つのキャッシュ機能使いわけが便利ですし。


と俺のお婆ちゃんが言ってた。
0090nobodyさん2010/04/23(金) 17:04:33ID:???
>>85
>>逆に再起処理は自前で実装して再起回数を制御しないと無限ループしてしまうと思うんだけど。
>それこそ無限ループさせる人間がしょぼいと思うんですが…
>while文は無限ループする可能性があるので実装しない。みたいなもんで、本末転倒かと

Smarty自身が再帰機能を持っていた場合、ループ条件はどうやって決めるのって話だが、
自前でループ条件実装しなきゃ駄目だろ?どこに実装しないなんて書いてあるの?w


>Smartyの出力処理 → HTML構文解析処理 → Smartyタグを新たに自動挿入 → Smartyの出力処理
という流れを再帰処理って言うんだけど大丈夫?
再帰処理ってわかってる?w
0091nobodyさん2010/04/23(金) 17:08:00ID:???
>>87
なんだ、お前役に立ってないって自覚してたのか、案外偉いな。

結果は「できない」(キリッ
Smartyのしょぼさがうかがえる(キリッ

とか言ってる時点で気づいて欲しかったが・・・
「できない」wとか言った人が何反論してもむなしいぜ?
0092nobodyさん2010/04/23(金) 17:47:56ID:???
俺Smartyの仕様なんてしらねーもんw
少なくともここの連中的な結論は「できない」だっただろw

もしくは再帰的にSmartyを動かせ(キリッ
おいおいw
パフォーマンスガン無視ですかw

で、真実はSmartyにちゃんと対応できる機能がありました

あれあれ?Smartyを馬鹿にするやつは使いこなせてないからだ(キリッ とか言ってた人達、使いこなしてないですねー?w
0093nobodyさん2010/04/23(金) 17:48:53ID:???
>>90
え・・・smartyタグが全て無くなったら抜けるが分岐条件だろJK
0094nobodyさん2010/04/23(金) 19:03:03ID:???
>>92
開き直りカッコイイです。
どのレスが「できない」なんて言ってるの?お前のレスだけだよw

>で、真実はSmartyにちゃんと対応できる機能がありました
ねぇよw {capture}タグに置換、ブロックタグの作成で実装したって書いてあるだろ
素人だからレスの意味もわからんのだろうけど、これ、Smartyの機能じゃなくて独自拡張な。

>>93
Smartyタグが無くなったら?
それこそ最低2回は構文解析入ってパフォーマンスガタ落ちなんじゃないの?w


目先の論破にムキになって、自分にブーメランが返ってくる良い例だな君は。
0095nobodyさん2010/04/23(金) 20:53:30ID:???
>>93は俺じゃねーよw
対応できる機能「あった」じゃん。独自拡張機能っていう機能が

でもそれを質問者に教えてあげることができなかったんでちゅよねーw
使いこなせば便利なSmarty(キリッ
Smartyに不満があるのは使いこなせてないから(キリッ
0096nobodyさん2010/04/23(金) 20:56:53ID:???
>>95
{capture}もフィルタでの置換処理も、全部>>-84までで出てるけどw
言い返せなくて脳内変換しちゃったかな?かな?

「できない」とか「無い」とか言ってる人お前くらいだよw

0097nobodyさん2010/04/23(金) 21:27:49ID:???
71 名前:nobodyさん[sage] 投稿日:2010/04/21(水) 19:37:30 ID:???
それこそアンチが言うようにPHP側で処理すればいい

74 名前:nobodyさん[sage] 投稿日:2010/04/22(木) 15:25:41 ID:???
文法間違えればそりゃエラーになるだろw

77 名前:nobodyさん[sage] 投稿日:2010/04/22(木) 19:12:29 ID:???
>>69-70
関数まで考慮するならpostfilter、outputfilterで実装出来るけども
やろうとしてる事自体の設計が間違ってると思う。

80 名前:nobodyさん[sage] 投稿日:2010/04/22(木) 23:48:30 ID:???
追記

憶測だけども、>>69は全てのリンク先に特定の処理を施したいって事だろうから、
簡単なoutputfilterで文字列置換してやるだけで実現出来ると思うよ。



captureなんてどこにもないが?
0098nobodyさん2010/04/23(金) 21:30:43ID:???
ブロック関数という言葉すらでてないな
0099nobodyさん2010/04/23(金) 21:54:14ID:???
もういじめてやるなよ
アドバイスできるほど理解のある人間が、たまたまその時間帯いなかっただけだろ
0100nobodyさん2010/04/23(金) 22:03:13ID:???
>>97
>>84
>どうしても自前で構文解析して、一度の実行で処理したいなら{capture}タグあたりへの置換を駆使すればいいと思うよ。

で、他に言いたいことは?
{capture}自体がブロックタグって事は理解してるかい?w
質問主は{capture}使ってみて、拡張したくなったから独自ブロックタグ作ったんだろ。

揚げ足取ろうと必死になってるけど、君の知識の無さを露呈してるだけになってるよw
0101nobodyさん2010/04/23(金) 22:12:29ID:???
>>69-70を実装したいなら、フィルタを使え(>>79)
>>81再帰処理が必要?なら、フィルタやfetchで自前で再帰処理実装しろ(>>83)
単純にリンク先を置換したいだけなら、outputfilterなり{capture}使え(>>80 >>84)

という具合に結論とアドバイスが出てると思うんだが、何処に「出来ない」なんて書いてあるんだろう
>>97が素人過ぎてアドバイスの意味すら理解出来なかったんだろうけど
0102nobodyさん2010/04/23(金) 22:17:43ID:???
僕に理解できるアドバイスが無い!
まともにアドバイスも出来ない低脳ばかりで、ほんっとSmartyって使えない!!って事だろ

>>97
この動画でも見ておちつけよ。お前が映ってるぞ。
http://www.youtube.com/watch?v=ph-qKLyJbkE
0103nobodyさん2010/04/23(金) 22:19:28ID:???
実用的かはともかく不可能じゃ無いよね
まぁ、誰も実装はしないだろうけど
0104nobodyさん2010/04/23(金) 22:36:47ID:???
>>100
なんだ。84「まで」って84も含むのか。明日までといった普通明日になる前を指すんだけどな。
俺が「結果はできない」って言ったのが81なのに、84を引き合いに出すあたりもなぁ・・・
0105nobodyさん2010/04/23(金) 22:44:26ID:???
あー、わかったわかった
81の「結果はできない」という言葉を

81「俺は、Smartyにそのような機能はない。できないと知っている」
と解釈したのか
単に
81「全然まともなアドバイスでないじゃんw 思想的におかしいとか逃げてるってことはできないってことかよw 
思想は別にあってるだろw 69さん残念だね、できないみたいだよw Smartyしょぼいw」

というだけのレスだったんだが
0106nobodyさん2010/04/23(金) 22:48:37ID:???
別にいいじゃねーか。
とりあえず1人はcaptureタグを挙げられる人間がいたし、そのアドバイスに従って解決したんだから。
わざわざ荒らす必要ないだろ。
カスタムブロックタグなんてマイナーな機能だから、ほとんどの人間は使ったことないだけだよ。
Smartyの凄さはそういうことだけじゃない。
0107nobodyさん2010/04/23(金) 23:27:27ID:???
必死なのはわかるが、

>>81
>>思想としてはありだから、できないのか質問に来たわけだろ?
>> 結果は「できない」 自身の定義タグを再帰的に処理できないとか、Smartyのしょぼさがうかがえるわ

この文章を

>>81「全然まともなアドバイスでないじゃんw 思想的におかしいとか逃げてるってことはできないってことかよw 
>>思想は別にあってるだろw 69さん残念だね、できないみたいだよw Smartyしょぼいw」

と解釈するのは無理がある。君はまず日本語の勉強からしたほうがいいな。
伝える力が無いとどんなコミュニティでも認めては貰えないよ。

仮にこの文章を君がそのような意図で書いたのであれば、
やはり「できない」と言っているのは君だけであり、このスレの住人は優秀。
0108nobodyさん2010/04/23(金) 23:35:35ID:???
>>104
少なくとも >>69-70 の要件であれば >>79 で完結している。
無駄に再帰が云々と要件を膨らますから>>84まで話が拡大したんだろ。

「明日」の話なぞしていないし「まで」の例えも間違えているよ。
君は「84まで読め」と言われて、83までしか読まないのかい?
やはり日本語から再度勉強し直したほうが良いだろう。
0109nobodyさん2010/04/24(土) 00:17:07ID:???
>>107
伝える気があると期待してたの?
単に言い捨ててただけだから気にしなくていいよ
Smartyか、もしくは使っている人間がしょぼいんだろうなって思っただけだから

>>108
質問者の意図からはずれていたようだがな>>79

84まで読めなんて書いてないだろ
84は質問者への正答だから、俺は「84さんは優秀で返答できた。84以外バカばっかりじゃん」と思った
それに対して「84さん以外でもちゃんと答え出せてたもん!84に至るまでにもう応えてたもん!」というあがきに見えたから「84に至るまでの間に、何も答えなんてだせてなかったじゃん」と煽った
OK?

「思想が間違ってる」だの「再帰処理は無限ループになっちゃう」だの、的外れなバカばかりがSmarty使ってるんですねって言ってるの
OK?
0110nobodyさん2010/04/24(土) 00:22:30ID:???
Smartyはすごい
Smartyは使いこなせばすばらしい
って色々な奴が言ってたけど、使いこなせてねーってのが露見したねー
まともに使えるのはほとんどいないのね
ってだけの話なのに、いつまでいいわけこいてるんだか

結局変数の埋め込み程度でしか使えない
というか「Smartyタグの埋め込みという下働き作業をさせられている側の人間」ばかりがこのスレにいるってことだろ?
0111nobodyさん2010/04/24(土) 00:38:05ID:???
一応Smarty使いこなしているつもりの人間として意見。
>>69の質問に対して、ブロック関数プラグイン作れって意見が即座に出ないのは確かにしょぼいと思う。
だが、だからといって煽っていいもんじゃない。

むしろPHP側で処理しろとか、再帰的にテンプレートとして実行しろとか、フィルタで解析しろとかは、むしろアンチの自演レスじゃないかと思える。
0112nobodyさん2010/04/24(土) 00:43:19ID:???
>>109
君がそう思うんならそうなんだろう・・・君のなかでな。

もう見苦しいからあきらめろ、な?
君がどんなに取り繕っても >>79>>69-70への返答としては的を得ているし、

君が質問者の意図とは違う再帰等の要件を盛り込んでイチャモンつけただけにすぎない。
(それすら>>84で返されちゃってるがww)

悔しいのはわかったが、君自身Smartyの知識が無いんだから、何言ったって負け犬の遠吠えだよ。
{capture}使ってどう実装するか君には理解できたかい?w
0113nobodyさん2010/04/24(土) 00:52:26ID:???
>>112
俺は111だが、>>79が的を得ているは無い
質問者を混乱させただけだと思う
0114nobodyさん2010/04/24(土) 00:57:34ID:???
79が必死すぎるw
0115nobodyさん2010/04/24(土) 01:09:20ID:???
<a href={urlchange}"test{$hoge}test"{/urlchange}>
これで一瞬で終わる話題を、なぜテンプレートの再帰処理だの{capture}だの出すのか理解に苦しむ
少なくとも>>79も、>>84も、その他何もアドバイスできなかった連中も、Smartyを自慢げに語るのは恥ずかしいと思うぞ
俺の友達は世界的に有名なんだぜ!みたいな誇り方だと思う
0116nobodyさん2010/04/24(土) 01:16:27ID:???
俺はこの騒動でブロック関数の有効な使い方学べたからありがたかったよw
>112は煽りを煽ってる場合じゃないと思う
capture使ってどう実装するか理解できたかい?wって、capture使うのはどう考えても遠周りなのになんで誇ってるのw
0117nobodyさん2010/04/24(土) 02:35:14ID:???
>>115
ごめん、俺フィルタで考えてたw
outputfilterで<a href="">を一括置換すればいいかなとか思っていた

質問主はprefilter内で<a href="">を検索して{urlchange}というブロックタグに置換してるって事でOK?
0118nobodyさん2010/04/24(土) 04:22:59ID:1DRUZqeq
あのね、
Smartyを使うということは
PHP自体を否定してるのと同義なのね。
そこら辺分かっててつかってるのかなぁ〜
この雑魚共はぁああああああああああああああ!!!!!!!!!
0119nobodyさん2010/04/24(土) 08:57:02ID:???
>>117
outputfilterはコスト高いから、なるべくキャッシュに残る前の処理であるprefilterとかで済ませたほうがいい
嫌ないい方かもしれないけど、処理コストを考えてない人がテンプレートを再帰処理とかそういう妙な発想になるんだと思うな

良くも悪くも便利なせいで、内部的な動きを知らないで激重にしている人も多いのかも
ブロック関数すら、展開された後の書式を見ればかなりすごいことやってるし
ob_start系のバリバリ使ってるんだけど、あれってコスト軽いと考えていいのかなぁ?
0120nobodyさん2010/04/24(土) 10:12:15ID:???
このスレの住民は相手を問わず喧嘩するのが大好きなんだなw
0121nobodyさん2010/04/24(土) 11:39:32ID:???
かなり進んでいるので来てみたら・・・子供のケンカかよ。
自分の主張も良いけど、相手の主張も飲めよ。
じゃないと、論理的思考なんて無理だろ。PGに向いてない。
0122892010/04/24(土) 11:43:31ID:???
ここまで俺のお婆ちゃんに同意なし。
0123nobodyさん2010/04/24(土) 13:12:55ID:???
2つのキャッシュ機能って、どれとどれ指してるの?
0124nobodyさん2010/04/24(土) 17:32:58ID:???
>>122
joinの嵐サイトってなに?
0125nobodyさん2010/04/24(土) 22:24:17ID:???
Smarty=カスの使うカスライブラリってことでFA?
0126nobodyさん2010/04/24(土) 23:05:38ID:???
そのカスライブラリのスレで煽ってるお前もカスでFA?
0127nobodyさん2010/04/25(日) 03:19:15ID:???
>>126
まぁそんなに自分を卑下するなよ。
カスなりに頑張れ。応援してるよ。
0128nobodyさん2010/04/25(日) 08:54:03ID:???
Smartyを単体で使ってもそりゃカスだよ
直接PHP埋め込んだほうが手っ取り早い

Smartyが威力を発揮するのは、他の解析エンジンと組み合わせた時。
それこそ>>69みたいな使い方した時だよ
PHPで書くと自由度が高すぎて、解析がうまくいかなくなるからね
0129nobodyさん2010/04/25(日) 18:20:47ID:???
てか、デザインとプログラムを分離するためなんじゃねーの?
0130nobodyさん2010/04/25(日) 20:49:46ID:???
>>119
出力結果の文字列置換を行う場合、
outputfilterならpreg_replace一度の実行で済むと思うけどそんなにコスト違う?
書いてるようにブロックタグ自体、展開後の書式が無駄に重い気がするが・・・

ブロックタグで処理する場合、置換箇所が増えれば増えるほどオーバーヘッドでかくならね?
それともテンプレート全体をブロックタグで囲って疑似フィルタ的に扱うのかな?
0131nobodyさん2010/04/25(日) 21:06:26ID:???
[Smarty信者の主張]

・デザインとプログラムを分離を容易にできます。
→PHPでもデザインとプログラムは分離できます。

・デザイナーとプログラマーとの分業がしやすいです。
→デザイナーはテンプレートの元になるHTMLを作り
 テンプレート自体はプログラマが作りますので
 Smartyなんか無くても生PHPで十分分業可能ですね。

何か反論ありまでしょうか?
0132nobodyさん2010/04/25(日) 21:18:34ID:???
>>131
素晴らしいです。全く反論出来ません。
貴方が絶対的に全てにおいて正しく、
貴方のように聡明な方がこんな糞スレを読む時間は、
全人類にとって損失でしかありません。

しかし残念な事に、高尚な貴方の思考は、Smarty信者のような低俗な連中には理解できないのが現状です。
Smartyを駆逐する為に、比較実証コードを作成して公の場で発表するべきです。
それがSmartyワクチンとなり、PHP界のイノベーションとなる事でしょう。

期待しています。
0133nobodyさん2010/04/25(日) 23:30:19ID:???
>>131
デザイナーがもっとも使っているソフトはDreamweaverである
→PHPをそのまま埋め込んでプレビューすると、エラーになる
→エラーを出さないようにする為には、サーバが必要
→SmartyタグならPHPと認識されないので、エラーにならない
 (ただし、デザインの崩れ等は発生するが

こういう反論はどうかな?
0134nobodyさん2010/04/25(日) 23:48:17ID:???
>>133
俺Smarty擁護派だけど、その理由だと <script language="php"></script> タグを使えばよくね?
0135nobodyさん2010/04/26(月) 09:59:01ID:???
>>130
preg_replace でも str_replaceでもなんでもいいが、正規表現を使った全文チェックが軽いと思えるのが凄い
0136nobodyさん2010/04/26(月) 17:55:31ID:???
>>135
あれ・・・上の例だと、prefilterで全文検索して、部分的にブロックタグに置換してるんだよね?
だったら出力時に一括の方が早いんじゃないかなと思っただけだよ。
0137nobodyさん2010/04/26(月) 18:10:22ID:???
prefilterは、キャッシュに残す前にやるから多少重くても問題ない
出力時は毎回アクセスでコスト発生するだろ
0138nobodyさん2010/04/26(月) 18:23:02ID:???
でも、ブロックタグの中身自体が文字列置換処理だよね?
ブロックタグが10個あれば内部的に10回置換処理が走ると思うけど、全文検索1回と比べてそんなに軽いもんなの?
0139nobodyさん2010/04/26(月) 18:49:50ID:???
置換処理の意味わかってるのか?

ブロックタグは、タグの間の文章を(通常と同じコストで)バッファに書き出し、それを引数として関数を動作させる。
置換処理なんて発生しない。
ob_stsrt(); 処理 $_tmp = ob_contents(); ob_clean();
ブロックの中身はこんな感じで取得する。通常の出力処理とコストは変わらん

それに比べ、str_replace系はHTML全文を”正規表現で”検索し、置換処理を行う。
正規表現がべらぼうに重いのは分かってるだろ?

また、一部のAタグだけ適用という方法を誤爆無くやるためには、色々細かい処理が必要。
prefilterならじっくり検証しても構わないが、outputfilterではじっくりやると毎アクセスでのレスポンスに響く。
0140nobodyさん2010/04/26(月) 19:29:47ID:???
>> ob_stsrt(); 処理 $_tmp = ob_contents(); ob_clean();
「処理」の部分で、引数に対して置換処理を行っているんじゃないの?
該当タグが増えただけ、上記処理を繰り返してしまうので結構なコストがかかる気がする。

またprefilterだとSmartyで動的に生成されるリンク(pagerとか)に対応できなくない?
ブロック関数内で正規表現かまして該当箇所を置換するとかになりそうな気がするけど・・・
0141nobodyさん2010/04/26(月) 20:18:38ID:???
Smartyの関数出力を「置換」と表現したら、Smartyで行うあらゆることが「置換」になって「置換」という言葉が意味をなさなくなるだろ…
言葉遊びしたいのか、ちゃんとした質問なのかはっきりしてくれ

>上記処理を繰り返してしまうので結構なコストがかかる気がする。
はい、ソースだしてね。obへの出力と、からの取得のコストがヘビーだっていうソースをね

>またprefilterだとSmartyで動的に生成されるリンク(pagerとか)に対応できなくない?
後付け条件出しすれば何にだって文句つけられるわ。あほくさい
0142nobodyさん2010/04/26(月) 20:35:45ID:???
質問です
バージョンは2.6.25です。

Smartyは、テンプレートを解釈した後キャッシュを生成してくれるようですが、
排他処理を行っていないように見えます

・tempnamで作ったテンポラリ名のファイルに解釈内容を出力
・キャッシュ名のファイルを削除
・テンポラリ名のファイルを、キャッシュ名にリネーム
とやっているようですが、キャッシュ名を削除した瞬間と、他プロセスでキャッシュを読んでいる瞬間が重なった場合に問題を引き起こすような気がするのですが…
0143nobodyさん2010/04/26(月) 21:35:44ID:???
気にするな
0144nobodyさん2010/04/26(月) 22:03:00ID:???
>>141
ごめん、言葉遊びじゃなくて

prefilter内で、

preg_replace('/xxxx/', '{urlchange}xxxx{/urlchange}', $source);

と変換した後にブロック関数内で

function smarty_block_urlchange($params, $content, &$smarty) {
return preg_replace("/xxxxxxx/", "xxxxx", $content);
}
という具合に何らかの文字列処理(置換)が行われるわけだよね?
preg_replaceを使うかは別として、ブロック数に比例してob_start含めたオーバーヘッドが発生するわけだが
一括処理と比較してどれだけコストが違うんだい?

>後付け条件出しすれば何にだって文句つけられるわ。あほくさい
後付けは申し訳なかったが、Aタグを書き換えたいって内容的に十分想定しうる事だと思うが・・・。
0145nobodyさん2010/04/26(月) 22:22:31ID:???
>>142
まともなOSならオープンしたファイルのi-nodeは閉じるまで変わらないよ
0146nobodyさん2010/04/27(火) 08:59:50ID:???
>>144
その後付けにも対応したくなれば、また質問しにくる。その時また考えればいい
ob_startを含めたオーバーヘッドってのがわからん。
アウトプットストリーム。
もっといえば単に文字列バッファをスタックに積むことがそんな重い処理だとはどうしても思えないな
0147nobodyさん2010/04/27(火) 16:05:31ID:???
>>146
>ob_startを含めたオーバーヘッドってのがわからん。
実際の処理では、ob_startのみじゃなくてブロック関数も実行されるでしょう?

ob_start();
smarty_block_urlchange();
$_tmp = ob_contents();
ob_clean();

仮に20カ所ブロックタグがあったら、20回上記一連の処理が実行されるわけで、
関数呼び出しのオーバーヘッドはタグ数に比例して拡大してしまう。

一括処理にすれば、1処理こそ重いものの実行コストはほぼ一定に保てる。


>もっといえば単に文字列バッファをスタックに積むことがそんな重い処理だとはどうしても思えないな
バッファ文字列に対してブロックタグ関数が実行される事を忘れてませんか?
0148nobodyさん2010/04/27(火) 17:53:34ID:???
はぁ
まぁ処理の回数の予想とかして、負荷の少ないほう選択すりゃーいいんじゃねーのー?

なんかもう、ブロック関数の呼び出しオーバーヘッドがどうのーとかまで言われ始めると
そんなレベルのオーバーヘッド気にするならPHP使うのやめたらー?とか思っちゃうんですけどー
Smartyも関数呼び出してんこもりだしさー?
0149nobodyさん2010/04/27(火) 21:27:45ID:???
>>133
本当にあなたの会社ではデザイナーにテンプレートを触らせるの?
俺の感覚ではテンプレートはプログラムの一部なので
デザイナーには絶対触らせたくないんだけど。

ちなみに今まで俺が参画してきたプロジェクトでは
最初に紙芝居のHTMLが作成されて、
その後プログラマがHTMLをテンプレートに変換しつつ実装
という流れしか無かったんだけど。
それはJavaでもPHPでも共通で。
0150nobodyさん2010/04/27(火) 23:35:20ID:???
>>149
>その後プログラマがHTMLをテンプレートに変換しつつ実装
>という流れしか無かったんだけど。

そしてシステムを納品した後に「デザイン変更して」と言われたらどうしてるの?
或いは、画像を追加してと言われたら?

CMSで構築しているサイトなら別だが、すべてそんな案件ばかりじゃないだろ。
0151nobodyさん2010/04/28(水) 00:54:25ID:???
>>150
大幅な変更ならテンプレートの元になったHTMLをデザイナーに修正依頼し
その後テンプレートに反映。小さな変更ならプログラマが修正。
WebプログラマならHTMLはもちろんCSSも分かるだろ?
0152nobodyさん2010/04/28(水) 01:41:56ID:???
>>148
ん?釣りかもしれんが負荷が云々言い出したのは >>119 だよ。

個人的にはフィルタ処理のが軽いと予測したんだが、
完全に否定されたのでどんな処理を想定したのか聞きたかっただけ。
ケースバイケースってのは把握している。
0153nobodyさん2010/04/28(水) 09:03:55ID:???
他人に説明する時に造語を使うな
フィルタ処理って、prefilterの処理もフィルタ処理だし、outputfilterの処理もフィルタ処理だ
0154nobodyさん2010/04/28(水) 11:11:16ID:???
>>144 >>147で詳細に説明してますが・・・
結局一つのレスのみを抽出して揚げ足取りしか出来ないんですね。
0155nobodyさん2010/04/28(水) 11:19:19ID:???
>>151
つまり、二重に手間がかかってるわけだな。
Smartyテンプレートをデザイナーが修正して
プログラマに渡せば良いだけなのに。
0156nobodyさん2010/04/28(水) 11:48:55ID:???
>>151
プログラマならそれがどれだけ非効率かわかるだろ?
文言やデザイン修正なんて誰でも出来るんだから、プログラマのリソースを割くのは勿体ない。
0157nobodyさん2010/04/28(水) 12:07:47ID:???
他のプログラマーに自分が使う関数を書かせるのと
デザイナーにテンプレートを書かせるのと
どのぐらい違うのだろう
0158nobodyさん2010/04/28(水) 12:51:01ID:???
>>157
全然違うし、言いたいこともわからない。
0159nobodyさん2010/04/28(水) 13:06:13ID:???
>>154
ちょっと待て。
揚げ足取りしたいとは思わないが、お前の発言が>>144>>147の続きであるというのはお前にしかわからんことだ。
関連レスも全てひっくるめて話したいなら、ID出すとかしてくれよ
0160nobodyさん2010/04/28(水) 15:07:27ID:???
>>159
>>152で関連レスとして>>119を上げてる時点で、一連の流れに対するレスだと解ると思うが・・・すまん。
でも、お前スレの流れ自体読んでないだろw

ID出しても煽りが沸くだけなので出さんよ。
0161nobodyさん2010/04/28(水) 17:42:28ID:???
>>160
「>>○でお前が言ってたのと前提変わってるじゃねーか」
のように、勝手にこっちで推測して「関連レスだな」と判断すると

「そいつは俺じゃねーよ。勝手に行間読むな」
と返されるのは匿名掲示板。

基本的に「そのレス」の内容だけしか評価せんよ。
0162nobodyさん2010/04/28(水) 18:20:46ID:???
はぁ、そうですか。

>>152は君に対しての発言じゃないし、
>>153はスレを読む気も無い人が、1レスを拾って横やりいれてきただけって事だね。

やっぱりただの揚げ足取りじゃんw
0163nobodyさん2010/04/28(水) 18:36:09ID:???
どう読めばそうなるのか知らんが、まぁそう思いたいならそう思えばいいんじゃないか
とりあえず唐突な造語は使わんほうがいいよ
0164nobodyさん2010/04/28(水) 18:43:01ID:???
造語じゃなくて、outputもpreもpostも含めてフィルタ処理だろ・・・
お前職場でもそんな揚げ足取りばっかやってるん?
0165nobodyさん2010/04/28(水) 20:15:47ID:???
ひとつだけ言わせろ。つまらん事で結果するな。
あと、PGなら相手の主張も一旦受け止めて反論しろ。
0166nobodyさん2010/04/28(水) 20:16:40ID:???
結果 → 喧嘩
0167nobodyさん2010/04/29(木) 12:50:21ID:???
smartyスレってこういうのが宿命なんだな
0168nobodyさん2010/04/30(金) 08:52:54ID:???

>>164
>造語じゃなくて、outputもpreもpostも含めてフィルタ処理だろ・・・



>>119
>output『filter』はコスト高いから、なるべくキャッシュに残る前の処理であるpre『filter』とかで済ませたほうがいい
0169nobodyさん2010/04/30(金) 12:28:49ID:???
人たたきをしてる方の論が間違ってるってのが、こういうスレでの常識。
0170nobodyさん2010/04/30(金) 17:32:00ID:???
>>168
あれ、都合悪い時だけ前後のレス読むんだ?w

119からの流れ読んでればブロック関数よりフィルタ(preにせよpostにせよ)で処理するほうが早いと思ったと伝わると思うんだが。
0171nobodyさん2010/04/30(金) 17:43:57ID:???
>>170
結局、自分の言い間違いを指摘されて逆切れしてただけかよ
勘弁してくれ
0172nobodyさん2010/04/30(金) 18:04:54ID:???
>>170
> フィルタ(preにせよpostにせよ)
釣りかよ。
質問主の要件満たせてねーじゃねーか。
0173nobodyさん2010/04/30(金) 18:27:56ID:???
で、結論としてフィルタとブロックのコストの違いは?
0174nobodyさん2010/04/30(金) 18:29:18ID:???
フィルタ(preにせよpostにせよ) と ブロック関数のコストの違いだったら、圧倒的にブロック関数の方が不利
ブロック関数は出力毎に作動するから

preとpostのフィルタは出力毎には動作しないからコストが無い
0175nobodyさん2010/04/30(金) 18:39:14ID:???
>>119 のやってるprefilterでブロック関数を生成と、outputfilterならどっちがコスト高い?

俺の認識でh
0176nobodyさん2010/04/30(金) 18:41:09ID:???
>>119 のやってるprefilterでブロック関数を生成と、outputfilterならどっちがコスト高い?

俺の認識ではブロック関数は、
ブロック内の出力にoutputfilterをかけるようなものなので、
さほどコストに違いなは無いと思うが。
0177nobodyさん2010/04/30(金) 18:51:08ID:???
実験してみた。

11個ほどAリンクがあるページで4800バイトの超軽いページ。
なにもしないと0.120秒程度。
ブロック関数で処理すると0.140秒程度

正規表現はめんどかったんで、ereg_replace("href=", "href2=", $content)
で、リンクの数だけとりあえず置換されるようにしてみた。
結果0.127秒程度

まあ正規表現は駄目だと思うね。ページ容量がこの程度で0.007秒も増加するし
全然細かいことができないから、urlchangeを呼んで色々やりたいという需要も満たせない
細かく事やり始めるとコストが膨大になるのも目に見えてる
0178nobodyさん2010/04/30(金) 19:03:16ID:???
むしろ、その程度なのに「駄目」だとするのはおかしくないか?
0179nobodyさん2010/04/30(金) 19:07:05ID:???
>>177
ブロック関数でereg処理すると 0.140
outputfilterでereg処理すると0.127
って事?

0180nobodyさん2010/04/30(金) 20:43:18ID:???
この差がどうでもいいレベルなら、正直どっち使ってもいいよw
質問主の需要はどちらでも満たせるし

>>179
そそ、そんな感じ。

実際はpreg_replace_callbackを使うことになるのかな?
Aタグの解釈はもっと厳密にやらないとなー
target属性とかもうまく避けないと

てか、正規表現で正確にやるのつらくね?
0181nobodyさん2010/04/30(金) 21:01:09ID:???
>>179
ブロック関数1回の呼び出しオーバーヘッドは 0.001秒ってところか
prefilterと組み合わせる手間も考えるとoutputfilterかなぁ・・・

Aタグ解釈の完璧な実装は難しいよね。
JavaScript使っていいならjQuery経由でクライアント側書き換えとかもありかもしれんね。
■ このスレッドは過去ログ倉庫に格納されています