トップページ⇒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/
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
ありがとうございます。
でもローカルなんですけど、それでもパーミッションて関係あるんですかね。
ド素人ですいません。とにかく調べてみます。
0578nobodyさん2006/05/29(月) 23:46:15ID:???
>>577
ろ、ろ、ろーかる?
0579nobodyさん2006/05/30(火) 08:16:31ID:???
ローカルって何? LAN?

パーミッション分かってない香具師がサイト作ってもソースコード抜かれたりデータ抜かれたりするのがヲチ。
個人情報扱うサイトだけは作らないでくれ。利用者が大迷惑。
0580nobodyさん2006/05/30(火) 08:22:57ID:???
ローカルの「windows PC」だからパーミッションが無い、ってな事を言いたいんじゃないかねぇ。
エラーの内容がテンプレートファイルが見つからんとかいうのだったら草植える(w
0581nobodyさん2006/05/30(火) 12:18:06ID:???
おいらも一回あったんだけど、ソースには「smarty.class.php」て書いてあるとか。
(頭文字が小文字)
0582nobodyさん2006/05/31(水) 12:00:38ID:???
fat32ならcase sensitiveじゃなかったっけ?
0583nobodyさん2006/05/31(水) 21:15:45ID:???
Smarty.class.phpの1450行目はコンパイルファイルの読み込みな訳だが。
エラーの内容は省略せずにお願いします。
0584nobodyさん2006/06/02(金) 01:16:31ID:???
質問者はエスパーを求めてるんだよ。
そしてエスパーは現れずに、質問者は途方に暮れてVBを使い始める。
0585nobodyさん2006/06/03(土) 00:19:46ID:???
register_functionsしていない関数がテンプレートで使えてしまうんですが、異常ですか?
0586nobodyさん2006/06/03(土) 00:20:55ID:???
間違えた、register_modifierしていない関数が修正子で使えてしまうんですが
0587nobodyさん2006/06/03(土) 00:21:16ID:???
>>585
たとえば?
0588nobodyさん2006/06/03(土) 00:21:49ID:???
文字列処理関数はデフォルトで使えるわけですが
0589nobodyさん2006/06/03(土) 00:45:58ID:???
function hoge(){
return 'hoge';
}
function askdjaocdma(){
return 'askdjaocdma';
}
適当に関数を書いて、登録しないで{$test|hoge|askdjaocdma}と使ってみると何でも使えてしまいます。。。
関数を削除すると、無いよーとエラーにはなります。
0590nobodyさん2006/06/03(土) 00:51:26ID:???
ちなみに、$plugins_dirは弄っておらず、$smarty->plugins_dirをechoすると「plugins」だけになっていて、
「plugins」というディレクトリにはhogeと定義した関数は入れていません。
0591nobodyさん2006/06/03(土) 19:33:10ID:???
よくわからんけど、単にインクルードとかしてんじゃないの
0592nobodyさん2006/06/06(火) 00:09:12ID:???
>よくわからんけど、単にインクルードとかしてんじゃないの
インクルードするだけで使えるの?
0593nobodyさん2006/06/08(木) 00:26:47ID:???
Flexyでメソッド使うとき、引数に文字列って使えないですか?
{method('hoge')}だとエラーになってしまいます。
配列に入れたりして、{method(a[hoge])}とかするしかないでしょうか。
0594nobodyさん2006/06/08(木) 00:29:55ID:???
すみません。よーくしらべたらリテラル使えって書いてありました
ちゃんと調べずに書いてごめんなしあ><
0595nobodyさん2006/06/12(月) 01:45:30ID:???
shinoげんきか
0596nobodyさん2006/06/19(月) 11:55:23ID:???
カイハツ日記さんのhtmltemplateのページ無くなっちゃった?
単純で分かりやすくて簡単に改造も出来るし速いしで結構愛用してたんだけどな・・・
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:???
Smarty Error

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:???
599です。

すみません。勘違いしてた。
includes\の中にはSmarty.Class.phpとSmarty_Compiler.class.php
しか入れてなくて、\includes\internals\なんて何処にあんだよ!!
って一人で吠えてました。入れりゃいいのね。


あーすっきり。

>>600
ありがとう!!「以上」って言葉でやっと気づいた。


ずっとPerlしかやってこなかったのに、いきなりPHPをやれと。
でもPHPってなかなか楽しそうですね。それに開発が早そう。
0602nobodyさん2006/07/23(日) 19:29:29ID:???
テンプレートの中で直接PHPを使うにはどういう風に書けばよいですか?
{<? urlencode($str) ?>}
ではエラーがでてしまいます。
できない?
0603nobodyさん2006/07/23(日) 19:45:05ID:???
直接PHPを"使わない"ために、テンプレートエンジンを利用する。
0604nobodyさん2006/07/24(月) 09:26:29ID:???
>>602
{php}phpinfo();{/php}
とか。

http://smarty.php.net/manual/en/language.function.php.php
マニュアルくらい読め。
0605nobodyさん2006/07/24(月) 13:57:37ID:???
>>602
{$str|urlencode}
じゃあかんの?
0606nobodyさん2006/07/24(月) 21:30:20ID:???
php4じゃ使えないの?
0607nobodyさん2006/07/25(火) 00:06:49ID:???
>>603
柔軟さに欠ける言語は時として足かせにしかならない。
06086022006/07/25(火) 00:16:20ID:???
できました。ありがとう。
0609nobodyさん2006/07/25(火) 05:55:12ID:???
>>607
日本語でおk
0610nobodyさん2006/07/31(月) 09:24:15ID:???
通常、templatesフォルダ内にあるテンプレートを読み込んで表示していると思うんですが、
この場合呼び出す.phpファイルと階層が違うためCSSでデザインしにくいです。
何かいい方法ってあるんでしょうか?
0611nobodyさん2006/08/02(水) 03:03:21ID:???
hoge┬呼び出す.phpファイル
   ├cssフォルダ
   └templatesフォルダ

として、templates内にあるHTML中では、
「<LINK REL="stylesheet" TYPE="text/css" HREF="./css/〜.css">」としておけばOKじゃない?
0612nobodyさん2006/08/03(木) 12:31:03ID:???
Smartyで途中でforeachのループから抜ける場合はどうしたらいいでしょうか。
自分なりに調べてみたんですが解らなかったです。。
それとも無理なんでしょうか。
0613nobodyさん2006/08/03(木) 18:04:23ID:???
>>612
{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:???
ClearSilverに興味あるんですがここはあんまり関係ないですか?
0615nobodyさん2006/08/07(月) 21:34:55ID:muOt4GfJ
【PHP】下らねぇ質問はここに書き込みやがれ 25
http://pc8.2ch.net/test/read.cgi/php/1153652403/

こちらから誘導されてきました。

鮎川寛さんの「 PHP 開発日誌 」ってサイト
どこに行ったかご存知ないですか?
そこで配布していた『HTML テンプレート』を
使いたいのですが見当たらなくて困ってます。

どこに移ったか知っている方、
もしくはPHP5 版『HTML テンプレート』を
再配布しているところを知っている方
教えてください。
0616nobodyさん2006/08/08(火) 02:11:40ID:???
>>615

http://sourceforge.net/projects/htmltemplate/
06176152006/08/08(火) 20:55:09ID:+NeExxFV
>>616

ありがとうございます!

これって 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
{$objs[2]->get_hoge()}
コレだと動きますね(汗

他オブジェクトメソッドの返り血を指定するとエラーになるようです↓うむむ・・
{$objA[$objB->get_hoge()]->get_hoge()}
0621nobodyさん2006/08/09(水) 14:08:49ID:???
>>620
そんなのはヘルパーメソッドを作成して、対応するしかないと思う
06226182006/08/09(水) 16:52:33ID:???
>>621サン
レスありがとうございます。その方向で進めてみます。
0623nobodyさん2006/08/09(水) 20:18:02ID:???
しょーもない質問です。
PHP勉強しはじめたばかりの初心者なのですが、
皆さんのお勧めとかお気に入りのテンプレートエンジンって
ありますでしょうか?
例えば、>>616のhtmltemplateとか、Smartyとか。
0624nobodyさん2006/08/09(水) 22:55:58ID:???
一通り片っ端から使ってみてレポート希望。
ぶっちゃけ作者が使いやすいと思って作った物に対して、どれだけ共感を感じるかじゃね?
0625nobodyさん2006/08/10(木) 09:59:00ID:???
どれも一長一短があるから、お勧めを聞いてもばらばらに
なるだけだと思う。
初心者というなら、
よほどのことがない限りは、どれを使っても大して変わらないと思うし。
0626nobodyさん2006/08/10(木) 14:31:24ID:???
>>623
最初は、機能がシンプルで、ソースコードを解析しやすい>>616のHTMLtemplate for PHPを使ってみたらいかがですか?
どんな処理をしているのか、中身を分析すると、自作のテンプレートシステムも作れるようになりますね。

<着眼点>
・それを一つの足がかり=比較基準の材料として、SmartyなりFlexyなり、すでに作られている便利なやつを見ていけばよいのではないでしょうか?
・フレームワークを使う場合は、MVCのView部分と相性の良いテンプレートシステムがあるかも。
0627nobodyさん2006/08/11(金) 01:03:06ID:???
メニュー、サブメニュー、…と(操作が)階層式になってるページを画面遷移させるにはどんな構造がやりやすいでしょうか。
メニュー側のインクルードかなと考えたのですがテンプレートに余計な文字が付くのが気になり、
今は {if $inc1}{include file="$inc1"}{/if} として、includeされたテンプレートファイルでも再帰的に同様のことをしています。
0628nobodyさん2006/08/12(土) 17:48:50ID:???
セックルと同じで最初の女って重要だけどね。
最初に仕込まれた性癖ってなかなか抜けない。
0629nobodyさん2006/08/13(日) 02:51:30ID:???
きも
0630nobodyさん2006/08/14(月) 11:17:50ID:???
>>628
動物は、最初の刷り込みで、同じ事を繰り返す面があるね。
以前のものと、新しいものの「差異」を分析&比較する能力が乏しいから?

女(人間)は、プログラミング操作では作れない。
テンプレートは、プログラミング操作で作れる。自由度高し!

比較検証によって、最初のものに固執せず、常に改善していくことができると思うよ。
・Smartyがベストとは限らない。
・PHPがベストとは限らない。

保守から革新へ
(^^)/
0631nobodyさん2006/08/15(火) 11:20:20ID:???
最初にphpオナヌーを覚えてしまうと、phpオナヌーを猿の様に繰り返しちゃうよな。
0632nobodyさん2006/08/15(火) 14:20:07ID:???
今時テンプレートエンジンとか言ってるイモはどこのどいつですか?
0633nobodyさん2006/08/15(火) 15:11:34ID:???
Smartyで、テンプレファイルに
「府、本、旬」
という字があると、そこでエラーを吐いてしまうのですが、
似たような現象になった方はいらっしゃいますか?

その文字があるところでこんなんがでちゃう。
Fatal error: Smarty error: [in index.tpl line 14]: syntax error: unrecognized tag:
0634nobodyさん2006/08/15(火) 15:33:55ID:???
>>633
{literal}府、本、旬{/literal}
06356332006/08/15(火) 15:40:21ID:???
> 634
ありがとうございます!
本とかは文字コードに中カッコが含まれてるということなんですね?

家まで行って感謝の意を伝えたいくらいです。
0636nobodyさん2006/08/15(火) 15:43:21ID:???
よこやりですが・・・
そういう文字って他に何があるんでしょう?
SJISの「表」とかとは少し違いますよね?
0637nobodyさん2006/08/15(火) 15:51:07ID:???
日本人なら $left_delimiter $right_delimiter を変更するのは基本だ
Shift_JISとかぶる
まぁ、テンプレートを Shift_JIS で書くとかしなければ良いのだけど
たまーにめんどくさいんだよね

自家製クラス作るのお勧め
0638nobodyさん2006/08/15(火) 16:26:03ID:???
>>637
携帯の絵文字を直接扱いたいとか言う状況でなければ、
Shift_JISを使わないようにするのがベスト。

もしくはinput_filterで内部エンコーディングにconvert_encoding。
Shift_JISである必要があるなら出力時に変換。
06396332006/08/15(火) 16:54:32ID:???
なるほど〜
delimiterを {{ , }} にするようにしてみました。
0640nobodyさん2006/08/15(火) 19:46:36ID:???
携帯用とかShift_JISで出力しなきゃならない
んで、自分でテンプレート作る時は、当然EUCで書いてフィルターだ

けど・・metaタグがShift_JISで本当はEUCとか
デザイナーに説明するのめんどくさい
0641nobodyさん2006/08/15(火) 20:17:05ID:???
>>640
prefilter
0642nobodyさん2006/08/16(水) 00:52:01ID:???
うむ
0643nobodyさん2006/08/16(水) 02:10:54ID:???
>>642
出産?
0644nobodyさん2006/08/16(水) 11:29:47ID:???
prefilter と outputfilter を使っているな
おそらく、結構重たい処理になっているだろうけど楽だし
そこまで、チューニングが必要なページあまりないしな
0645nobodyさん2006/08/16(水) 11:51:20ID:???
Smartyならprefilterは安定時には働かないからな。
0646nobodyさん2006/08/17(木) 00:51:44ID:???
sjisなんて使わなきゃいいのに。
8ビット時代の苦肉の策ですよ。
0647nobodyさん2006/08/17(木) 12:14:02ID:kr+Lut29
隠されたセクションを読む方法を教えてください。
common.confに
[.Database]
host=my.domain.com
と書いて、
PHPの中で
$smarty->config_load('common.conf', 'Database');
として読み込もうとしているのですが、どうも読み込んでくれません。
隠蔽セクション以外なら、読み込めるのですが・・・。
0648nobodyさん2006/08/19(土) 10:14:33ID:???
>>646
ヒント:携帯用コンテンツ
0649nobodyさん2006/08/21(月) 14:55:34ID:EaU1LrCO
携帯用コンテンツならUTF-8でいけね?
■ このスレッドは過去ログ倉庫に格納されています