トップページ⇒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/
0369nobodyさん2006/02/22(水) 15:26:57ID:???
>>368
ここへ来たって事は、
テンプレート園児を使うように仕様変更するつもり
って事だな?
03703682006/02/22(水) 16:49:35ID:???
>>369
くだ質スレで質問したところこちらに誘導されたのでこちらで書き込みました。
まだPHPを初めて短いのでテンプレートエンジンに手を出すことは考えていませんでした。
処理を記述したphpファイルからデザインhtmlを呼び出して画面表示できればいいと思っていたので、
外部ファイルを読み込んで変数をぶちこんで出力、ということさえできれば
それ以上の機能はとりあえず欲していません。
テンプレートエンジンに頼るしか手段はないものなのでしょうか?
0371nobodyさん2006/02/22(水) 16:56:55ID:Lv5GjAsx
ヒント
$smarty->fetch("_template.html");
0372nobodyさん2006/02/22(水) 17:26:17ID:???
>>370
先のことを考えるなら、テンプレートエンジンの導入も健闘してみる価値はある。
とりあえず、急ぎで何とかしたいって言うなら、

_template.html内の{$hoge}の部分を
<?php echo $hoge ?>
として
php側で処理の最後に
include('_template.html');
0373nobodyさん2006/02/22(水) 20:50:40ID:???
>>368
私も昔smarty程の機能は必要がないと思いってこんな方法で試行したことがあります。

【テンプレート(index.tpl)】
<html>
<body>
<img src="%%GAZOU%%">
</body>
</html>

【PHP】
//テンプレート読み込み
$Path = 'index.tpl';
if (($fp = fopen($Path,"r")) == false){
   echo('error: load template')
}
while(!feof($fp)){
   $result .= fgets($fp);
}
fclose($fp);

$result = str_replace("%%GAZOU%%", 'welcom.jpg', $result);//文字置き換え
echo($result);//出力

テンプレートデータを持つクラスを作ってしまえば、ソースも美しくなるでしょう。
私の場合、クラスに機能追加し始めだしてから・・・「結局smarty??」となりましたがw
03743732006/02/22(水) 21:04:30ID:???
あちなみに、368さんのやり方なら

>>_template.htmlの情報を挿入したい部分に{$hoge}と入れておき、
>>$hoge = "output test";
>>$output = file_get_content("_template.html");
$output = str_replace('{$hoge}', $hoge, $output);
>>echo $output;

と4行目を追加すれば置き換えられると思いますよ。
0375nobodyさん2006/02/23(木) 01:11:06ID:???
includeじゃだめなの?
<?php echo $hoge ?>
がめんどくさくないなら一番楽だと思うんだけど。
0376nobodyさん2006/02/23(木) 01:20:27ID:???
うわーすげえ文盲やっちまった。
0377nobodyさん2006/02/23(木) 21:14:59ID:81PJfTdI
Smartyって__toStringメソッドって実行してくれないの?
0378nobodyさん2006/02/24(金) 16:34:08ID:S8CqOJp1
・・・頼むから教えてよ。
0379nobodyさん2006/02/24(金) 16:41:34ID:???
>>378
誰だお前は?
03803772006/02/24(金) 16:56:42ID:S8CqOJp1
>>379
俺は377
0381nobodyさん2006/02/24(金) 23:56:24ID:???
テンプレートの方が便利なところはテンプレート使って、
後はこれでいいよね。

{include_php file="hoge.php"}
0382nobodyさん2006/02/25(土) 09:21:21ID:???
{section name=i loop=$hoge}
<li>{$hoge[i]}</li>
{/section}

この時に、if (i == count($hoge)) の場合に処理をしたいんですが、
どうすればいいですか?
0383nobodyさん2006/02/25(土) 09:28:01ID:???
{if $smarty.section.i.last}
0384nobodyさん2006/02/25(土) 09:55:39ID:???
>>383
ぬぉおおおおさんきゅう
0385nobodyさん2006/02/26(日) 18:52:13ID:???
smartyってポシャらないよね?
0386nobodyさん2006/02/26(日) 18:58:41ID:???
シャラポワ?
0387nobodyさん2006/02/26(日) 21:34:41ID:???

テンプレート内の{php}内にある $hogeに変数を渡せますか?

<h1>{$hoge}</h1> ←ここに入ってる$hogeを

{php}
sample($hoge); ←ここに入れたい
{/php}
0388nobodyさん2006/02/26(日) 21:52:40ID:???
{assign var="fuga" value=$hoge}

でいけない?
0389nobodyさん2006/02/26(日) 22:04:09ID:???
>>388
できませんでした。
0390nobodyさん2006/02/26(日) 22:14:23ID:???
当てずっぽだけど、
sample($this->get_template_vars('hoge'));
とかどうだろ。
0391nobodyさん2006/02/26(日) 22:20:41ID:???
>>390
うわ!いけました!
ありがと!!!!!!!!!
0392nobodyさん2006/02/27(月) 22:17:07ID:???
これ便利ですね。
一方ではパフォーマンス落ちるとか、
フレームワークの方がいいとか言われてますが、
どう思いますか?
0393nobodyさん2006/02/27(月) 22:21:19ID:???
フレームワークとテンプレートエンジンは役割が違うくってよ
フレームワークを骨とすると、テンプレートエンジンは皮。
0394nobodyさん2006/02/27(月) 23:20:42ID:???
合わせるとスネ夫
0395nobodyさん2006/02/28(火) 01:38:49ID:???
PHPはのび太
0396nobodyさん2006/02/28(火) 09:34:12ID:???
ドラえもんは?
0397nobodyさん2006/02/28(火) 11:25:29ID:???
WEBサーバ
0398nobodyさん2006/02/28(火) 13:11:01ID:08x2mpcp
しずちゃんは?
0399nobodyさん2006/02/28(火) 13:19:21ID:0HF5o3Qs
荒川静香
0400nobodyさん2006/02/28(火) 14:19:59ID:???
>>399
ちとワロタ
0401nobodyさん2006/02/28(火) 15:19:11ID:???
旬だね
0402nobodyさん2006/02/28(火) 19:33:40ID:???
テンプレート自動生成のフレームワークとかあるのかな?
smarty覚えて損したかな??
だってさ、
やっとPHP覚えて、smarty覚えたんだけど・・・
フレームワークっつーのを知ってまたフレームワーク覚えなきゃなあ・・・
0403nobodyさん2006/02/28(火) 19:59:21ID:???
別に覚えなくちゃいけないもんじゃない
フレームワーク不要派もいるし
0404nobodyさん2006/02/28(火) 20:15:37ID:???
>>402
smartyを利用してるフレームワークはあるし
無駄にはならないと思うけど?
0405nobodyさん2006/02/28(火) 20:57:20ID:???
ってかSmartyって普通に使う分にはそんなに覚えることないし
0406nobodyさん2006/02/28(火) 21:04:43ID:???
すみません。フレームワークって何ですか?
0407nobodyさん2006/02/28(火) 21:12:10ID:???
おれがSmartyで使うものリスト:

基本的に {$var} {if} {foreach} {include} {cycle}
まれに {section} {assign} {strip}
あと修飾子 |default |nl2br |date_format

それ以外のことはだいたいPHPでやってる。
0408nobodyさん2006/03/01(水) 01:26:34ID:???
タグが混在しているhtmlをテンプレートにするのって大変ですよね。
{if} {/if}だらけになっちゃう。
どうしてますか?
0409nobodyさん2006/03/01(水) 04:31:23ID:???
> タグが混在しているhtml
とは?
0410nobodyさん2006/03/01(水) 06:18:00ID:BvRBPutv
セックスボムキタ━━━━━━━━(゚∀゚)━━━━━━━━!!!
0411nobodyさん2006/03/01(水) 15:07:12ID:???
>>409
要はテンプレートって事じゃないの?
>>408
俺はテンプレートを細分化して対応してるけど
04124082006/03/01(水) 20:02:59ID:???
例えばこんなのです。

<h1>見出し</h1>
<p>あああ<span>いいい</span>ううう<p>
<h2>見出し</h2>
<p>ええええ<a href="hoge">おおお</a><p>
<hr>
<h3>見出し</h3>
<div>
<ul>
<li><a href="hoge">かかか</a></li>
<li><a href="hoge">ききき</a></li>
<li><a href="hoge">くくく</a></li>
<li><a href="hoge">けけけ</a></li>
<li><strong><a href="hoge">こここ</a></strong></li>
</ul>
</div>

0413nobodyさん2006/03/01(水) 20:05:42ID:???
ええええ
だけ四文字なのが気になる
04144082006/03/01(水) 20:11:28ID:???
それで、a hrefがあったりなかったり、
strongがあったりなかったり、
ulだったりolだったり、h3があったりなかったり・・・

大変・・・
0415nobodyさん2006/03/02(木) 02:00:48ID:???
smartyで変数の計算はどう記述したらいいでしょうか。
具体的には
{$percent}%:残り{100 - $percent}%
$percentは80とすると
80%:残り20%
と表示したいのですが
実際は
80%:残り100%
となります。
0416nobodyさん2006/03/02(木) 03:01:45ID:???
それで行けたと思うけど
スペルミスしてない?
0417nobodyさん2006/03/02(木) 10:41:25ID:???
>415
半角スペース消せばいける気がする。
04184152006/03/02(木) 12:04:45ID:???
>>416-417
{100-$percent}だと(実際は$result.percent)
Fatal error: Smarty error: [in TemplateName line 85]:
syntax error: unrecognized tag:
100-$result.percent (Smarty_Compiler.class.php, line 436)
in Path/to/Smarty.class.php on line 1095
となってしまいます。
{$result.percent - 100}だと$result.percentの値
{100 - $result.percent}だと100
となります。「tagじゃ無ぇ」と言われても…。
どうしたらよいのでしょうか。
0419nobodyさん2006/03/02(木) 12:21:32ID:???
>>418
式の左側がリテラル数値だと構文解析がうまく行かないみたいね。
100を一旦別の変数にアサインしておくとかしか思いつかない…
04204152006/03/02(木) 12:42:52ID:???
>>419
別変数にアサインで解決しました。
半角スペースを使えないというのも勉強になりました。
ありがとうございました。
0421nobodyさん2006/03/02(木) 17:58:46ID:???
以前(100 - $percent)とかにしたら構文解析通ったような気がする
0422nobodyさん2006/03/02(木) 17:59:36ID:???
正確に書くと
{(100-$percent)}
0423nobodyさん2006/03/02(木) 19:51:23ID:???
>>422
それで試してみたんだがエラーになるんだよね。
0424nobodyさん2006/03/02(木) 20:44:41ID:???
{math equation="100-`$result.percent`"}
0425nobodyさん2006/03/03(金) 01:46:20ID:???
そこまでするとテンプレに記述する事じゃなくなってくる気がするw
0426nobodyさん2006/03/03(金) 04:19:51ID:iZN9RII3
Smartyって
同じテンプレートファイル名は使えないの?
複数のmoduleにIndex.tplを置いてるんだけど
コンパイルキャッシュがバッティング(一方のファイルがあれば、それを読んでしまう)
するようになった。
キャッシュファイルの先頭に付加される文字列って
ファイルの位置によって変えてるんじゃないのかなあ。
0427nobodyさん2006/03/03(金) 07:41:19ID:???
>>426
$smarty->compile_dirや$smarty->cache_dirをテンプレートファイルがあるディレクトリに応じて変えてやるしかない。
テンプレートファイルの置き場所を階層化する場合ある程度ラッパとか書くといいと思う。
0428nobodyさん2006/03/03(金) 10:56:04ID:???
>426
crc32()とか使ってるみたいだから、衝突する確率が
それほど高い訳でも無いと思うが、あり得なくは無いな。
反則かもしれんが、_get_auto_filename() をオーバーライドするとか。
0429nobodyさん2006/03/03(金) 13:55:42ID:???
テンプレートエンジン作ったけど、ここにさらすのが怖い。。
0430nobodyさん2006/03/03(金) 14:42:52ID:???
>>429
いいからさらせ
気が無いならこなくていいよ
0431nobodyさん2006/03/03(金) 15:41:39ID:???
>>408
スタイルシートを切り替えるという方法もある
0432nobodyさん2006/03/03(金) 18:34:46ID:???
>>428
以前俺も同じ問題ではまってたときファイル名かぶったら確実にバッティングしてた気がするけど気のせいかな?
つーかディレクトリ変えるのが一番楽だよ。
ファイル名がかぶってるってことは別のディレクトリにあるってことだから、そのtemplate_dirとcompile_dir・cach_dirに対応関係もたせりゃいいだけだし。
お好みでconfig_dirも合わせてやったり。
個人的にはconfigファイル使わないけどね。
0433nobodyさん2006/03/03(金) 22:31:43ID:???
パス含めてコンパイルファイル名決めればいいのに
0434nobodyさん2006/03/03(金) 22:38:35ID:???
>432
428だけど、よく見たら、crcの算出に使ってるファイル名には
template_dirの部分が入ってないみたいだから、
template_dir変えてcompile_dir変えないと確実に起きるのかもな。
ソース見た癖にいい加減な書き込みですまんかった。
0435nobodyさん2006/03/03(金) 22:45:17ID:???
同名だとバッティングすると思う。ソース読んでないけど、
実経験上。
俺はフレームワークなど使う場合は、moduleごとにcompileディレクトリ作成してるよ。
0436nobodyさん2006/03/03(金) 22:55:29ID:???
$compile_id使った記憶がある
0437nobodyさん2006/03/03(金) 23:19:56ID:???
template_dir/index.tpl とtemplate_dir/hoge/index.tplでも
バッティングするってことですか?


0438nobodyさん2006/03/03(金) 23:35:56ID:???
>>436
そんなのあるんだ。知らなかった。

>>437
template_dirが違ってても、compile_dirが同じならバッティングする、
と思ってたけど、>>436でなんとかなるのかな?
調べてないからわからんけど。
0439nobodyさん2006/03/03(金) 23:42:52ID:???
template_dir/index.tpl
template_dir/hoge_index.tpl

これで解決するよね
04404362006/03/04(土) 01:19:29ID:???
自分の場合mojaviだったから、Smarty::fetch()の第3引数にmodule名を渡してた
fetch()の第3引数がnullのときはSmarty::$compile_idが使われるみたい
04414262006/03/04(土) 05:03:02ID:???
たくさん情報�dクスです
$compile_idにmodule名をセットする方法でOKでした
>>433
俺もそうする方が自然だと思うなぁ
0442nobodyさん2006/03/04(土) 10:08:50ID:???
バカばっか
0443nobodyさん2006/03/04(土) 10:09:35ID:???
↑↑ ごめん誤爆orz
0444nobodyさん2006/03/04(土) 13:12:53ID:???
>>433
そりゃそうだけど、たぶんこの問題がおきるのはsmartyの初期化やdisplayメソッドを呼び出す部分を共通化して一箇所に集めた場合。
たとえばフレームワーク(必ずしもmojaviとか大げさなものでなくても単にアプリ全体の骨組みって意味で)を作るとこういう問題にぶちあたりうる。
0445nobodyさん2006/03/04(土) 18:05:13ID:???
>>443
誤爆でもないと思うけど…
0446nobodyさん2006/03/04(土) 19:07:52ID:???
いや、このスレの人はやさしいし、回答が的確だし、サマリーしてくれるし。
良スレです。お世話になってます。
0447nobodyさん2006/03/08(水) 11:15:02ID:???
defineで定義した定数をテンプレート内で読み込むにはどうしたらよいのでしょうか?
{literal} <?=DEFINED_VALID ?> {/literal} としてみても、
Smartyの構文解析回避するとPHPの構文解析も飛ばされるようで値が読み込めません。

やっぱ一個一個変数にassignしなおさなければならないのでしょうか?(;´Д`A
0448nobodyさん2006/03/08(水) 11:27:18ID:???
>>447
自己解決しました。
予約変数$smarty.constでした。
マニュアル百回読み直してきます…
0449nobodyさん2006/03/08(水) 23:50:23ID:???
>>448
うそつきにならないようにね^^
0450nobodyさん2006/03/09(木) 15:36:02ID:???
 Smartyで、数字に3桁ごとにカンマを入れる時、どうしてますか?
 こういう作業は、テンプレートの仕事かなと思い、修正子を調べた
ところ、該当するのが見当たりませんでした。
 結局、number_format 関数を通した値をテンプレートに渡す事に
したんですが、何か釈然としなくて・・・。
0451nobodyさん2006/03/09(木) 15:53:08ID:???
>>450
俺はそれでいいと思う。
テンプレートに突入する前にMVCモデルのViewでやると考えれば違和感ないと思うけどどうだろう?
0452nobodyさん2006/03/09(木) 15:55:38ID:???
>>450
ttp://p0t.jp/mt/archives/2004/07/smarty.html
04534502006/03/09(木) 16:09:48ID:???
御回答ありがとうございます。

>>451

 そういう見方も出来るんですが、時刻表示とかは修正子を使って、
数字にカンマを入れるときには上位でというのはバランスが悪いん
ですよね。

>>452

 マニュアルの読み込みが足りませんでした。(^^;
 これが決定打みたいですね。
0454nobodyさん2006/03/09(木) 16:31:28ID:???
ていうかregister_modifier()しなくても
PHP組み込みの関数はそのまま修飾子として使えるはずだけど
04554542006/03/09(木) 16:32:41ID:???
修飾子じゃなくて修正子か・・・
04564502006/03/09(木) 18:20:16ID:???
 マニュアル読み直しました。
 454さんが仰る通り、PHP組み込み関数は、そのまま使える様です。

 お騒がせしました。
0457nobodyさん2006/03/13(月) 02:48:18ID:LxXJ5I4v
smartyに挑戦してみました。
乱数をassignしたのですが反映されません。
キャッシュしてるからというのはわかるんですがこれでは静的ページとなんら変わらないと思います。
実際に使用されてる方はどのように使ってるのでしょうか?
よろしくお願いします。
0458nobodyさん2006/03/13(月) 05:34:35ID:???
ブラウザのキャッシュじゃないの?
0459nobodyさん2006/03/13(月) 09:59:39ID:???
>457
そんなレベルの人間が使うライブラリじゃない。
おとなしく静的ページにしとけ。
0460nobodyさん2006/03/13(月) 10:38:47ID:???
>>457
http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/caching.html

 を見ても解決しない?
0461nobodyさん2006/03/13(月) 18:59:41ID:vm5765Ln
SmartyをPHP5で使うときの
Strict Standardsエラーってどうしてますか?
開発中はE_STRICTを有効にしたいのですが
なにか回避策はないでしょうか?
04624612006/03/13(月) 19:19:07ID:???
自己レスですみません
smartyのrequireのときだけ
一時的にエラーを無効にすることで回避できました
失礼しました
0463nobodyさん2006/03/13(月) 19:35:16ID:???
結局テンプレ導入する事で、MVCからVを分離してウェブプログラミングに専念するってのが思想?
とはいえHTMLの埋め込みタグはあんまりきれいじゃないし、デザには理解不能。

デザがHTML埋め込みでプログラミングもひっくるめてHTML記述の責任持てよ。
0464nobodyさん2006/03/13(月) 19:50:18ID:???
>>462
5.1.3 から "var $hoge" では Notice 出ないようになるみたい。(CVS の NEWS ファイルより)
?? Mar 2006, PHP 5.1.3RC2
- Removed the E_STRICT deprecation notice from "var". (Ilia)
0465nobodyさん2006/03/14(火) 10:11:00ID:???
smarty.class.phpでぐぐると、設定不良サイトいっぱい見つかる(w
04664572006/03/16(木) 02:50:57ID:???
>>460
キャッシュ時間の設定とかだとユーザ毎に違う内容を表示させるなどの場合は毎回コンパイルをする事になりますよね?
それは嫌なのでinsert使って見たのですがとても使いづらいです。
毎回表示が変わるようなサイトには向かないんでしょうか。
ユーザ毎に違うデザインを使うのでテンプレートがあるのはとても良いのですが。。
0467nobodyさん2006/03/16(木) 04:01:10ID:???
>>466
「キャッシュ」と「テンプレートのコンパイル」を勘違いしていない?
0468nobodyさん2006/03/16(木) 06:57:34ID:???
>466
低脳ウゼェ、消えろ
■ このスレッドは過去ログ倉庫に格納されています