トップページ⇒php
984コメント324KB

【PHP】Smarty【Template】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/03/10 00:57ID:NhgrjNBT
このスレ、あってもいいんじゃないかと。

本家(英語)
http://smarty.php.net/

日本語マニュアルとか
http://sunset.freespace.jp/smarty/
0413nobodyさん04/08/01 13:32ID:???
女だったら教える。
0414nobodyさん04/08/01 17:08ID:???
要はさ、PHPって難しいのよ。
プログラミング言語としては簡単な部類に入るかも知れないけど、
HTMLくらいしか理解できないヤシにはとっつきにくい。
例えばforeach構文とか、デザイナーに理解できるか、と言えば
(人それぞれなのはもちろんだが)確実には理解できないと言っていい。

Perlの話になるが、代表的なTemplateとして、HTML::TemplateとTemplate::Toolkit
と言うのがある。Template::Toolkitは、様々な構文やら他のPerlモジュールを呼び出す機能やら、
その他もろもろの機能がついている。逆にHTML::Templateはif分のtrueとfalseの判定、
そしてループ機能くらいしかついていない。
どっちがいい?と聞かれれば、プログラマ的にはTemplate::Toolkitの方が楽。
でも、デザイナーには多分HTML::Templateのほうがわかりやすい。

PHP単体でMVCするのもいいんだけど、Smartyにしてある種の機能制限の方がわかりやすいって人もいるんだろう。
漏れはPHP単体のMVCだけどw
0415nobodyさん04/08/02 03:23ID:???
これだけロジック書ける・書かないと動かないテンプラで機能制限も糞もない。
ビューをデータが規定するタイプのものならともかくそれ以外ならどれも変わらね。
410には馬鹿馬鹿しくて答える気がおきね。
0416nobodyさん04/08/02 14:58ID:???
結局は流行かよ。
ちゅまんね〜。
0417nobodyさん04/08/02 14:59ID:???
おまえら全員ハルヒコだよ。
0418nobodyさん04/08/03 00:05ID:???
だまれナツチュウ
0419nobodyさん04/08/03 18:16ID:???
基地外を弄るな♪
0420nobodyさん04/08/04 16:49ID:T7C0bXmt
フォームから正の整数を入力して送信すると、1からその数までの整数の並びを表示するPHPスクリプトを作らなくてはならないのですが皆目検討がつきません…(つД`)
なにかアドバイスをお願いします。
0421nobodyさん04/08/04 16:56ID:???
>420
宿題は自力でやろうな坊や
てか、ここで聞くな馬鹿
0422nobodyさん04/08/04 23:15ID:???
ageるとロクな事がないな
0423nobodyさん04/08/05 21:11ID:???
range()
0424nobodyさん04/08/05 23:41ID:???
キャッシュをONにすると色々問題が起きます
0425nobodyさん04/08/06 11:13ID:???
phpのnumber_formatに相当する関数ってないですよね。
っと、書き込もうとして気づいた。register_functionで追加すればいいのか。
0426 ◆AngelH/kMI 04/08/08 22:37ID:???
>>425
number_formatならregister_function使わなくても呼べますよ
0427nobodyさん04/08/09 01:33ID:???
>>426
あら本当だ。フィルタ的に使えるのね。

つーか、引数1つで戻り値があるPHPの関数は以下の要領で使えるんですね。
{$number | number_format}
{$string | md5}
引数が複数の場合はどうするんだろう。出来ないのかな?(そんな機会はそうそうなさそうだが)
マニュアルに書いてありましたっけ?
探してみたんですけど、どこに載っているのか見つけられなかった。
0428 ◆AngelH/kMI 04/08/09 05:02ID:???
>>427
引数が複数ある場合は第2引数以降をコロン区切りで。

かなり極端な例だと
{long_multibyte_string|mb_strimwidth:0:40:"..>"}
こんな感じ。
まあでも、ここまでテンプレートに書くのはどうかとも思う・・・。
「見た目の変更」だからテンプレートに書いてもいい気がするけど

{long_multibyte_string[i].titile|escape|mb_strimwidth:0:40:".."|defaust:"データ無し"}
とかどうなのかと(苦笑
0429425=427@ ◆Kiss.FX29M 04/08/09 09:33ID:???
>>428
いろいろどーもです。
>>425のregister_functionに気づいた時点で書き込みをやめようと思ったんですが、
書き込んでよかった。勉強になりました。

//何気に古い酉を晒してみりゅw
0430nobodyさん04/08/09 18:15ID:???
うお!誰かと思ったら(笑
0431nobodyさん04/08/13 16:34ID:???
modifire?
0432nobodyさん04/09/01 16:13ID:DiPaFBrX
age
0433nobodyさん04/09/02 00:30ID:???
modifierでmb_truncateとかmb_wrapだの色々用意してはみたのだが、デザイナさんが使ってくれなくて寂しい
0434nobodyさん04/09/02 11:15ID:???
>>433
デザイナがHTML作って、
プログラマが組み込んでいるので使い放題!

・・・・(T-T)
0435nobodyさん04/09/11 11:24:55ID:vqhAT/1H
同じ例えば xxxx.php 内でユーザーがログインしてるかしてないかによって
表示を変えて使う場合、smartyのキャッシュ機能が問題起こす可能性はあるでしょうか?
誰かがログインした状態がキャッシュされてしまって
ログインしていない人にそのページが見えちゃうとか。
0436nobodyさん04/09/11 12:35:32ID:???
2.6.4入れたら、単純な四則演算(+とか/とか)でエラーが出るよぅ。
0437nobodyさん04/09/11 18:28:06ID:K5FwXM+0
>>435
キャッシュ、意外と使えなかった・・・。

テンプレートにアサインした結果をキャッシュするから、
テンプレートが同一なら問題起こる可能性あり。

>>436
どんな式?
0438nobodyさん04/09/12 01:33:02ID:???
Smartyのキャッシュ機能かぁ、使ったこと無いが需要あるのかな。
php使った動的ページで、しかもログインページなんて
ブラウザのキャッシュすら一応Metaタグとかで無効にしといた方が良い気がするが。

テンプレートエンジンのオーバーヘッドが気になるのなら
それこそ、動的な出力とインクルードしたテンプレートから生成された出力結果を
ファイルに書き出して静的htmlファイルを公開フォルダに置いた方が
良いだろうし。
0439nobodyさん04/09/12 02:45:25ID:JBS0QrEF
>>435
キャッシュIDをうまく使ってやれば平気。

>>438
テンプレートエンジンより、assignする値をDBなんかから持ってきてるときにオーバーヘッドがでる。
0440nobodyさん04/09/12 04:22:23ID:???
Smartyってあんまメリットなくない?
PHP自体で十分デザインとテンプレートの分離はできるし、
キャッシュ機能つくるのも特に大して手間じゃないし…

0441nobodyさん04/09/12 04:33:01ID:???
>>440
まずは自分のレスだけでいいから省みてみろ
0442nobodyさん04/09/12 05:08:05ID:???
>>441
まずは自分のレスだけでいいから省みてみろ
0443nobodyさん04/09/12 05:18:14ID:???
>デザインとテンプレートの分離

ワラッタw
0444nobodyさん04/09/12 06:21:43ID:???
>>439
??そりゃDBだろうがlogファイルからだろうが、演算結果だろうが
動的に出力する値は全部オーバーヘッドになるだろうさ。
Smartyのキャッシュ機能とはまるで関係ないのでは?
そこが気になるならWebアプリ自体使えないと思うが。
0445nobodyさん04/09/12 06:31:44ID:???
>>440
Smartyのメリットはプログラマよりデザイナに対してのものだと思う
0446nobodyさん04/09/12 06:37:44ID:???
いま、>>445がいいこといった。 メモしとけ。
0447nobodyさん04/09/12 06:45:25ID:???
>>444
いちいち値取りにいくのがオーバーヘッドになるから
その為のキャッシュ機能ですが?
0448nobodyさん04/09/12 08:27:29ID:7xfelydB
キャッシュをONにしたら、2,3割の確率で、しかもランダムな箇所で、
エラーを吐くようになったのですが・・・。

これってどうしようもないですか?

ひょっとして、テンプレートファイルのなかで
{php}
ほげほげ
{/php}
を数カ所使ってるのがいけないのでしょうか・・・
0449nobodyさん04/09/12 13:42:47ID:???
>>445
いや、デザイナの為ならなおさらSmarty使わないほうがいいだろw
DWとかはPHPタグで囲んだ部分は表示されないようになってるし
0450nobodyさん04/09/12 15:17:40ID:???
>>448
せめてエラーメッセージを書かないと。
0451nobodyさん04/09/12 15:31:00ID:???
>>448
すいません、同時にPHPを5.0.1にあげたんですが、4.3.8に戻して、
smartyのキャッシュを有効にしても、全然問題なかったです。

PHP5.0.1のせいだったみたいです。どうもすみません。
//しかしPHP5のSOAP使いたい・・・
045243604/09/13 00:26:30ID:???
>>437
遅レスすまんす。
普通に{$hoge+100}とかです。
本家のフォーラム見たら同じ問題が出ていて、CSV版では問題ないよ。って書いてあった。
めんどいから2.6.3に戻しましたけど。
0453nobodyさん04/09/13 02:45:25ID:???
>>449
オーサリングツール使ってhtmlファイルだけ渡して後は知らねぇってデザイナと、
デザイン上の修正の度にプログラマにも修正依頼しなきゃいけない様な
状況でしか仕事したことないなら、その環境は恥じた方がいいよ。
0454nobodyさん04/09/13 10:46:56ID:???
別にオーサリングツールで編集しやすいって言っただけでなんで…
勝手に勘違いして人の仕事環境妄想して、妄想で創った人物像相手に
レスする癖は恥じた方がいいよ?
例えばSmartyのforeach文が修正できてphpのそれが修正できないなんて奴いねぇだろw
対応エディタもマニュアルも多い分Smarty使うよりPHPタグで分けた方がデザイナ的にも
やりやすいってだけの話なんだけど?
0455nobodyさん04/09/13 11:07:47ID:???
PHP-users とはまた違った痛さがこのスレにはある!
0456nobodyさん04/09/13 11:46:10ID:u+cNXRva
>>449
Smarty用のDWプラグインがあるよ。
0457nobodyさん04/09/13 12:00:43ID:???
>>456
それXOOPSだと使えないよね
0458nobodyさん04/09/13 12:02:37ID:???
あぁごめんXML修正すりゃいけるか
0459nobodyさん04/09/13 13:27:37ID:???
なんかそのままだと日本語との兼ね合いで調子悪いな>DWプラグイン
変なとこでSmartyタグ扱いされちゃう。
0460nobodyさん04/09/13 14:17:29ID:???
>>459
SJISだと { } が悪さをする。ってかそれはSmarty全般じゃない?
0461nobodyさん04/09/13 17:27:51ID:E8MZljJ1
>>459-460
結構困るよな。パーサをマルチバイト対応させる必要があるよな。
0462nobodyさん04/09/13 17:45:08ID:???
>>461
泥臭くデリミタをオーバーライドしてるよ。俺。
0463 ◆AngelH/kMI 04/09/14 02:16:54ID:???
>>451
あー。まだ見てますかね。
謎エラーはSmartyが原因ではなくてPHP本体が原因。

--enable-zend-multibyteつけてmakeしてませんか?
4.3.8以降/5.0.0β3以降あたりから出る模様です。
046445104/09/14 10:32:41ID:???
>>463
>--enable-zend-multibyteつけてmakeしてませんか?
ビンゴです。

つけないで、5.0.1入れてみます!
ありがとうございます。
046545104/09/14 13:59:25ID:???
>>464
無事PHP5.0.1入れられました。エラーもおこりません。
ありがとうございます。

さぁ、SOAPであそぼう。。。
0466nobodyさん04/09/15 16:10:31ID:sZX1kIS0
smartyで携帯サイト作れるのかな?
0467nobodyさん04/09/15 17:19:27ID:???
>>466
作れます。
0468nobodyさん04/09/15 18:59:41ID:???
SJISでややこしいことになりそうだが・・・
0469nobodyさん04/09/15 19:07:40ID:???
>>468
大丈夫ですよー。
内部エンコードこそ EUC とかで書きつつ
mbstring.http_output の値を SJIS にしちゃえば OK です (´ω`)

0470nobodyさん04/09/15 20:41:54ID:dqyUiMN9
>>469
それやんないと能とか条が化けるんだよな。
0471nobodyさん04/09/15 22:01:32ID:???
>468
普通にSJISで問題ないよ
>469
EUCにしちゃうと絵文字のバイナリでの入力ができなくなるから使いづらい。
>470
どんな使い方してるんだ?
0472nobodyさん04/09/15 22:21:33ID:C49Dq6Pt
>>471
>>470ではないけどテンプレート中の文字が化けるっしょ?
--enable-zend-multibyteを付けてビルドして、mbstring.script_encoding=SJISを設定してれば
SJISをちゃんと扱えるようになるけど、パフォーマンスが落ちるし。

絵文字は確かに扱いづらくなりますな。
キャリア間の非互換やPCでの表示もあるから、絵文字はプレースホルダを
端末に応じて置換してテンプレートに渡してるんだろうけど、
assignの段階では置換せずにoubput_handlerに
SJISへの変換と絵文字プレースホルダの置換をする関数を指定すればいいんじゃないかな。

まさかユーザーから入力された絵文字を生のままログに保存してたりしないよね?
0473nobodyさん04/09/15 22:50:59ID:???
PHPの書籍で入門以外のってないのかな。
どれも入門ばっか・・・
0474nobodyさん04/09/15 23:02:47ID:???
>>472
471ですが、鯖の設定は他人任せだからよーわからんです。
夜間だと秒間8〜12アクセスある携帯サイト運営してて
体感的に遅くなったことはないです。
携帯相手だから速度は気にする必要ないのかもしれんが。

絵文字とhdmlはoutputfilterで自動変換させてる。
PCは絵文字画像ね。

ユーザーの絵文字はiモードの絵文字(バイナリ)にしてから
mysqlに入れてるけど何か問題ありますか?
ちょっと前まではbase64_encodeしてから入れてましたが
面倒なのと問題がないのとでそのまま入れてます。
単純にわからないので教えてください。
教えて君でスマン。
0475nobodyさん04/09/16 03:23:52ID:???
>>474
なるほど。納得。
iモードのやつに統一してあるならOKっす。
>>472の意図はDoCoMo/au/Vodafoneで別々の絵文字を
そのまま扱ってたらアレだなあと思ったので。

満足なパフォーマンスが出てるなら気にすることもないです。
それ以前にmbstring.scriptl_encodingは未設定で、
たまたまうまく動いている可能性が高いですが。
0476nobodyさん04/09/16 05:22:54ID:???
なんかすげーためになった。ありがと。
今のとこ携帯サイトの仕事は無いんだが・・・
0477nobodyさん04/09/17 00:34:45ID:???
>>475
ケイタイサイトは泣けるぞ。
端末ごとに動作違ったりするから、真面目にやろうとすると大量のケイタイとにらめっこだ
0478nobodyさん04/09/18 17:46:27ID:???
>>475
なんかセキュリティーホールがあるのかと思ってすごいビビってましたよ。
絵文字は各機種ごとにそのまま保存してても
問題ないと思いますね。ようはユーザーに対しそれをどう扱うかだし。
うちはiモード重視だからi基準にしちゃってますが。
mbstring.script_encodingは未設定ぽかった。
試しにaaacafeとc-sideで試したらOKでした。

>>477
かなり泣けるよね。
特にEZ端末で同じ会社の端末でも挙動が違ったり
locationが使えなかったりとかもろもろと・・・。
0479nobodyさん04/09/18 18:47:21ID:???
ttp://www.geocities.co.jp/HeartLand-Yurinoki/1836/c_aa_archive/jikken/Denmark_and_Tomasson.html

泣ける
0480nobodyさん04/09/18 20:43:00ID:???
>>479
畜生、モニタが滲んでよく見えねえよ・・・
0481nobodyさん04/09/19 19:04:37ID:???
こわくてみれません。
0482nobodyさん04/09/19 19:10:05ID:???
感動話だよ。
0483nobodyさん04/09/19 20:18:01ID:???
泣けます。
0484nobodyさん04/09/19 21:45:49ID:???
なぜこのスレに張るのかがイマイチ分からないけど泣ける。
0485nobodyさん04/09/22 01:32:35ID:???
意図がわからんが、泣ける。
0486nobodyさん04/09/22 02:08:38ID:???
#セ\NAugmc
0487nobodyさん04/09/22 20:46:22ID:S3VBXifE
php.iniは
output_buffering = On
output_handler = mb_output_handler
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
で
$buffer_euc = $smarty->fetch('index_m.tpl',$smarty_cache_id);
$buffer_sjis = mb_convert_encoding($buffer_euc,"SJIS");
//---------------------------------------------------------------------------
header( 'Content-Type: application/xhtml+xml; charset=Shift_JIS' );
header( 'Content-Length: ' . strlen( $buffer_sjis ) );
//--------------------------------------------------------------------------
$smarty->display('index_m.tpl',$smarty_cache_id);
としてるのに、出力がEUCになってしまいます。

どんな原因が考えられるのでしょうか?
0488nobodyさん04/09/22 22:03:51ID:???
泣いた
0489nobodyさん04/09/22 22:05:55ID:???
・phpのバージョンくらいは書く
・$buffer_euc, $buffer_sjis等の出力の文字コードをチェックするなりして、問題を絞り込む
・キャッシュが更新されずに古いものが使用されてないか?
0490nobodyさん04/09/22 23:09:16ID:???
>>489
>>488が泣いたのはそんな理由じゃないと思うよ。
まずoutput_buffrering不要。
一応mb_convert_encodingの第三引数に"EUC-JP"を入れといた方が無難。
極め付けに痛いのが $smarty->display('index_m.tpl',$smarty_cache_id);
echo $buffer_sjis; でええんちゃうかと。
049148704/09/23 11:59:14ID:???
>>488-490さん、ありがとうございます。

すいません、情報不足で。PHP5.0.1です。
キャッシュは、全部けしてもおなじ状況でした。

で、まさかと思って調べてなかったのですが、
$buffer_euc = $smarty->fetch('index_m.tpl',$smarty_cache_id);
のちの$buffer_eucは空でした。
なので文字コードは、$buffer_euc、$buffer_sjisともに空で、
ただし、
$smarty->display('index_m.tpl',$smarty_cache_id);
はなぜか(EUCで)表示できてます・・・。

>>490
echo $buffer_sjis; でええんちゃうかと。
いや、どうしても重くならざるをえないページなので、
キャッシュをつかいたかったもので。

やはりPHP5.0.1というのが相性悪いのでしょうか?
ただ、スクリプトの他の部分では、$smarty->display成功してるんですよね。(ちゃんとSJIS)

変数やファイル名が違うだけで、そこといっしょのことをしてるはずなんですが・・・
0492nobodyさん04/09/23 12:05:14ID:???
>>491
意図したコードと違うことが書いてある気がする。もういちどよく見直せ。
適切なタイミングでnew Smarty()してないとかw

んで、>490ではないが、featchの内容とdisplayの内容が同一で、
SJISに変換したものが$buffer_sjisに入ってるなら、それを出力してやったほうが処理は早いぞ。
0493nobodyさん04/09/23 12:41:42ID:???
488だが>>479について泣いたつもりだったんだよな
049448704/09/26 01:42:15ID:ORPXRj+I
>>487です。
とりあえず文字化けは「解決」しました。というか、あきらめました。
application/xhtml+xml;をあきらめて、"Content-type: text/html";にしたら、
文字化けしないようになりました・・・

ただ、別の問題が生じてます。
>>487のソースで、
HTTPヘッダが「Content-Length: -」となってしまいます。
どうにかして、smartyを使いつつ、「Content-Length」を正常に表示させる方法とかないでしょうか?

ob_関係の関数使おうかと思ったのですが(ob_get_lengthとか)
「smarty->display」でブラウザに表示されるときはSJISですが、
その直前まではEUCなので、文字数がずれてしまいます・・・
どなたか裏技っぽい方法でもいいので、お助けいただければ幸いです。
0495あぼーんNGNG
あぼーん
0496nobodyさん04/09/26 19:15:27ID:???
結局>>495のアドレスは何だったんだろう?
0497 ◆AngelH/kMI 04/09/28 02:48:49ID:???
>494
$smarty->fetch()で表示内容取得して
文字コード変換かけてstrlenで測るとか?

・・・かなりダメそうな方法だ(苦笑
049848704/09/28 11:55:20ID:???
>>404
いや、それ、>>487でやってます。(content typeは違うけど)

そしたら、「Content-Length: -」となってしまうので。。
0499nobodyさん04/09/28 15:25:48ID:???
>>494
アウトプットフィルタプラグインとかどうよ
050048704/09/29 12:13:50ID:???
>>494

ん・・・・・あんまり概念が理解できてないから、自作はきびしいかも。。。
050148704/09/29 12:14:03ID:???
もとい、>>499さん。
0502nobodyさん04/10/11 16:58:02ID:RLUAfbkL
HDMLの携帯サイトを作るのにsmartyは使えませんよね。
0503nobodyさん04/10/11 18:13:33ID:???
>>502
どうせフレームワーク組んじゃうんだろ?
んじゃpattemplateのほうがシンプルで扱いやすいだろ。
smartyはあくまで、いろいろ自分で組めない厨向けのテンプレだぞ。
0504nobodyさん04/10/12 12:14:58ID:???
>>502
使えますってか使いました。
0505nobodyさん04/10/12 14:58:47ID:???
>>503
まず出来上がりの早さを求めるのであって
自分で出来るか出来ないかの問題ではない

そこから、どう不都合になるか考える。
出来てから考える。

誰でも自分で作れるよ。でも1年かかります。そんなの待てるか。
といわれちゃうよ
0506nobodyさん04/10/12 16:27:47ID:bb34UBPS
>>503
まあ、それをいうならPHPはあくまで、いろいろ自分で勉強できない厨向けの環境だからな。
0507nobodyさん04/10/12 16:42:18ID:???
ということにしたいのですね:-P
0508nobodyさん04/10/12 17:24:13ID:bb34UBPS
そういや、PECLってどうなったん?
あと、なんかCPANみたいなのやるっていう話なかった?
0509nobodyさん04/10/12 19:39:43ID:???
誤爆してるぞ
0510nobodyさん04/10/16 23:33:47ID:OMhy7HMx
便利そうなのでSmarty使ってみようと思ったけど
インストールすら出来ない(´・ω・`)
初めのHello!,Ned1が出ないし

きちんとinclude_pathを設定して...Example 2-9でエラー
unexpected T_STRING in c:\〜 in 20

はて、config_dirのパスが設定出来ないらしい
Windowsの絶対パスはc\:からだよね?
0511nobodyさん04/10/17 05:34:27ID:???
 ・ ”C:\〜” ではなく ”C:/〜” を使ってみる
 ・ 相対パスを使ってみる
051251104/10/17 05:35:51ID:???
なんか腹が立つな
>(´・ω・`)
■ このスレッドは過去ログ倉庫に格納されています