トップページ⇒php
983コメント287KB

【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/
0477nobodyさん2006/03/17(金) 13:52:50ID:???
印税欲しい関係者必死だな。
0478nobodyさん2006/03/17(金) 18:02:15ID:???
俺それ発売されてすぐ買ったよ。
>>474〜>>476
全員正しいと思った。
0479nobodyさん2006/03/18(土) 16:36:29ID:???
Smarty設置について教えてください。
test.php
├Smarty
├log┬templete [中にtest.tpl.html]
   ├templete_c
test.phpはこうなっています
define("SMARTY_DIR", "Smarty/");
require_once "Smarty/Smarty.class.php";
$smarty = new Smarty();
$smarty->templete_dir = "log/templetes";
$smarty->compile_dir = "log/templetes_c";
$smarty->assign("now_time", gmdate("Y:m:d H:i:s"));
$smarty->display("test.tpl.html");
ところが、次のようなエラーが出てしまいます。
Warning: Smarty error: unable to read resource: "test.tpl.html" in C:\MyWeb\web\php\script\blabla\Smarty\Smarty.class.php on line 1088
何が原因なのか教えていただけませんか?
0480nobodyさん2006/03/18(土) 17:47:39ID:???
define("SMARTY_DIR", "C:\MyWeb\web\php\script\blabla\Smarty\");
0481nobodyさん2006/03/18(土) 17:55:27ID:???
$smarty->templete_dir = SMARTY_DIR."log/templetes";
$smarty->compile_dir = SMARTY_DIR."log/templetes_c";
0482nobodyさん2006/03/18(土) 19:49:31ID:???
レスありがとうございます。以下のように変更しました。
define("SMARTY_DIR", 'C:\MyWeb\web\php\script\blabla\Smarty\\');
$smarty->templete_dir = SMARTY_DIR. "log/templetes";
$smarty->compile_dir = SMARTY_DIR. "log/templetes_c";
しかし、まだ同じエラーが出てしまいます…。
0483nobodyさん2006/03/18(土) 20:52:33ID:EsSA/NIp
>>482

test.php
<?php
require_once 'Smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->template_dir = dirname(__FILE__) . '/log/templates';
$smarty->compile_dir = dirname(__FILE__) . '/log/templates_c';
...........
$smarty->display('test.tpl.html');
?>
0484nobodyさん2006/03/19(日) 00:46:35ID:???
Smartyで、テンプレートファイルの代わりに
変数のに読み込んでおいた内容と使う方法ってあります?

同じ内容のテンプレートを場合によって微妙にパスとかを変えたいので…。
具体的には、本場用とプレビュー用のHTMLを大量生成したいので、
イチイチ1ファイルごとにテンプレートファイルを生成してやると、
速度的に問題があるので…。
0485nobodyさん2006/03/19(日) 00:59:14ID:???
>>483
!!!上手くいきました!
大変お恥ずかしいですが、template_dirがtemplete_dirになっていたようですorz
失礼しました
0486nobodyさん2006/03/19(日) 22:09:41ID:???
目的と言うか用途が読めない。
練習ならディレクトリごと変えてるでしょ。
0487nobodyさん2006/03/19(日) 22:30:06ID:???
>484
なにかSmartyの用途を誤解してないか?
テンプレートファイル自体を動的に生成する必要がある状況って
思い当たらないのだが。
0488nobodyさん2006/03/22(水) 18:58:12ID:???
flexyでキャッシュできますか?
0489nobodyさん2006/03/24(金) 20:46:45ID:???
できる
0490nobodyさん2006/03/25(土) 09:48:17ID:???
できない
0491nobodyさん2006/03/25(土) 14:14:45ID:RtAYAo7R
できる
0492nobodyさん2006/03/25(土) 17:11:47ID:WzKCkjot
HTML_Template_Sigmaで質問です。
あるブロックを任意の回数だけ繰り返し表示したいのですが、
例えば以下のようなブロックがある場合、どのメソッドを使えば
いいでしょうか?
ちなみにparseメソッドでは表示されませんでした。

<!-- BEGIN foo -->
テスト
<!-- END foo -->
0493nobodyさん2006/03/25(土) 22:43:48ID:???
できない
0494nobodyさん2006/03/25(土) 22:55:58ID:???
>>492
つ[foreach]
0495nobodyさん2006/03/26(日) 01:09:55ID:8F2N8by3
>>493
え?Sigmaってブロックの繰り返しとか分岐とかできないの?

>>494
Sigmaにforeachってメソッドがあるの?
それともPHPのforeachのこと?
0496nobodyさん2006/03/26(日) 01:36:29ID:???
>>495
できる
ある
0497nobodyさん2006/03/26(日) 02:35:34ID:???
できるとかできないとかじゃなくて教えてくれりゃーいいのにな。
性格悪いなおい。
0498nobodyさん2006/03/26(日) 03:16:58ID:???
なんで pear のドキュメントみねーんだ
0499nobodyさん2006/03/26(日) 10:32:26ID:???
>>497
やだ
はい
0500nobodyさん2006/03/26(日) 15:17:52ID:???
>>499
とりあえず、死んどけ雑魚。
Sigma面倒だから自分で作った。
じゃーな雑魚ども。
0501nobodyさん2006/03/26(日) 19:27:14ID:???
まあ無料だしな。
詳細が知りたければ金払わないと。
0502nobodyさん2006/03/26(日) 23:09:47ID:???
>>500
雑魚ってあんまり使わない罵倒語だよね。
君はよく言われる状況なんだね(^^;がんばって生きてね(^^;;;;;;;;
0503nobodyさん2006/03/26(日) 23:32:27ID:???
このスレは荒らさないでください
0504nobodyさん2006/03/27(月) 00:53:48ID:???
>>502
日本語も分からないか?
雑魚ってお前みたいな奴のことを言うんだよ。
良かったな一つお利巧になれてw
0505nobodyさん2006/03/27(月) 01:18:28ID:???
>>504
http://bubble4.2ch.net/test/read.cgi/wm/1142433991/444
444 名無しさん@お腹いっぱい。 sage 2006/03/26(日) 12:15:46 ID:nUZ48+P7
なんなら徹底的に白黒つけようか?オマエが恥かくだけだぞ。
こっちは引くと言ってるんだ。おとなしくしていろ。
0506nobodyさん2006/03/27(月) 01:19:06ID:???
この板自体荒れる運命にあるしな。
荒れてウザイから隔離板建てられてるし。
廚向けの言語を使う以上、ノイズが多いのは我慢してもらわないと。
0507nobodyさん2006/03/27(月) 03:12:19ID:???
すぐ荒れるしやっぱID欲しいよなぁ。
自治スレで議論してもつけてくれないとからしいけど・・・
0508nobodyさん2006/03/27(月) 14:41:12ID:???
教えてほしいときはうそでも教えてくださいって書くと良いですよ。
0509nobodyさん2006/03/27(月) 15:33:04ID:???
ウソはすぐに見破りますよ
0510nobodyさん2006/03/27(月) 15:45:11ID:???
しかし見破らせない
0511nobodyさん2006/03/27(月) 16:49:12ID:???
破瓜の血を流させてやる
0512nobodyさん2006/03/27(月) 16:50:15ID:???
むしろ見破れないだろ。だから荒れる。
0513nobodyさん2006/03/27(月) 20:31:56ID:???
正直者が馬鹿を見る
0514nobodyさん2006/03/28(火) 00:08:21ID:???
flexyでキャッシュホントにできますか?
0515nobodyさん2006/03/28(火) 00:14:29ID:???
できますん
0516nobodyさん2006/03/28(火) 00:26:44ID:???
出来ると思えば出来る。
出来ないと思うな、思えば負けよ
0517nobodyさん2006/03/28(火) 05:29:14ID:???
荒れるようなスレではないのになぁ。
0518nobodyさん2006/03/28(火) 08:11:12ID:???
だからこんなところで聞かずにドキュメント嫁
0519nobodyさん2006/03/28(火) 08:20:15ID:???
英語よめません><><><>
0520nobodyさん2006/03/28(火) 09:11:59ID:???
http://pear.php.net/manual/en/package.html.html-template-flexy.php
cacheって単語ないよね。
0521nobodyさん2006/03/28(火) 09:23:09ID:???
なんで英語?
日本語版あるのに。
0522nobodyさん2006/03/28(火) 09:25:06ID:???
日本語よめません><><><>
0523nobodyさん2006/03/28(火) 09:25:51ID:???
>>520
http://pear.php.net/manual/ja/package.html.html-template-flexy.html-template-flexy.compile.php

じゃねーの?
キャッシュってどの部分の話なのか分からないけど。

>>521
ほんの一部だけな。
0524nobodyさん2006/03/28(火) 12:05:09ID:ct8TgCpW
Smarty使え
0525nobodyさん2006/03/28(火) 12:17:18ID:???
内容的には荒れる要素は無いけど、荒れるような廚が来やすい。
0526nobodyさん2006/03/28(火) 17:01:31ID:???
>>523
Cache_Liteなんかを使うのがFlexy流

って以前このスレで見た
0527nobodyさん2006/03/29(水) 21:33:36ID:???
> テンプレートのコンパイルは必要に応じて以下の場合にのみ実行されます。
> コンパイルされたファイルが存在しない
> テンプレートに変更が加えられており、コンパイルされたものより大きい

テンプレートに変更がない場合は既にコンパイルしたファイルを使うわけだからこれで十分じゃない
0528nobodyさん2006/04/02(日) 21:51:22ID:pQIOcBrE
Smartyでの配列の取得方法について教えて下さい。

ステータスには「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:???
>>528
{foreach from=$CODE item=c}
{$STATUS.c}
{/foreach}
でいいんじゃないの?
05305282006/04/04(火) 16:53:19ID:???
>>529
ご回答どうもです。
サンプルには書いていないのですが、
同時に$ID[i]が使いたい場合もあるのです。

なのでsectionでなんとかできないでしょうか?
0531nobodyさん2006/04/05(水) 00:44:38ID:???
>>528
スマートにこだわるのなら
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:???
>>532
<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/
0537nobodyさん2006/04/18(火) 20:27:22ID:???
>>536
こっちのスレの話題なのにね。w
0538nobodyさん2006/04/18(火) 20:30:28ID:???
PHP関連スレにしては異常な伸びだなw
0539nobodyさん2006/04/21(金) 07:18:24ID:qi5wvjsu
>>536のフレームワークスレを読んでて何か書きたくて来ました。
他のテンプレートエンジンvsSmartyならたくさん議論出来ると思うのですが、
ライバルがhtml+phpなのがにんともかんとも。
みんなデザイナさんが書いたhtml+phpソースで鼻血出した事無いのかなー
0540nobodyさん2006/04/21(金) 07:27:03ID:G2Rp1nFE
>>536
Smartyなら鼻血ださないで済むの?
Flexyなら出さずに済みそうだけど。
0541nobodyさん2006/04/21(金) 11:25:09ID:???
>>539
> ライバルがhtml+phpなのがにんともかんとも。
Smartyが実際にそれと同様の結果をもたらしてるんだからしょうがない。
0542nobodyさん2006/04/21(金) 11:59:49ID:???
smartyは変に機能をつけすぎなんだよな。
もうちょっと使うべきものが制限されてたら端から高機能を求めようなんて思わないのに。
そもそも目的はViewを分離(=Viewに制限)することだし、すでに十分果たせてるわな。
0543nobodyさん2006/04/21(金) 12:04:18ID:???
>>542
別に高機能でもいいじゃん
使わないように制限すれば
05445422006/04/21(金) 14:04:57ID:???
>>543
スマン勘違い。
smartyには表示と関係ない機能が無駄についてるのかと思ってたけど、よく調べてみたらどれも表示に関連する機能だった。
0545nobodyさん2006/04/25(火) 20:40:31ID:???
smartyのキャッシュに関して質問です。

DBに接続&データを取得し、それをsmartyにアサインして、表示させています。
$obj_smarty->diplay("hoge.tpl",$id);
が一番最後にあるため、せっかくのキャッシュデータがあるにもかかわらず、その前の時点でDB接続をしてしまいます。
表示されるデータは結局キャッシュされたものなんですが。

(コントローラの)ページの先頭で、すでにキャッシュが存在するかどうかのチェックして、
存在した場合は各種処理をスキップするには、どのようにしたら良いのでしょうか?
05465452006/04/25(火) 21:03:11ID:???
is_cachedを発見しました。お騒がせしました。
0547nobodyさん2006/04/26(水) 18:18:54ID:???
別々のディレクトリに、内容の違う hoge.php があり、
それを一つの temolate_c に出力してしまうのはやっぱ問題ありますかね
0548nobodyさん2006/04/26(水) 18:21:50ID:???
>>547
別に構わないと思うけど「temolate_c」は止めた方がいいと思う。
05495472006/04/26(水) 18:34:41ID:???
>>548
�dクス
今タイポに気付いて一人で吹きました
0550nobodyさん2006/05/01(月) 22:28:39ID:???
Dreamweaver8で、Smartyのテンプレートをデザインしたいのですが、
テンプレート内で他のテンプレートをincludeすると、ちゃんと表示されない。

で、ここに辿り着いたのですが、
ttp://smarty.incutio.com/?page=SmartyDreamweaver

最初の方でデリミタを指定できるっぽいのですが、
"{{"、"}}"と指定しても、ちゃんとincludeしてくれない。
初期設定の"{"、"}"だとincludeしてくれるんだけど…。
この設定でデリミタを変更しても、ちゃんと動いている人いますか?
0551nobodyさん2006/05/02(火) 00:15:55ID:???
<{ }>ならどうでしょうか
05525502006/05/02(火) 00:57:53ID:???
>>551
それも"<%"とかも駄目だったよ…。
Dreamweaver側の設定も何か必要なのかなぁ。
上のコード見ても、ただデミリタを置き換えてるだけっぽいんだけど。
05535502006/05/02(火) 01:00:41ID:???
あ。ちなみにSmartyの方の設定が間違ってるとか、
デミリタとincludeの間に、スペースが入ってるとかではないです。
("{"、"}"だとちゃんとincludeされるし)
0554nobodyさん2006/05/02(火) 16:46:29ID:???
Smartyで {$data.日本語} っていうのは無理ですよね?
日本語文字列がキーになっているのを表示したいだけなんですけど。

代替方法として(実験中の断片コードしかなくてすみませんが)
次のようなものを考えました。
(もし日本語文字列が普通に使えるのなら無駄になっちゃうんですが・・・)

その1の案はプラグインを作らなくてもいいがテンプレートが冗長になる。
その2のコンパイラ関数の案はテンプレートが冗長にはならないが、修飾子が使えない。
その3のテンプレート関数の案は冗長にはならず修飾子が使えるが、
コンパイル後のコードがコンパイラ関数よりも無駄がある。

修飾子を使いたいので、その3の方法を採用しようと思っています。

もっと良い方法や間違い・勘違いがあったらコメントください。
0555つづき2006/05/02(火) 16:47:03ID:???
その1(いったん変数に入れてから参照)
{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:???
とりあえず、その3のコードの完成版(とりあえず動くだけ版?)です。

【サンプルテンプレート】
{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;
}
?>
0558nobodyさん2006/05/02(火) 20:59:24ID:???
>>554
what internal/script encoding are you using ?
0559nobodyさん2006/05/02(火) 21:02:51ID:???
>>558
どういう意味ですか?
正規表現の\wに日本語はマッチしないから
エンコードとか関係ないはずですが?
0560 株価【99】 NGNG
utf8をwordwrapしているのだが、9の倍数だと文字化けが起こらん
0561 株価【99】 NGNG
とおもったら嘘でした。
0562nobodyさん2006/05/08(月) 12:47:22ID:???
チックショー!!!
0563nobodyさん2006/05/14(日) 15:18:13ID:???
ワロスwww
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:???
Smartyの関数でSwitch文はかけますか?
0567nobodyさん2006/05/26(金) 05:01:33ID:???
>>566
ifでいいやろ。switchが可能だったとして、手間も可読性もあまり変わるまい
0568nobodyさん2006/05/26(金) 05:09:34ID:???
>>567 わかりまいた
0569nobodyさん2006/05/26(金) 15:47:30ID:???
smartyでincludeしたファイルに渡した変数の参照方法を教えて
0570nobodyさん2006/05/26(金) 15:49:24ID:???
$ほにゃららか 失礼しました
0571nobodyさん2006/05/26(金) 18:29:06ID:???
569だけど
{include file=xxx.tpl value=1}
{include file=xxx.tpl value=2}
{include file=xxx.tpl value=3}

としてもxxx.tplで$valueを参照すると最初の値(1)しか入ってこないのはなぜ?
0572nobodyさん2006/05/26(金) 18:38:13ID:???
>>571
compile_dir掃除 or 関連tplを全部保存し直してファイル更新日更新してみたら?
0573nobodyさん2006/05/26(金) 19:19:52ID:???
>>572
ミスって同じ値を渡してただけだった o.....rz
ごめんなさい
0574nobodyさん2006/05/29(月) 22:44:38ID:mZUygf+D
Smartyエラーが出て困っています。Smarty.class.php on line 1450 という感じです。
エラーを読んだ限りでは、ファイルのディレクトリが違うかファイルが存在していないといった
感じだったのですが、テストしたところ動作はしていました。
インクルードパスに原因があるのでしょうか、
ちゃんとSmartyのディレクトリを指定しています。
どなたかアドバイス頂ければな、と思います。お願いします。
0575nobodyさん2006/05/29(月) 22:47:07ID:???
エスパー様!エスパー様はいらっしゃいませんか?!
0576nobodyさん2006/05/29(月) 23:02:14ID:???
>>574
コンパイルディレクトリのパーミッション確認してみそ。
0577nobodyさん2006/05/29(月) 23:31:22ID:mZUygf+D
>>576
ありがとうございます。
でもローカルなんですけど、それでもパーミッションて関係あるんですかね。
ド素人ですいません。とにかく調べてみます。
■ このスレッドは過去ログ倉庫に格納されています