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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/03/29(月) 14:41:04ID:???
Smarty は PHP のためのテンプレートエンジンです。
具体的に言うと、php のプレゼンテーションからアプリケーションのロジックとコンテンツを分離して管理する事を容易にします。
これは、プログラマーとテンプレートデザイナーの役割が異なり、
これらの役割を違う人間が受け持っている場合に最適だと言えます。
0756nobodyさん2011/01/29(土) 12:58:04ID:???
はい、次の患者さん、どうぞ。
0757nobodyさん2011/01/29(土) 20:23:30ID:???
WindowsXPも出た当初は重い重い言われていたなぁ('ー`)
今そんな事言ったら逆に笑われそうだよね
0758nobodyさん2011/01/29(土) 22:03:51ID:???
>>756
引数を「いんすう」と読んでいた俺に一言
0759nobodyさん2011/01/29(土) 22:35:43ID:???
>>758
影で同僚達に「インスウwwキタww」とか言われてるよ。
0760nobodyさん2011/01/29(土) 23:04:34ID:???
>>757
VistaなんてSP1で軽量化に成功したのに重い重い言われてるよ。
SP1で改善されたと言っても笑われるだけ。
0761nobodyさん2011/01/30(日) 00:02:19ID:???
>>760
例え話なのに論点ズレてる。誰もVistaの話なんてしていない。
0762nobodyさん2011/01/30(日) 16:53:54ID:???
>>751
そういう意味なら俺の解釈が間違ってた。すまん。
>>752-753
そりゃ、最小構成でベンチとっても秒単位で差なんて出ないだろ。
俺は例で「ポータルサイト(動的サイト)」って出したけど、
そこまでの規模についての話をしてるんだよ。
>>755
>>750を読んでくれ。自分で「重くね?」って思ってググったら他人の投稿もあった。
だから俺の印象は間違ってなかったなと思ったに過ぎない。
もちろん、お前らの環境と俺の環境は違うから、コード時代に問題があるという
のもわかる。だが、頭ごなしに「FW+Smartyが重いはずはない!」って
解釈するのはいかがな物かと言いたいだけだ。

なぜか自分が大好きな物を批判されるとそれを認めたくない奴がいるが、
俺もSmartyは使ってるし、別に批判したいわけじゃない。
メリット・デメリット理解した上での使い分けが必要だと思ってるだけ。
あと、自分の意見が100%正しいとも思ってない。だから議論してるわけで。
0763nobodyさん2011/01/30(日) 16:58:36ID:???
突っ込まれる前に誤字修正
コード時代に問題が  → コード自体に問題が


あと、コードの書き方やサーバの設定(環境)によって重さを感じさせない
ように出来るって意見もあるだろうけど、
チューニングしたら重くないというのはまた別の話な気がするけどな。

ま、俺がCakePHPで書いてる書き方をいくら変えたところで
ビューにSmarty使って重いという印象は変わらないと思うよ。
Zend使えばまた別なのかも知れないけど。
0764nobodyさん2011/01/30(日) 19:37:19ID:???
日本語でおk

CakePHPってViewを処理する機構が用意されてるの?
だったらそちらを使った方が親和性が高く、処理は減る→軽くなる可能性はあるね

0.1秒の差でも100回リクエストでトータル10秒だから馬鹿に出来ない
秒単位の差が出ないから問題無いとの判断は違うと思う
最近はモデル部分の肥大化が激しくて、ビューなんざ何使っても関係ねー!って感じ

動的部分を極力JavaScriptにお任せして、ベースのHTMLもキャッシュサーバーに格納される様にしてるw
0765nobodyさん2011/01/30(日) 20:24:06ID:???
>>762
意見受け入れてないのはお前じゃね?
「自分が間違った計測の仕方してる」って可能性は一切無視ですか?

>そりゃ、最小構成でベンチとっても秒単位で差なんて出ないだろ。
>俺は例で「ポータルサイト(動的サイト)」って出したけど、
>そこまでの規模についての話をしてるんだよ。

それは無い。
プロジェクトの規模が上がっても、Smartyにかかるコストはほぼ普遍的だから、
全体が重くなればなるほど、相対的にSmartyのコストは下がる。
トータル5000msのページだろうが、10000msのページだろうが、Smartyは100ms以下でしかない。

全体処理とSmartyの処理負荷が比例しているのであれば、
それは上にも書いたようにテンプレートやプラグイン内に、
DB接続等の極端に重い処理が含まれていると考えられる。
それらは本来Smarty内に含めるべきでは無いし、
それをSmartyの実行性能として含めるべきでも無い。

ご自慢の「俺の検証結果」とやらを調べて、どのメソッドが負荷になってるか教えてくれよ。
皆で問題と解決策を見いだそうぜ。
0766nobodyさん2011/01/30(日) 20:30:04ID:???
>>765 補足
「それは無い」なんてありえないって言われそうけど、

>>753は君の言うポータルサイトのホーム画面だから。
DB数回叩いて、セッション確立して、Smartyで画面表示する程度だけど、
機能が増えても、DB叩く回数やデータを処理するロジックが複雑になるだけで、
Smartyが重くなる事は無い。

異論は君のベンチマーク結果を提示された時だけ認める。
0767nobodyさん2011/01/30(日) 22:11:51ID:???
おまいら仲いいな
俺もまぜてくれ
0768nobodyさん2011/01/30(日) 23:44:57ID:???
1回目のmsと2回目以降ののmsは?
0769nobodyさん2011/01/31(月) 01:28:30ID:???
>>768
Smartyのコンパイルキャッシュを有効にすれば2回目以降は更に軽くなる。
>>753は全く最適化も行わず、force_compile=trueにしたSmartyでの計測値。

コンパイルキャッシュ有効にして、APC等も導入すれば、
一番重い処理であるテンプレートコンパイルとinclude処理が劇的に軽くなる。
0770nobodyさん2011/01/31(月) 04:36:16ID:???
まぁ、smartyを使うのと使わないのとでは、そりゃ使ったほうが重いわな。
FW+SmartyがFWのみより重いのは当然だ。
それでも、他の人が言ってるように、全体からみれば、その重さも微々たるもので、
便利なテンプレートエンジン使えるメリットは大きい。
使わないで済むならつかわなくていいし、かといって使ってる人に"重いのによく使うな"っていうのはナンセンスってことだ。
0771nobodyさん2011/01/31(月) 06:39:47ID:???
Smarty使った場合、template_cにあるコンパイル済みPHPをincludeして
実行する分だけ遅くなると思うのだが。

それが1秒もかかるってことは・・・template_cディレクトリを
フロッピーディスクに指定してたりして。
0772nobodyさん2011/01/31(月) 09:37:11ID:???
多分使い方が下手なんだろうな
0773nobodyさん2011/01/31(月) 10:34:01ID:???
smarty単品だけ使うのってメジャーですか?
フレームワークとあわせてつかうものですか?
0774nobodyさん2011/01/31(月) 11:27:25ID:???
>なぜか自分が大好きな物を批判されるとそれを認めたくない奴がいるが、

え?そういう次元の低い話してたの?
0775nobodyさん2011/01/31(月) 13:17:00ID:???
だからsmartyはもう終わったの
dwooの時代なの
0776nobodyさん2011/01/31(月) 16:39:08ID:???
何度かdwooの話は出てきたが、すぐに消えていったな
マニュアルか何かを日本語に訳した人がいたけど、何か訳がおかしいとか言われてたっけな
導入例がないものを使うのは気が引けるという人もいたし
0777nobodyさん2011/01/31(月) 18:07:22ID:???
俺は新しい物好きだけどテンプレート書くのは別のhtml職人だからなぁ。
なかなかすぐに導入って難しいよね。
0778nobodyさん2011/01/31(月) 21:01:55ID:???
DWOO、TWIG、Smarty3と比較して、
Smarty3を実践導入したんだけど、Smarty2で不満に思っていた点はほぼ全て解消されてたわ。
プラグインも2のをそのまま使えるし、今のところ不具合も見あたらない。
乗り換え推奨したいところ。
0779nobodyさん2011/01/31(月) 22:21:04ID:???
たしか、smartyはLGPLでdwooはMITだっけ。
この違いはちょっと気になる。まぁ前者はリンクするだけならオープンにしなくていいけど、後者はほぼ何も考えなくてもいいし。
0780nobodyさん2011/01/31(月) 23:26:36ID:???
__autoload使ってる状態でsmarty3にしたら動かなかったから2に戻した
spl_autoload_registerしなきゃいけないようだ
0781nobodyさん2011/02/01(火) 19:55:26ID:???
>>778
乗り換え躊躇していただけに、心強いデス。
サンキゅ。
0782nobodyさん2011/02/02(水) 20:09:32ID:???
ZendFrameworkでいうレイアウト機能(Layout)って、Smartyに
あるのでしょうか?

(Document読みましたが見つかりませんでした・・・)
0783nobodyさん2011/02/02(水) 20:21:36ID:???
http://www.google.com/search?q=smarty+layout
0784nobodyさん2011/02/02(水) 21:27:12ID:???
>>783
ありがとうございました!!!
0785nobodyさん2011/02/07(月) 16:26:00ID:???
smartyのマニュアルに書いてある機能って全て使う機会ってありますか?
8. カスタム関数のように厳選するなら何番をよく使いますか?
http://www.smarty.net/docs/ja/index.tpl
0786nobodyさん2011/02/07(月) 16:50:43ID:???
include, foreach, if くらいしか使わないのがかっこいいと思ってる。
そのぶんPHP側でやるわけだが、労力の差し引きがゼロなら
テンプレートがシンプルなほうがエライ(`・ω・´)キリッ
0787nobodyさん2011/02/07(月) 17:02:14ID:???
>>782
悪いことは言わないがsmartyでレイアウトなんてやるな
キャッシュを手動で消さないといけないからトラブルの元になるぞ
0788nobodyさん2011/02/08(火) 10:20:52ID:???
Smarty3の{function}って地味に便利だね
今まで細々と{include}で対応していた細かいパーツ群が綺麗に纏まった。

Smarty2
{include file="/include/navigation.tpl" current="top"}

↓

Smarty3
{call show_navigation current="top"}
0789nobodyさん2011/02/08(火) 11:25:55ID:???
そのうちPHP並みに便利になりそうだな・・・
0790nobodyさん2011/02/08(火) 11:48:05ID:???
Smarty3で便利だなと俺が思ったのは継承だな。
楽になってシンプルになる。
0791nobodyさん2011/02/08(火) 12:59:02ID:???
{$array = [1,2,3]} と書ける時点である意味PHPより便利かもw

IDEの色分け(&コード補完)が浸透してくれれば、もう何も文句は無い。
0792nobodyさん2011/02/08(火) 13:24:09ID:???
・array.php
$array=[1,2,3];

・a.php
$file=file_get_contents('array.php');
eval($file);
0793nobodyさん2011/02/08(火) 19:41:30ID:???
>>792
おまえは何がしたいんだ
0794nobodyさん2011/02/12(土) 09:59:04ID:???
みなさん、smartyがバージョンアップしましたよ
0795nobodyさん2011/02/12(土) 10:26:10ID:???
http://hibari.2ch.net/test/read.cgi/php/1297364669/7
0796nobodyさん2011/02/13(日) 19:46:05ID:???
Smarty2 から Smarty3 に、何も変更なしでいけた。
こりゃいいわ。
0797nobodyさん2011/02/14(月) 14:52:52ID:???
3じゃ動かなかった
0798nobodyさん2011/02/16(水) 16:57:01ID:???
SmartyがあればCakePHPがいらないことに気づいたわ
今までCakeを勉強していた時間ってなんだったんだろう・・・
0799nobodyさん2011/02/16(水) 16:59:08ID:???
何でいらないって思ったの?
0800nobodyさん2011/02/16(水) 17:01:36ID:???
何で必要だと思うの?
0801nobodyさん2011/02/16(水) 17:04:04ID:???
>>798
何で?
0802nobodyさん2011/02/16(水) 17:09:32ID:???
何でそんなに擁護に必死なの?
0803nobodyさん2011/02/16(水) 17:10:03ID:???
まずCakePHPが必要な理由を述べるべきだな
0804nobodyさん2011/02/16(水) 17:10:45ID:???
テンプレートとフレームワークの違いを認識してない初心者
0805nobodyさん2011/02/16(水) 17:11:33ID:???
>>798
かまってちゃん乙
自分の日記で書きなさい
0806nobodyさん2011/02/16(水) 17:11:39ID:???
は?
テンプレートでフレームワークの代用は効きますよね?
0807nobodyさん2011/02/16(水) 17:12:22ID:???
自分でフレームワークが作れれば必要ないわな
0808nobodyさん2011/02/27(日) 00:24:36.73ID:???
>>798
そもそもcakephpって時点で終わってるだっよ
あれは開発現場で実際ただ飯食いを製造するだけ
0809nobodyさん2011/02/28(月) 21:34:15.77ID:???
コンパイルフォルダーにある中身は
ポストフィルターを通った後、アウトプットフィルター適用前という認識でいいんだろうか??
0810nobodyさん2011/03/04(金) 13:23:25.27ID:???
なんでこのスレは伸びないんだろうね
まあ俺も聞くことがないんだけども
0811nobodyさん2011/03/04(金) 15:29:17.45ID:???
すでに枯れてるからじゃない?
それにフレームワークと違って、そんな複雑なものでもないし。

でも、初心者が一度は通りそうなものだと思うが、最近の初心者はどうしてんだろ。
0812nobodyさん2011/03/04(金) 17:57:32.27ID:???
最近の初心者
1. if for get postなどを覚える
2. 関数を覚える
3. クラスを覚える
4. フレームワークに突入
0813nobodyさん2011/03/04(金) 20:08:42.87ID:???
変数は覚えないの?
0814nobodyさん2011/03/04(金) 20:50:42.48ID:???
むしろフレームワークの方が初心者が使うものかと
0815nobodyさん2011/03/19(土) 08:56:24.20ID:???
>なんでこのスレは伸びないんだろうね

Smartyのマニュアルが充実していて、質問することが
ないからでは。


>もそもcakephpって時点で終わってるだっよ
>あれは開発現場で実際ただ飯食いを製造するだけ

cakephpに興味ありありなので、「cakephpはただ飯食いを製造する」
という理由を教えてください。
0816nobodyさん2011/03/22(火) 06:23:02.17ID:8oP+/2xe
質問です。
aaaaa.php
<?php
require_once("*******/Smarty.class.php");

$smarty = new Smarty();

$smarty -> display("tmp_b/index.tpl");
$smarty -> assign("page","aaaaa");
?>
index.tpl
{include file="tmp_b/header.tpl"}
{include file="$page.tpl"}
{include file="tmp_b/footer.tpl"}


$pageの部分に各ページのHTMLが入るんですが、
そのHTMLの量が少ないと、ちゃんと表示されるんですが、
HTMLの量が多いと、そのpage部分全てが表示されなくなります。
何が原因なんでしょうか?
0817nobodyさん2011/03/22(火) 06:35:40.11ID:???
マルチ注意
0818nobodyさん2011/03/22(火) 14:26:46.11ID:???
>>816
えっと、たぶんそれカルシウム不足だよ。
0819nobodyさん2011/03/23(水) 19:54:59.71ID:???
>>816
$smarty -> display
$smarty -> assign
の順番が逆。

assignしてからdisplayしてごらん。
0820nobodyさん2011/03/23(水) 21:51:42.62ID:???
>>819
$smarty -> display
$smarty -> assign
を逆にしてみましたけど、まったく変化ありません。
疑問なのはHTMLの行数によってassignされたり、されなかったりすることです。
0821nobodyさん2011/03/23(水) 22:55:08.02ID:???
>>820
ちゃんとすべてのリクエストで $page に値が入ってるのは確認したのか?
それが問題ないなら提示したソースじゃなく、呼ばれたtpl側の問題じゃね?
0822nobodyさん2011/03/24(木) 00:31:19.76ID:???
修行が足りません(Lv=1)。しばらくたってから投稿してください。
0823nobodyさん2011/03/25(金) 06:14:27.80ID:???
>>816
全く表示されない状態というのは、表示もされずHTMLソースコードも
白紙ってこと?

または、テンプレ内で{debug}を入れてデバッグ情報を表示するとか、
templates_cの中身を確認してみるとか。
0824nobodyさん2011/04/21(木) 17:49:23.58ID:EKlJgMf+
質問させて下さい。

{$user->getName()|default:''}

上記のような書き方をしているのですが
$userが未定義だったりnullだったりする場合にdefaultで
指定している文字列を表示させるように設定する事は可能でしょうか?

このまま表示させると、このソースの部分でHTMLの表示が
止まって以降、真っ白になってしまいます。

なにか解決策があればご教授ください
0825nobodyさん2011/04/21(木) 23:32:35.14ID:???
>>824
defaultは、変数の値がない場合であり、
エラー処理までできんだろ。
自分で関数作るのが早いんじゃね?

そもそもphpエラーで止まって以降真っ白になってんだろ。エラー解決しないとどうしようもねぇ。
ていうか、エラー表示しとらんのか?
0826nobodyさん2011/04/29(金) 18:31:05.23ID:RGJxTFjk
{php} {/php} でテンプレート内でPHPを直接書けるけれど、
キャッシュされずに毎回動的に実行させるものはないですか?
0827nobodyさん2011/04/29(金) 18:35:05.75ID:???
テンプレートじゃなくてフレームワーク使えよ
0828nobodyさん2011/04/29(金) 21:58:28.37ID:???
最近その類はJavaScriptで処理してら
0829nobodyさん2011/04/30(土) 18:09:31.66ID:???
Smarty3なら部分キャッシュができるんじゃね?
0830nobodyさん2011/06/30(木) 23:32:24.71ID:???
デザイナー分業のためにSmartyやってみようと思ったんですが、
ぱっとみてこれデザイナー向けじゃないですよね?
すごいプログラマーよりな感じがします。
自前の作るしかないかなぁ・・・
0831nobodyさん2011/06/30(木) 23:40:19.31ID:???
自前で作ったらsmartyの意味がないじゃん
何のためにsmarty使うのかを理解しろよ
0832nobodyさん2011/06/30(木) 23:49:39.32ID:???
{$var}{include}{if}{foreach}しか使わなきゃだいじょぶだろ。
むしろそのくらいの設計にできないようじゃプログラマ側がアレだと思ってる。
0833nobodyさん2011/07/01(金) 00:49:43.59ID:???
{* 配列の利用 *}
{foreach from=$data item=value name=loop01}
<li>値は「{$value|escape}」</li>
{foreachelse}
表示させるデータがありません。
{/foreach}

だってこんなんだよ・・・
デザイナー無理だってこれ
0834nobodyさん2011/07/01(金) 01:32:46.59ID:???
仮にもいまどきのhtmlとcssを理解できるレベルのデザイナーなら、
さすがにそのくらい理解できるのでは。
0835nobodyさん2011/07/01(金) 03:46:20.60ID:???
>>833
どんなのならデザイナー理解できるの?
0836nobodyさん2011/07/01(金) 10:44:06.60ID:???
>>833
デザイナには{}の中は無視しろって言えばおk
{}の中だけSmartyの世界で他はhtmlの世界だ
簡単だろ?
0837nobodyさん2011/07/01(金) 11:22:32.48ID:???
>>835
変数オンリーかなー
制御構造は入ったらマズイね
>>833の例だと
{$data}
で
if (!$data) {
echo "表示させるデータがありません";
}
foreach ($data as $key => $value) {
echo "<li>".htmlspecialchars($value,ENT_QUOTES)."</li>"
}
を呼び出すようにしないといけない
問題はタグがliに固定されることだね

{$data orderby=id limit=5}
<tr><td>{$data.key}</td><td>{$data.value}</td></tr>
{/$data}

みたいにできたらいいんだけどね
0838nobodyさん2011/07/01(金) 11:24:20.73ID:???
>>836
タグリファレンスみたいな感じで仕様書だけ用意して
デザイナーに書いてもらうつもりだったんだけど
プログラマーが書くものなの?
0839nobodyさん2011/07/01(金) 11:56:54.49ID:???
{include}{if}{foreach}も理解できないようなデザイナって、
構造的/SEO的にまともなマークアップできるの?
DOMに沿ったCSSが書けるの?
0840nobodyさん2011/07/01(金) 11:57:21.17ID:???
>>838
そりゃそうだろ
デザイナが分岐なんてわかんねーだろ?
最初は適当に値を出力させるテンプレートを作って渡せばいいんだよ
あとはデザイナが力を発揮してhtmlをコーディングしてくれる
0841nobodyさん2011/07/01(金) 12:03:31.80ID:???
>>840
それじゃMVCの分業という概念から離れるじゃん・・・

Smartyマニュアルの
テンプレートデザイナのためのSmarty
プログラマのためのSmarty
どっちもプログラマ向けに見えるわ・・・
0842nobodyさん2011/07/01(金) 13:25:05.24ID:???
                        ヘ(^o^)ヘ いいぜ
                         |∧
                     /  /
                 (^o^)/ てめえがMVCの分業という概念
                /(  )    って物があるってなら
       (^o^) 三  / / >
 \     (\\ 三
 (/o^)  < \ 三
 ( /
 / く  まずはそのふざけた
       幻想をぶち殺す
0843nobodyさん2011/07/01(金) 14:15:09.35ID:???
結局、デザイナーってバカなの?
0844nobodyさん2011/07/01(金) 14:22:16.16ID:???
>>843
それ言わせれば、
「デザインに合わせてプログラミングできない。PGは馬鹿なの?」
ってなるぞ。
0845nobodyさん2011/07/01(金) 14:22:46.99ID:???
デザインにあわせてプログラミングって何だ?
0846nobodyさん2011/07/01(金) 14:43:54.96ID:???
俺にはこの質問をしてるやつが馬鹿に見えるが。

デザイナが主ならデザインに合わせる事になる
プログラマが主ならプログラムに合わせる事になる
0847nobodyさん2011/07/01(金) 14:44:05.19ID:???
「こういうデザインにしたいからこう出力してくれ」
って言われた事無いか?

それをするのはロジック的に負荷がかかったり、
技術的に無理な事もあるだろ。
0848nobodyさん2011/07/01(金) 14:47:01.46ID:???
>>845
俺が現状抱えている問題で、「カテゴリをパンくずにしてくれ」
ってのがあった。

DBからカテゴリ情報を取得して再帰してパンくず化するんだが、
それが凄く難しい。1行だけならともかく、複数行あるから。

出来る奴は出来ると思うけど、今の俺には無理だ
0849nobodyさん2011/07/01(金) 14:59:19.96ID:???
>>848
それのどの部分がデザインにあわせてプログラミングしてるの?
0850nobodyさん2011/07/01(金) 16:28:11.90ID:???
デザインに合わせてプログラミングできないから、
デザイナーから文句言われても仕方ないって話しだろ?
0851nobodyさん2011/07/01(金) 16:32:08.82ID:???
なんで合わせるって言葉が出るんだよ
0852nobodyさん2011/07/01(金) 17:57:00.24ID:???
デザイナのレベルに合わせて、加工済変数をassignするなり、プラグインを作るなりすればいい。
WordPressやMTのテンプレートに比べれば、Smartyの基礎なんて超簡単な部類だろう。

近年ではクライアントサイド(JS)で動的にページを生成する手法がメジャーになっているので、
変数や制御構文を理解出来ないデザイナは、完全に時代遅れだし、
それに合わせて設計するのが当たり前だとは思わない方が良い。

0853nobodyさん2011/07/01(金) 22:15:28.39ID:???
制御構造が理解できれば
そもそもテンプレートエンジンなんて使う必要ないじゃん
0854nobodyさん2011/07/01(金) 22:21:40.18ID:???
>>853
無知を晒す前に5000回くらいテンプレートエンジンの意義と、
Smartyの思想を読んでから出直した方がいい。
0855nobodyさん2011/07/01(金) 22:24:34.80ID:???
<table>
<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td><td>$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
<tr>
<td>$db['img'][N]<br>$db['img_name'][N]</td><td colspan="2">$db['img'][N]<br>$db['img_name'][N]</td>
</tr>
</table>

こんなソースを吐くにはどのようにデザインしたらいいですか?

Nはインデックスでforeachでまわします。
assign側をどうしてテンプレート側ではどうしたらいいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています