【Smarty】PHPのテンプレートエンジン【Flexy】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2005/06/15(水) 10:35:52ID:???PHPのテンプレートエンジンを語るスレです。
Smarty:本家(英語)
http://smarty.php.net/
Smarty:日本語マニュアルとか
http://sunset.freespace.jp/smarty/
pear の HTML_Template たち
http://pear.php.net/package/HTML_Template_Flexy
http://pear.php.net/package/HTML_Template_IT
http://pear.php.net/package/HTML_Template_Sigma
http://pear.php.net/package/HTML_Template_Xipe
http://pear.php.net/package/HTML_Template_PHPLIB
patTemplate
http://www.php-tools.de/
http://www.php-j.com/tutorial/php/template.php
前スレ(現在dat落ち)【PHP】Smarty【Template】
http://pc8.2ch.net/test/read.cgi/php/1047225437/
0809nobodyさん
2007/02/22(木) 23:11:43ID:???一応変数追っかけてデバッグとか、DB自体のフィールドを増やさないような
簡単な書き足しぐらいはしてます。でも、やっぱりphpのソースのなかに
丸裸でいろんなものが散らばってるのは神経使います。冒頭に分離されてるなら
まだマシだけど、if文で配列をあるだけテーブル化して表示、みたいな奴だと、
html部のど真ん中に来ちゃいますし。
トラブルが起きたときにどっちが悪さしたのかわかりにくいし、片方が
(他人もDWで編集していることを前提にコラボ系機能が作り込まれている)
DWで、もう片方がテキストエディタで「同じファイルを」いじる、というのも、
作業的にはちと筋が悪いと思ってます。
includeは積極的に使っていきたい仕掛けではありますが、確かに
CSSベースでもテーブルベースでもDWでの編集が困難になるのですよね。
「head部はinclude・その他はDWのライブラリ」というスタンスの方が
web系の人員を増員する方針で考えるなら、むしろ好ましいのかな。
0810nobodyさん
2007/02/22(木) 23:19:43ID:???でも、テンプレートタグはHTMLデザイナ向けに簡単な設計となっているはずだから
PHPコードをベタ書きするよりはマシかなって。
0811nobodyさん
2007/02/22(木) 23:44:06ID:???なるほど。ま、やっぱりデザイナー側も勉強する必要はあるって事だな。
>>810
>>805のようなソースの場合、べた書きするのと、{}で囲ってsmarty方式に
するのと、違いがあんまり無いと思うんだよな。
まぁ、forearchとかsmarty方式の方がソースは短くなるけどさ。
0812nobodyさん
2007/02/23(金) 01:12:03ID:???そうそうあんまり変わらないと思う。むしろ「 { 」入れてエラー出て困ってたデザイナさんも居た。
でもhtmlソースに出ない{* 〜 *}形式のコメントは活用できると思う。
0813nobodyさん
2007/02/23(金) 01:15:09ID:CtBpLmme0814nobodyさん
2007/02/23(金) 01:43:49ID:???うちの場合ケースバイケースだけど
表示するか否かというフラグを渡しておいて
{if $hasItem}表示内容{/if}
と出来るようにしたり
条件が複雑だったりよく使うような物だったら
ブロック関数作って
{logined}
ログイン時用の表示
{/logined}
みたいに出来るだけ単純に書けるようにしてるよ
オーサリングツールとの連携は難しいね
Flexyとかだとなんとかなるのかなと思うけど
0815nobodyさん
2007/02/23(金) 14:43:40ID:???何倍も遅いって聞くんだけど、そんなに大きな差があるの?
0817nobodyさん
2007/02/23(金) 15:03:37ID:CtBpLmme我慢できなきゃ、Zend Optimizer入れれば。
0818nobodyさん
2007/02/26(月) 01:47:05ID:???テンプレートでCSVファイルを作り、それをダウンロードさせるようなことがしたいのです。
少し上の方に書いてあったsmarty_headerという関数をテンプレートに埋込んでみたのですが、
エラーが発生(関数が存在しない)し、使うことができませんでした。
0820nobodyさん
2007/02/26(月) 11:17:58ID:???>エラーが発生(関数が存在しない)し、使うことができませんでした。
プラグイン関数用ディレクトリのパスが通ってないだけだろ。
0821nobodyさん
2007/02/26(月) 11:23:33ID:???上のやつは自分で作ったプラグイン例としてsmarty_headerって
書いていたと思う
0822756
2007/02/26(月) 12:08:17ID:???とてもシンプルなプラグイン:
{smarty_header http_equiv="Content-Type" content="application/octet-stream"}
{smarty_header http_equiv="Content-Disposition" content="attachment; filename=myfile.csv"}
私が定義した関数です。
plugin/function.smarty_header.php
function smarty_function_smarty_header($params)
{
header("{$params[http_equiv]}: {$params[content]}");
}
0823818
2007/02/27(火) 02:39:59ID:???ですが作成されたファイルの内容がブラウザに表示されるだけで、ダウンロードのダイアログは表示されませんでした。
エラー文言ですが、
Warning: Cannot modify header information - headers already sent by 〜
と表示されます。
エラー文言が表示されることで既にHTTPヘッダが出力されてしまったのかもしれないとおもい
php.iniのdisplay_errorsをOffに倒して実行してみましたが、変わりませんでした。
やはり無理なのでしょうか。
0824nobodyさん
2007/02/27(火) 03:10:33ID:???http://jp2.php.net/manual/ja/function.header.php
0825756
2007/02/27(火) 07:35:44ID:???{smarty_header ...} は文字を出力する前に呼び出さなくちゃだめだよ。
> 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは
> PHP からの出力にかかわらず、すべての実際の出力の前にコールする必要があることです。
> 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
> 空白または空行があり、header() の前に出力が行われてしまうというものがあります。
> 同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
0826818
2007/02/27(火) 23:11:30ID:???>>825
ありがとうございます。
>頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
まさにこれでした。
824さんが提示してくださったページは知っていたのですが、理解していませんでした。
あと皆さん、smartyとは関係のない質問をしてしまい済みませんでした。
0827nobodyさん
2007/03/01(木) 09:32:48ID:???英語が苦手でなければ、こんなのはどう?
ttp://www.kuwata-lab.com/kwartz/
こんな感じでhtmlとphpを分離できる。
ttp://www.kuwata-lab.com/kwartz/img/fig01.png
ttp://www.kuwata-lab.com/kwartz/kwartz3php-users-guide.01.html#example1
0828nobodyさん
2007/03/01(木) 12:42:20ID:???0830nobodyさん
2007/03/02(金) 00:57:05ID:???ただ、痒い所に手が届かないが。
0831nobodyさん
2007/03/02(金) 09:43:20ID:???そこの人、日本人だから以前は日本語のドキュメントもあったぞ。
今は無いみたいだが。
一年前使ってみた感想は、時期尚早って感じだったかな。
メインはrubyみたいで、phpのサポは片手間って感じ。
ドキュメントに書いてあるのに実装してない構文とかも確かあったし。
(and preg_matchの配列の渡し方を間違えて、毎回初期化してるんで動かなかったりしたのを修正したのを覚えてる。)
>>830
Flexyは結構面白いんだが、「構文解析が出来る」ものだから、かなり無茶な構文を定義しているような感じがする。
以前いじった時は、スタイルシートで{hoge:fuga}のように最後のセミコロンを省略したりした場合、
Flexyのプラグインを見に行ったような・・・
これまた1〜2年前にいじったきりなんだが修正されたのかな?
0832nobodyさん
2007/03/06(火) 03:51:50ID:???みなさんははどのように作ってますか?
(仮にSmarty使用として)
1. 各コンテンツ.tplから、ヘッダ、フッタ、ナビをconfigから置換。
2. 各コンテンツ.tplから、ヘッダ.tpl、フッタ.tpl、ナビ.tplを読込み。
3. 全体デザイン.tplから、ナビ.tplとコンテンツ.tplを読込み。
4. 全体デザイン.tplから、コンテンツ.tplを読込み、
コンテンツ.tpl内でさらにナビ.tplを読込み。
┌─────────────┐
│ ヘッダ(静的) │
│┌─┐┌────────┐│
││ナ││ ページごとの ││
││ビ││ コンテンツ(動的) ││
││ ││ ││
││静││ ││
││的││ ││
│└─┘└────────┘│
│ フッタ(静的) │
└─────────────┘
私は全体のデザインを作ってしまって、
中身だけ入れ換える方式(上記3、4)が好きなのですが、
デザイナーにとっては、ファイル構成が直感的で
無くなるような気もします。
みなさんはどうしてるか参考までに聞かせてください。
0834nobodyさん
2007/03/06(火) 08:01:34ID:???デザイナーはhtmlベースな状態で管理を行って
デザインに更新があったらその都度プログラマが
変更点を確認して実際のテンプレートファイルに
手を加えるってのが一般的なんじゃないの
直感的なファイル構成にこだわる必要なんて無いと思うぜ
0835nobodyさん
2007/03/06(火) 08:53:16ID:???全体デザイン.tpl に読み込む中身.tpl を選択する
分岐入れるってこと?
俺は良く2のパターンで作るなぁ。
デザイナさんに各ページをHTMLで作ってもらって
基本的にはそれを.tplに置き換えてから手を加える感じ。
0836GoA ◆J2EE.GplLk
2007/03/06(火) 09:46:08ID:???俺はナビ部分が完全静的の場合なら、1をよくやるな。
正確に言えば、全体デザイン.tplからヘッダ・フッタ・ナビを完全固定状態で…って感じだけどな。
でも、ナビも動的にする場合がおおいので、結果として、3みたいな感じになることがおおい。
0837nobodyさん
2007/03/06(火) 10:15:32ID:???各コンテンツ.php内でコンテンツtpl名を変数に割り当てindex.tplを読み込み
index.tpl内で静的なヘッダ・フッタ+動的なコンテンツtplを読み込み
って感じ?(ナビ略)
0838nobodyさん
2007/03/06(火) 12:16:59ID:25mpWck5{section ... start=`($foo.bar-1)*($smarty.const.CONSTANT)` ...}
このようなエラーが出ました:
Fatal error: Smarty error: syntax error: $smarty. is an unknown reference
これはどうしたらよいのでしょうか?
0839838
2007/03/06(火) 12:36:12ID:25mpWck5悪いので、スクリプト側で計算させてテンプレートに振り分ける方が良い」という
ことが書いてあったのでそうします。
0841nobodyさん
2007/03/06(火) 14:33:09ID:???私の場合は、各アクションの最後にどのコンテンツtplを使用するか送るようにしてる
メニューの部分は、全アクションに継承されたクラスのコンストラクタか、
アクション終わってからセットかな。もしくはtplから直読み。
0842nobodyさん
2007/03/06(火) 14:36:46ID:???読み込む場合は{include file=$contpl}って感じね。
0843nobodyさん
2007/03/06(火) 15:39:31ID:???>>833-837,840-842
ありがとうございます。
デザイナ側からの視点だとまた違うんでしょうが、
プログラマ側からでは、3が多数という感じですね。
普段こういった事を同業に聞くこともないので
面白かったです。
0844nobodyさん
2007/03/09(金) 15:28:36ID:???ほぼ全部のテンプレートを変更しなきゃいかんよね?
(DWのテンプレ機能とかはおいといて)
文章が分かりづらくてスマソ…。
0845nobodyさん
2007/03/09(金) 15:32:27ID:???0846nobodyさん
2007/03/09(金) 16:00:37ID:???んなわきゃない
ヘッダやフッタに変更があってもレイアウトテンプレートを修正するだけだ
どう勘違いしてるんだ?
0848844
2007/03/09(金) 16:44:05ID:???まず全体ページ(例:all.tpl)を呼んで、その全体ページ(all.tpl)のなかで{include 各コンテンツ}を
呼ぶってことでしょうか?
0849nobodyさん
2007/03/09(金) 17:15:08ID:???0852nobodyさん
2007/03/10(土) 10:44:25ID:GgSEfqVF{${$loop[loop].name}}
{$$loop[loop].name}
という2つはエラーになりました。
0853nobodyさん
2007/03/10(土) 11:30:55ID:???最近Smarty使ってねえから間違ってたらすまんな
0854852
2007/03/10(土) 11:44:36ID:GgSEfqVFありがとうございます。
しかしちょっとそのやり方がわからないです。
具体的には
$loop[0]['name'] = "a40";
$loop[1]['name'] = "a43";
$loop[2]['name'] = "a58";
のように数字が続いています。
で、sectionの中で
{$a43}や{$a58}などの変数を呼び出したいのですが、どうもうまくいきません。
section が複雑にネストしてるので配列で渡すのはちょっと無理っぽいので、可変変数でなんとかしようと思った次第です。
0855nobodyさん
2007/03/10(土) 11:48:12ID:???{$var}.cde
という文字列を使いたいのですが、どのように記述すればいいでしょうか?
{if $var.cde == .....
では$varの配列とみなされてしまうようです。
0856855
2007/03/10(土) 11:49:03ID:???smartyです。
0857nobodyさん
2007/03/11(日) 14:03:45ID:???そういうことか。無理なんじゃないかな。
定数値であれば、$smarty.const.$hoge で取れるんだが、
そんな方法で変数参照出来たら、逆に危なくて仕方ないしな。
設計から見直したまえ。
0858nobodyさん
2007/03/11(日) 14:08:45ID:???// $smarty->assign('var', 'ab');
{assign var="str" value=$var|cat:"cde"}
{if $str == "abcde"}ok{/if}
0859nobodyさん
2007/03/13(火) 22:56:37ID:QJkFtOhTなんで、俺だけ出ないのか教えてくれ。
0860nobodyさん
2007/03/13(火) 23:31:57ID:???0861nobodyさん
2007/03/16(金) 21:09:00ID:???0862nobodyさん
2007/03/18(日) 02:13:43ID:???smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
smartyのautoload_filtersで、sjisテンプレをコンパイル時にutf8変換してます。
php(utf8) ← DB(utf8)
↓
smartyテンプレ(sjis) → smartyコンパイル(utf8) → 画面出力(sjis)
このように、すごーく無駄な文字コード変換が2回も入ってしまいます。
なんか他にいい方法ないでしょうか?
0863nobodyさん
2007/03/18(日) 02:43:21ID:CdbythRUassign時にShift_JISに変換すればいいと思う。
php(utf8) ← DB(utf8)
↓
assign
↓to sjis
smartyテンプレ(sjis) → smartyコンパイル(sjis) → 画面出力(sjis)
Smartyの仕組みは知らないけど、assign時にコールバック処理を入れられるな
らそれを使えばいいし、無ければSmartyのラッパークラスを用意すればいい。
0865nobodyさん
2007/03/18(日) 08:53:47ID:???頻繁に更新するものじゃなかったら、>>862さんがutf8にコンバートするとか。
0866nobodyさん
2007/03/18(日) 09:12:45ID:???往復ビンタしてから
男から殴れ女なら犯せ
0867nobodyさん
2007/03/18(日) 16:01:57ID:???>>864の通りデザイナにUTF8で書いてもらうのが一番良い。
デザイナがだめならクライアントかディレクターあたりに「余計なコストがかかる事になりますが…」
とか言ってデザイナがUTF8で書かざる終えないようにがんばれ。
0868nobodyさん
2007/03/18(日) 16:02:47ID:???0869nobodyさん
2007/03/18(日) 18:11:10ID:???0870nobodyさん
2007/03/18(日) 18:17:59ID:???これがある日本はハンデやで。
0871nobodyさん
2007/03/18(日) 20:08:33ID:???smartyテンプレ(sjis) → smartyコンパイル(utf8)
はテンプレートが更新された後の初回アクセスだけですむから大した負荷にはならないだろ。
0873nobodyさん
2007/03/19(月) 11:20:58ID:???ただ、文字コード変換するくらいでぐだぐだ言うようなデザイナは、勉強不足だと思う。
一息に切れ
0874nobodyさん
2007/03/20(火) 09:13:18ID:???0875nobodyさん
2007/03/20(火) 13:33:39ID:???>smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
>「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
ええーっ
とりあえずおまいさんが『Dreamweaver 文字コード』でぐぐって、DWの設定を教えてあげればいいじゃない。
つかその程度のこともできないデザイナなんか切れ。
0876nobodyさん
2007/03/20(火) 23:01:26ID:???0879nobodyさん
2007/03/21(水) 18:15:49ID:???自在にSmartyを使えるようになる頃には、自分で template 作れるようになる。
で、その頃になると、Smartyに粗が見え出すんだ。
まぁ、という訳で自作テンプレート使ってる。
0880nobodyさん
2007/03/21(水) 20:52:08ID:NvhysGYmどう考えても、Smartyの方が優れてそうだけどなw
0881nobodyさん
2007/03/22(木) 12:42:30ID:???まぁ、その通りだ。
だが、smartyはでかいし機能がありすぎる問題がある。
下手に機能があると、テンプレートに頼りすぎて、どこまでがviewか?とかが崩れるんだ。
シンプルな方が楽だし早いんだよ。
0882nobodyさん
2007/03/22(木) 13:21:33ID:???PHPでやったほうがわかりやすい。
0883nobodyさん
2007/03/22(木) 14:34:43ID:jPF/zj000884nobodyさん
2007/03/22(木) 15:12:30ID:???0886nobodyさん
2007/03/22(木) 17:40:02ID:9EeeeROG0887nobodyさん
2007/03/22(木) 18:13:08ID:???0889nobodyさん
2007/03/22(木) 23:53:41ID:???DBに接続してデータとって来るような場合
キャッシュがあればDBいかないで表示したり。
テンプレート内のカウンタとか一部のプラグイン部分だけはキャッシュじゃなくて動的にしたい
とかも出来るから結構便利よ。
0890nobodyさん
2007/03/23(金) 01:25:37ID:wrH2dhw40893nobodyさん
2007/03/23(金) 14:57:53ID:wrH2dhw40894nobodyさん
2007/03/23(金) 16:54:26ID:???簡単に言うと、ある一定時間内ならキャッシュを出力してDBアクセスを抑制できる仕組み。
http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/caching.html
例を挙げれば
・10分ごとに最新情報がでればいい
・100view/分
・クエリ発行数 7/view
というコンテンツがあった場合
キャッシュなし→700query/分
キャッシュあり→0.7query/分
となりDB負荷が大幅に下がる。
0895nobodyさん
2007/03/24(土) 21:37:49ID:???もしそうなら、ページ全体のキャッシュはできても部分キャッシュはできないということ?
0896nobodyさん
2007/03/24(土) 22:03:13ID:???キャッシュのキーはテンプレートのパスとdisplay関数やfetch関数の第2引数として指定できるキャッシュID
マニュアル嫁と。
0897nobodyさん
2007/03/25(日) 01:25:25ID:???0898nobodyさん
2007/03/25(日) 04:42:25ID:UfKh4Z0S細胞図
0899nobodyさん
2007/03/25(日) 13:19:14ID:???新規で受注したPHP案件は無理やりでも導入してるぜ
改造案件で昔の担当したアホがスパゲティってるときだけ使わん。
0900nobodyさん
2007/04/03(火) 12:34:20ID:???{foreach from=$arr item=item key=key}
{$item.hoge|@count}
{/foreach}
連想配列の要素数は上記で取得出来るのですが、要素数を交えた演算が出来ずに困ってます・・・
感覚的に
{$item.hoge|@count * 4 + 1}
というような書き方をしたいのですが・・・どうかお助けください
0901nobodyさん
2007/04/03(火) 12:36:53ID:???0903nobodyさん
2007/04/03(火) 13:46:55ID:???0904nobodyさん
2007/04/03(火) 13:49:53ID:???0905nobodyさん
2007/04/03(火) 14:14:52ID:???$arr = array("hoge"=>array(0,1,2,3));
{foreach from=$arr item=item key=key}
{math equation="n*4+1" assign="mResult" n=$item.hoge|@count}
{$mResult}
{/foreach}
0906nobodyさん
2007/04/03(火) 21:35:12ID:???繋がる?
0907nobodyさん
2007/04/04(水) 10:05:10ID:???0908nobodyさん
2007/04/05(木) 22:15:57ID:Wh1vrSjM同じ様な事を経験した方っていますかね?
コンパイル済みのファイルの時点でなくなってる感じです。
ちなみにSmartyのバージョンは2.6.6です。
レス数が900を超えています。1000を超えると表示できなくなるよ。