【Smarty】PHPのテンプレートエンジン【Flexy】
■ このスレッドは過去ログ倉庫に格納されています
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/
0521nobodyさん
2006/03/28(火) 09:23:09ID:???日本語版あるのに。
0522nobodyさん
2006/03/28(火) 09:25:06ID:???0523nobodyさん
2006/03/28(火) 09:25:51ID:???http://pear.php.net/manual/ja/package.html.html-template-flexy.html-template-flexy.compile.php
じゃねーの?
キャッシュってどの部分の話なのか分からないけど。
>>521
ほんの一部だけな。
0524nobodyさん
2006/03/28(火) 12:05:09ID:ct8TgCpW0525nobodyさん
2006/03/28(火) 12:17:18ID:???0527nobodyさん
2006/03/29(水) 21:33:36ID:???> コンパイルされたファイルが存在しない
> テンプレートに変更が加えられており、コンパイルされたものより大きい
テンプレートに変更がない場合は既にコンパイルしたファイルを使うわけだからこれで十分じゃない
0528nobodyさん
2006/04/02(日) 21:51:22ID:pQIOcBrEステータスには「0, 1...」のようなコードが入っています。
これをPHP側で設定したステータス用の文字列で展開して表示したいのです。
PHP側:
$id = array(0, 1, 2);
$code = array(1, 2, 0);
$status = array("0"=>"不明", "1"=>"未完了", "2"=>"完了");
$smarty->assign('ID', $id);
$smarty->assign('CODE', $code);
$smarty->assign('STATUS', $status);
テンプレート側:
{section name=i loop=$ID}
{$STATUS.$CODE[i]}
{/section}
このままだとIllegal offset typeというエラーが表示されてしまいます。
{assign var="tmp" value=$CODE[i]}
{$STATUS.$tmp}
こちらのように、一度変数に格納すると正常に表示されるのですが、あまりスマートではないので、1行で出力する方法は無いでしょうか?
0529nobodyさん
2006/04/02(日) 22:28:40ID:???{foreach from=$CODE item=c}
{$STATUS.c}
{/foreach}
でいいんじゃないの?
0530528
2006/04/04(火) 16:53:19ID:???ご回答どうもです。
サンプルには書いていないのですが、
同時に$ID[i]が使いたい場合もあるのです。
なのでsectionでなんとかできないでしょうか?
0531nobodyさん
2006/04/05(水) 00:44:38ID:???スマートにこだわるのなら
array(
array('id'=>0, 'status'=>1),
array('id'=>1, 'status'=>2),
...
)
みたいな配列にしてからassignした方がスマートじゃないかな
0532nobodyさん
2006/04/07(金) 00:09:04ID:???次に示すような配列を返すようにSQLを発行し、変数$resultに格納しています。
その内容をsmartyのテンプレート内で、foreachで回しながら全件表示するようにしています。
このとき、$itemの中身が入っている場合(0以上の数値)のみ、チェックボックスにチェックを入れたいのですが、
どうやら「$item != ""」と「$item != 0」が同じような動きをしているために、
$itemに0が入っているレコードにはチェックがつかない状態になっています。
これをうまく表示させるにはどうしたらいいのでしょうか。
よろしくお願いします。
//$result
Array( [AAA]=>100 , [BBB]=> , [CCC]=> , [DDD]=> , [EEE]=>0 , [FFF]=> , [GGG]=>)
//smartyのテンプレート内における表示部分
<table>
{foreach from=$result key="key" item="item"}
<tr>
<td><input type="checkbox"{if $item != ""} checked{/if}>{$key}</td>
<td><input type="text" value="{if $item == ""}0{else}{$item}{/if}"></td>
</tr>
{/foreach}
</table>
下に求めている表示例と、現状の表示例を載せておきます。
0533nobodyさん
2006/04/07(金) 00:09:37ID:???//求めている表示結果(□:未チェック/■:チェック)
■AAA [ 100 ]
□BBB [ 0 ]
□CCC [ 0 ]
□DDD [ 0 ]
■EEE [ 0 ]
□FFF [ 0 ]
□GGG [ 0 ]
//現状
■AAA [ 100 ]
□BBB [ 0 ]
□CCC [ 0 ]
□DDD [ 0 ]
□EEE [ 0 ] ← チェックした状態にならない
□FFF [ 0 ]
□GGG [ 0 ]
0534nobodyさん
2006/04/07(金) 04:37:39ID:???<td><input type="checkbox"{if $item != ""||$item == "0"} checked{/if}>{$key}</td>
0535nobodyさん
2006/04/07(金) 12:10:04ID:0TErvImy無事に動きました!
携帯からでスマソorz
0536nobodyさん
2006/04/18(火) 15:32:18ID:???ttp://pc8.2ch.net/test/read.cgi/php/1135847024/
0538nobodyさん
2006/04/18(火) 20:30:28ID:???0539nobodyさん
2006/04/21(金) 07:18:24ID:qi5wvjsu他のテンプレートエンジンvsSmartyならたくさん議論出来ると思うのですが、
ライバルがhtml+phpなのがにんともかんとも。
みんなデザイナさんが書いたhtml+phpソースで鼻血出した事無いのかなー
0540nobodyさん
2006/04/21(金) 07:27:03ID:G2Rp1nFESmartyなら鼻血ださないで済むの?
Flexyなら出さずに済みそうだけど。
0541nobodyさん
2006/04/21(金) 11:25:09ID:???> ライバルがhtml+phpなのがにんともかんとも。
Smartyが実際にそれと同様の結果をもたらしてるんだからしょうがない。
0542nobodyさん
2006/04/21(金) 11:59:49ID:???もうちょっと使うべきものが制限されてたら端から高機能を求めようなんて思わないのに。
そもそも目的はViewを分離(=Viewに制限)することだし、すでに十分果たせてるわな。
0544542
2006/04/21(金) 14:04:57ID:???スマン勘違い。
smartyには表示と関係ない機能が無駄についてるのかと思ってたけど、よく調べてみたらどれも表示に関連する機能だった。
0545nobodyさん
2006/04/25(火) 20:40:31ID:???DBに接続&データを取得し、それをsmartyにアサインして、表示させています。
$obj_smarty->diplay("hoge.tpl",$id);
が一番最後にあるため、せっかくのキャッシュデータがあるにもかかわらず、その前の時点でDB接続をしてしまいます。
表示されるデータは結局キャッシュされたものなんですが。
(コントローラの)ページの先頭で、すでにキャッシュが存在するかどうかのチェックして、
存在した場合は各種処理をスキップするには、どのようにしたら良いのでしょうか?
0546545
2006/04/25(火) 21:03:11ID:???0547nobodyさん
2006/04/26(水) 18:18:54ID:???それを一つの temolate_c に出力してしまうのはやっぱ問題ありますかね
0550nobodyさん
2006/05/01(月) 22:28:39ID:???テンプレート内で他のテンプレートをincludeすると、ちゃんと表示されない。
で、ここに辿り着いたのですが、
ttp://smarty.incutio.com/?page=SmartyDreamweaver
最初の方でデリミタを指定できるっぽいのですが、
"{{"、"}}"と指定しても、ちゃんとincludeしてくれない。
初期設定の"{"、"}"だとincludeしてくれるんだけど…。
この設定でデリミタを変更しても、ちゃんと動いている人いますか?
0551nobodyさん
2006/05/02(火) 00:15:55ID:???0552550
2006/05/02(火) 00:57:53ID:???それも"<%"とかも駄目だったよ…。
Dreamweaver側の設定も何か必要なのかなぁ。
上のコード見ても、ただデミリタを置き換えてるだけっぽいんだけど。
0553550
2006/05/02(火) 01:00:41ID:???デミリタとincludeの間に、スペースが入ってるとかではないです。
("{"、"}"だとちゃんとincludeされるし)
0554nobodyさん
2006/05/02(火) 16:46:29ID:???日本語文字列がキーになっているのを表示したいだけなんですけど。
代替方法として(実験中の断片コードしかなくてすみませんが)
次のようなものを考えました。
(もし日本語文字列が普通に使えるのなら無駄になっちゃうんですが・・・)
その1の案はプラグインを作らなくてもいいがテンプレートが冗長になる。
その2のコンパイラ関数の案はテンプレートが冗長にはならないが、修飾子が使えない。
その3のテンプレート関数の案は冗長にはならず修飾子が使えるが、
コンパイル後のコードがコンパイラ関数よりも無駄がある。
修飾子を使いたいので、その3の方法を採用しようと思っています。
もっと良い方法や間違い・勘違いがあったらコメントください。
0555つづき
2006/05/02(火) 16:47:03ID:???{assign var="nihongo" value="日本語"}
{$data.$nihongo}
その2(コンパイラ関数 プラグインを作る)
{var name='$data.日本語'}
【プラグイン】
function smarty_compiler_var($params, &$compiler)
{
return "echo それっぽい文字列";
}
その3(テンプレート関数 プラグインを作る)
{var name='$data.日本語'}
【プラグイン】
function smarty_function_var($params, &$compiler)
{
return $compiler->_tpl_vars[ピリオドで区切った一つ目][ピリオドで区切った二つ目]・・・;
}
0556nobodyさん
2006/05/02(火) 16:50:17ID:???日本語文字のキーを使わない。
日本語文字が使えるようにSmartyにパッチをあてる。
ってのがあると思いますが、今回はちょっとやめておきたいです。
(すでに日本語文字が使えるSmartyパッチがあれば話は別です)
0557nobodyさん
2006/05/02(火) 17:56:31ID:???【サンプルテンプレート】
{foreach from=$data.details item=detail}
{var name='detail.タイトル'}<br>
{/foreach}
【プラグイン】 プラグインフォルダに function.var.php というファイル名で置く
<?php
function smarty_function_var($params, &$compiler) {
$value = $compiler->_tpl_vars;
foreach(split('[.]',$params['name']) as $param) {
$value = $value[$param];
}
return $value;
}
?>
0562nobodyさん
2006/05/08(月) 12:47:22ID:???0563nobodyさん
2006/05/14(日) 15:18:13ID:???0564nobodyさん
2006/05/25(木) 18:33:22ID:???存在しない場合にエラーになってしまうのですが、
PHPでいうところの isset() のような条件判定で回避できたりしないでしょうか?
PHPを埋め込んで一応対処は出来ているんですが、
せっかくのテンプレートファイルにその箇所だけPHPコードが入ってしまうのがなんともすっきりしません。
0565nobodyさん
2006/05/25(木) 19:55:07ID:???default
0566nobodyさん
2006/05/26(金) 04:37:22ID:???0569nobodyさん
2006/05/26(金) 15:47:30ID:???0570nobodyさん
2006/05/26(金) 15:49:24ID:???0571nobodyさん
2006/05/26(金) 18:29:06ID:???{include file=xxx.tpl value=1}
{include file=xxx.tpl value=2}
{include file=xxx.tpl value=3}
としてもxxx.tplで$valueを参照すると最初の値(1)しか入ってこないのはなぜ?
0574nobodyさん
2006/05/29(月) 22:44:38ID:mZUygf+Dエラーを読んだ限りでは、ファイルのディレクトリが違うかファイルが存在していないといった
感じだったのですが、テストしたところ動作はしていました。
インクルードパスに原因があるのでしょうか、
ちゃんとSmartyのディレクトリを指定しています。
どなたかアドバイス頂ければな、と思います。お願いします。
0575nobodyさん
2006/05/29(月) 22:47:07ID:???0577nobodyさん
2006/05/29(月) 23:31:22ID:mZUygf+Dありがとうございます。
でもローカルなんですけど、それでもパーミッションて関係あるんですかね。
ド素人ですいません。とにかく調べてみます。
0579nobodyさん
2006/05/30(火) 08:16:31ID:???パーミッション分かってない香具師がサイト作ってもソースコード抜かれたりデータ抜かれたりするのがヲチ。
個人情報扱うサイトだけは作らないでくれ。利用者が大迷惑。
0580nobodyさん
2006/05/30(火) 08:22:57ID:???エラーの内容がテンプレートファイルが見つからんとかいうのだったら草植える(w
0581nobodyさん
2006/05/30(火) 12:18:06ID:???(頭文字が小文字)
0582nobodyさん
2006/05/31(水) 12:00:38ID:???0583nobodyさん
2006/05/31(水) 21:15:45ID:???エラーの内容は省略せずにお願いします。
0584nobodyさん
2006/06/02(金) 01:16:31ID:???そしてエスパーは現れずに、質問者は途方に暮れてVBを使い始める。
0585nobodyさん
2006/06/03(土) 00:19:46ID:???0586nobodyさん
2006/06/03(土) 00:20:55ID:???0588nobodyさん
2006/06/03(土) 00:21:49ID:???0589nobodyさん
2006/06/03(土) 00:45:58ID:???return 'hoge';
}
function askdjaocdma(){
return 'askdjaocdma';
}
適当に関数を書いて、登録しないで{$test|hoge|askdjaocdma}と使ってみると何でも使えてしまいます。。。
関数を削除すると、無いよーとエラーにはなります。
0590nobodyさん
2006/06/03(土) 00:51:26ID:???「plugins」というディレクトリにはhogeと定義した関数は入れていません。
0591nobodyさん
2006/06/03(土) 19:33:10ID:???0592nobodyさん
2006/06/06(火) 00:09:12ID:???インクルードするだけで使えるの?
0593nobodyさん
2006/06/08(木) 00:26:47ID:???{method('hoge')}だとエラーになってしまいます。
配列に入れたりして、{method(a[hoge])}とかするしかないでしょうか。
0594nobodyさん
2006/06/08(木) 00:29:55ID:???ちゃんと調べずに書いてごめんなしあ><
0595nobodyさん
2006/06/12(月) 01:45:30ID:???0596nobodyさん
2006/06/19(月) 11:55:23ID:???単純で分かりやすくて簡単に改造も出来るし速いしで結構愛用してたんだけどな・・・
0597nobodyさん
2006/06/22(木) 14:12:56ID:???ttp://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/language.syntax.quotes.html
変数の中に変数を入れる方法ってありますか?
例えば
$num = array('01', '02');
{{foreach from=$num item="num" key="key"}}
<h1>{{$form.enq_01.label}}</h1>
<p>{{$form.enq_01.html}}</p>
{{/foreach}}
で、「enq_01」の01のところに$numを代入したい。
{{$form.enq_$num.label}}
とかやってもだめでした。
0598nobodyさん
2006/06/23(金) 00:17:44ID:???$form.enq[$num].label
これで出来た気がするが。
0599nobodyさん
2006/06/29(木) 14:17:10ID:???Warning: Smarty::require_once(c:\php\includes\internals\core.write_compiled_resource.php) [function.require-once]: failed to open stream: No such file or directory in c:\php\includes\Smarty.class.php on line 1432
Fatal error: Smarty::require_once() [function.require]: Failed opening required 'c:\php\includes\internals\core.write_compiled_resource.php' (include_path='.;c:\php\includes') in c:\php\includes\Smarty.class.php on line 1432
なんかこういうの出てしまいました。
何か解決の糸口を教えていただけないでしょうか。
0600nobodyさん
2006/06/29(木) 15:24:47ID:???以上
0601nobodyさん
2006/06/29(木) 16:17:09ID:???すみません。勘違いしてた。
includes\の中にはSmarty.Class.phpとSmarty_Compiler.class.php
しか入れてなくて、\includes\internals\なんて何処にあんだよ!!
って一人で吠えてました。入れりゃいいのね。
あーすっきり。
>>600
ありがとう!!「以上」って言葉でやっと気づいた。
ずっとPerlしかやってこなかったのに、いきなりPHPをやれと。
でもPHPってなかなか楽しそうですね。それに開発が早そう。
0602nobodyさん
2006/07/23(日) 19:29:29ID:???{<? urlencode($str) ?>}
ではエラーがでてしまいます。
できない?
0603nobodyさん
2006/07/23(日) 19:45:05ID:???0604nobodyさん
2006/07/24(月) 09:26:29ID:???{php}phpinfo();{/php}
とか。
http://smarty.php.net/manual/en/language.function.php.php
マニュアルくらい読め。
0606nobodyさん
2006/07/24(月) 21:30:20ID:???0608602
2006/07/25(火) 00:16:20ID:???0610nobodyさん
2006/07/31(月) 09:24:15ID:???この場合呼び出す.phpファイルと階層が違うためCSSでデザインしにくいです。
何かいい方法ってあるんでしょうか?
0611nobodyさん
2006/08/02(水) 03:03:21ID:???├cssフォルダ
└templatesフォルダ
として、templates内にあるHTML中では、
「<LINK REL="stylesheet" TYPE="text/css" HREF="./css/〜.css">」としておけばOKじゃない?
0612nobodyさん
2006/08/03(木) 12:31:03ID:???自分なりに調べてみたんですが解らなかったです。。
それとも無理なんでしょうか。
0613nobodyさん
2006/08/03(木) 18:04:23ID:???{assign var="stop" value="0"}
{foreach}{if !$stop}
処理
{if ループ抜けたい}{assign var="stop" value="1"}{else}ループ抜けたくない{/if}
{/if}{/foreach}
こんな感じか?
Smartyに渡す前に整形しとくべきだとは思うけど
0614nobodyさん
2006/08/06(日) 20:14:11ID:???0615nobodyさん
2006/08/07(月) 21:34:55ID:muOt4GfJhttp://pc8.2ch.net/test/read.cgi/php/1153652403/
こちらから誘導されてきました。
鮎川寛さんの「 PHP 開発日誌 」ってサイト
どこに行ったかご存知ないですか?
そこで配布していた『HTML テンプレート』を
使いたいのですが見当たらなくて困ってます。
どこに移ったか知っている方、
もしくはPHP5 版『HTML テンプレート』を
再配布しているところを知っている方
教えてください。
0616nobodyさん
2006/08/08(火) 02:11:40ID:???http://sourceforge.net/projects/htmltemplate/
0617615
2006/08/08(火) 20:55:09ID:+NeExxFVありがとうございます!
これって PHP 5.01 版で止まってるんですね。
次のフレームワーク作るときには
別のテンプレートを採用することも考慮しないとな……
0618nobodyさん
2006/08/09(水) 12:49:51ID:???○個目のオブジェクトのメソッドを指定する方法ってあるんでしょうか?
.php
$retarray = array();
while(fetch.....){
$o_work = new $obj;
$retarray[] = $o_work;
}
$smartyobj->assign("objs",$retarray);
テンプレート
{$objs[2]->get_hoge()}
(↑実際にはシンタックスエラーだけど、イメージはこんな感じです)
0619nobodyさん
2006/08/09(水) 13:30:18ID:???0620nobodyさん
2006/08/09(水) 13:51:51ID:z3PeQgxkコレだと動きますね(汗
他オブジェクトメソッドの返り血を指定するとエラーになるようです↓うむむ・・
{$objA[$objB->get_hoge()]->get_hoge()}
■ このスレッドは過去ログ倉庫に格納されています