【Smarty】PHPのテンプレートエンジン【Flexy】
レス数が950を超えています。1000を超えると書き込みができなくなります。
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/
0852nobodyさん
2007/03/10(土) 10:44:25ID:GgSEfqVF{${$loop[loop].name}}
{$$loop[loop].name}
という2つはエラーになりました。
0853nobodyさん
2007/03/10(土) 11:30:55ID:???最近Smarty使ってねえから間違ってたらすまんな
0854852
2007/03/10(土) 11:44:36ID:GgSEfqVFありがとうございます。
しかしちょっとそのやり方がわからないです。
具体的には
$loop[0]['name'] = "a40";
$loop[1]['name'] = "a43";
$loop[2]['name'] = "a58";
のように数字が続いています。
で、sectionの中で
{$a43}や{$a58}などの変数を呼び出したいのですが、どうもうまくいきません。
section が複雑にネストしてるので配列で渡すのはちょっと無理っぽいので、可変変数でなんとかしようと思った次第です。
0855nobodyさん
2007/03/10(土) 11:48:12ID:???{$var}.cde
という文字列を使いたいのですが、どのように記述すればいいでしょうか?
{if $var.cde == .....
では$varの配列とみなされてしまうようです。
0856855
2007/03/10(土) 11:49:03ID:???smartyです。
0857nobodyさん
2007/03/11(日) 14:03:45ID:???そういうことか。無理なんじゃないかな。
定数値であれば、$smarty.const.$hoge で取れるんだが、
そんな方法で変数参照出来たら、逆に危なくて仕方ないしな。
設計から見直したまえ。
0858nobodyさん
2007/03/11(日) 14:08:45ID:???// $smarty->assign('var', 'ab');
{assign var="str" value=$var|cat:"cde"}
{if $str == "abcde"}ok{/if}
0859nobodyさん
2007/03/13(火) 22:56:37ID:QJkFtOhTなんで、俺だけ出ないのか教えてくれ。
0860nobodyさん
2007/03/13(火) 23:31:57ID:???0861nobodyさん
2007/03/16(金) 21:09:00ID:???0862nobodyさん
2007/03/18(日) 02:13:43ID:???smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
smartyのautoload_filtersで、sjisテンプレをコンパイル時にutf8変換してます。
php(utf8) ← DB(utf8)
↓
smartyテンプレ(sjis) → smartyコンパイル(utf8) → 画面出力(sjis)
このように、すごーく無駄な文字コード変換が2回も入ってしまいます。
なんか他にいい方法ないでしょうか?
0863nobodyさん
2007/03/18(日) 02:43:21ID:CdbythRUassign時にShift_JISに変換すればいいと思う。
php(utf8) ← DB(utf8)
↓
assign
↓to sjis
smartyテンプレ(sjis) → smartyコンパイル(sjis) → 画面出力(sjis)
Smartyの仕組みは知らないけど、assign時にコールバック処理を入れられるな
らそれを使えばいいし、無ければSmartyのラッパークラスを用意すればいい。
0865nobodyさん
2007/03/18(日) 08:53:47ID:???頻繁に更新するものじゃなかったら、>>862さんがutf8にコンバートするとか。
0866nobodyさん
2007/03/18(日) 09:12:45ID:???往復ビンタしてから
男から殴れ女なら犯せ
0867nobodyさん
2007/03/18(日) 16:01:57ID:???>>864の通りデザイナにUTF8で書いてもらうのが一番良い。
デザイナがだめならクライアントかディレクターあたりに「余計なコストがかかる事になりますが…」
とか言ってデザイナがUTF8で書かざる終えないようにがんばれ。
0868nobodyさん
2007/03/18(日) 16:02:47ID:???0869nobodyさん
2007/03/18(日) 18:11:10ID:???0870nobodyさん
2007/03/18(日) 18:17:59ID:???これがある日本はハンデやで。
0871nobodyさん
2007/03/18(日) 20:08:33ID:???smartyテンプレ(sjis) → smartyコンパイル(utf8)
はテンプレートが更新された後の初回アクセスだけですむから大した負荷にはならないだろ。
0873nobodyさん
2007/03/19(月) 11:20:58ID:???ただ、文字コード変換するくらいでぐだぐだ言うようなデザイナは、勉強不足だと思う。
一息に切れ
0874nobodyさん
2007/03/20(火) 09:13:18ID:???0875nobodyさん
2007/03/20(火) 13:33:39ID:???>smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
>「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
ええーっ
とりあえずおまいさんが『Dreamweaver 文字コード』でぐぐって、DWの設定を教えてあげればいいじゃない。
つかその程度のこともできないデザイナなんか切れ。
0876nobodyさん
2007/03/20(火) 23:01:26ID:???0879nobodyさん
2007/03/21(水) 18:15:49ID:???自在にSmartyを使えるようになる頃には、自分で template 作れるようになる。
で、その頃になると、Smartyに粗が見え出すんだ。
まぁ、という訳で自作テンプレート使ってる。
0880nobodyさん
2007/03/21(水) 20:52:08ID:NvhysGYmどう考えても、Smartyの方が優れてそうだけどなw
0881nobodyさん
2007/03/22(木) 12:42:30ID:???まぁ、その通りだ。
だが、smartyはでかいし機能がありすぎる問題がある。
下手に機能があると、テンプレートに頼りすぎて、どこまでがviewか?とかが崩れるんだ。
シンプルな方が楽だし早いんだよ。
0882nobodyさん
2007/03/22(木) 13:21:33ID:???PHPでやったほうがわかりやすい。
0883nobodyさん
2007/03/22(木) 14:34:43ID:jPF/zj000884nobodyさん
2007/03/22(木) 15:12:30ID:???0886nobodyさん
2007/03/22(木) 17:40:02ID:9EeeeROG0887nobodyさん
2007/03/22(木) 18:13:08ID:???0889nobodyさん
2007/03/22(木) 23:53:41ID:???DBに接続してデータとって来るような場合
キャッシュがあればDBいかないで表示したり。
テンプレート内のカウンタとか一部のプラグイン部分だけはキャッシュじゃなくて動的にしたい
とかも出来るから結構便利よ。
0890nobodyさん
2007/03/23(金) 01:25:37ID:wrH2dhw40893nobodyさん
2007/03/23(金) 14:57:53ID:wrH2dhw40894nobodyさん
2007/03/23(金) 16:54:26ID:???簡単に言うと、ある一定時間内ならキャッシュを出力してDBアクセスを抑制できる仕組み。
http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/caching.html
例を挙げれば
・10分ごとに最新情報がでればいい
・100view/分
・クエリ発行数 7/view
というコンテンツがあった場合
キャッシュなし→700query/分
キャッシュあり→0.7query/分
となりDB負荷が大幅に下がる。
0895nobodyさん
2007/03/24(土) 21:37:49ID:???もしそうなら、ページ全体のキャッシュはできても部分キャッシュはできないということ?
0896nobodyさん
2007/03/24(土) 22:03:13ID:???キャッシュのキーはテンプレートのパスとdisplay関数やfetch関数の第2引数として指定できるキャッシュID
マニュアル嫁と。
0897nobodyさん
2007/03/25(日) 01:25:25ID:???0898nobodyさん
2007/03/25(日) 04:42:25ID:UfKh4Z0S細胞図
0899nobodyさん
2007/03/25(日) 13:19:14ID:???新規で受注したPHP案件は無理やりでも導入してるぜ
改造案件で昔の担当したアホがスパゲティってるときだけ使わん。
0900nobodyさん
2007/04/03(火) 12:34:20ID:???{foreach from=$arr item=item key=key}
{$item.hoge|@count}
{/foreach}
連想配列の要素数は上記で取得出来るのですが、要素数を交えた演算が出来ずに困ってます・・・
感覚的に
{$item.hoge|@count * 4 + 1}
というような書き方をしたいのですが・・・どうかお助けください
0901nobodyさん
2007/04/03(火) 12:36:53ID:???0903nobodyさん
2007/04/03(火) 13:46:55ID:???0904nobodyさん
2007/04/03(火) 13:49:53ID:???0905nobodyさん
2007/04/03(火) 14:14:52ID:???$arr = array("hoge"=>array(0,1,2,3));
{foreach from=$arr item=item key=key}
{math equation="n*4+1" assign="mResult" n=$item.hoge|@count}
{$mResult}
{/foreach}
0906nobodyさん
2007/04/03(火) 21:35:12ID:???繋がる?
0907nobodyさん
2007/04/04(水) 10:05:10ID:???0908nobodyさん
2007/04/05(木) 22:15:57ID:Wh1vrSjM同じ様な事を経験した方っていますかね?
コンパイル済みのファイルの時点でなくなってる感じです。
ちなみにSmartyのバージョンは2.6.6です。
0909nobodyさん
2007/04/05(木) 22:20:02ID:???0910nobodyさん
2007/04/06(金) 09:59:56ID:???0911908
2007/04/06(金) 18:35:57ID:???>>910
そうですかぁ・・・。
ちなみに他のサーバーで実行すると{literal}〜{/literal}の中身は表示されます。
php.iniとか環境の違いでsmartyの挙動って変わるんですかね?
0912nobodyさん
2007/04/06(金) 18:36:45ID:???0913nobodyさん
2007/04/07(土) 16:48:58ID:mKHEPGiv結構メンドクサイねw
バシバシ実用してる人、みんなはそのメンドクサさを乗り越えた甲斐があった?
圧倒的に効率的?
0914nobodyさん
2007/04/07(土) 16:53:13ID:???0915nobodyさん
2007/04/07(土) 17:50:05ID:???使いたいSmarty変数は
assign display include sectionです。
0916nobodyさん
2007/04/07(土) 18:48:36ID:???デザイナが構文覚えるのは多少苦労すると思うけど
殆ど一般的な式だから、プログラミングやった事があるならすぐに飲み込めると思うが。
むしろ、Switchつかいてぇ・・ぐらい思うんじゃねw
0919nobodyさん
2007/04/07(土) 19:00:45ID:1Ng7rNgy$params['e-mail']
だったとき、どのようにすれば表示できるのでしょうか?
{$params.e-mail}
だと、$params.eマイナスmailと解釈されるのか解りませんが、’0’になります。
0920915
2007/04/07(土) 19:03:49ID:???Smarty_Compiler.class.php
internals/core.create_dir_structure.php
internals/core.get_include_path.php
internals/core.write_compiled_resource.php
internals/core.write_file.php
が最小でした。
Smarty.class.phpやSmarty.compiler.class.php内の関数を削除できればもっと省けそうだけど、めんどいですね。
0922nobodyさん
2007/04/07(土) 19:20:46ID:1Ng7rNgyPHPはよく知っていて、わざわざまたSmarty使うのにまた、新しい文法覚えるのってどうなのよ、って感じはするよね。
例えばforeachなんてPHPのはマニュアル見なくてもスラスラかけるけど、
つい最近まで、あれ?item=だっけ?form=だっけ?as?みたいに、良くわからなくなって
マニュアル(というか、他で使ってるところ)みて、コピペしてた。
まあ、でも、>>916さんのいうように、PHP(なり、何か他のスクリプト)解ってるなら特に難しいことないけど、面倒なのは面倒だね。
全部自分一人でするなら、必要ないかも。
Viewの部分の分離なら、PHPだけでも出来るし。
でも、スクリプト知らないデザイナさんなどに覚えてもらうのに楽なのかな?
とはいえデザイナもSmarty覚えるよりPHP覚えた方が、後々役に立ちそうだから微妙だよね。
俺がsmarty使う理由は、デリミタが簡潔でHTMLが綺麗に見えるから。
dreamwearverのデザイナビューでも、わりとエラーにならずにレンダリングされるし。
if文の使い勝手が微妙だけど、プラグイン自分で書くって言う手もあるし。
0923nobodyさん
2007/04/07(土) 19:24:40ID:1Ng7rNgyおれもそんなわけないと思ったけどなるんだよね
0に
Smarty-2.6.18なんだけど・・・
バグかな?
0926nobodyさん
2007/04/07(土) 20:16:16ID:???同じname使うだけでパースエラーとかありえない。
将来的にformのnameかIDでグループ分けしてパース出来るようになるのだろうか。
0927nobodyさん
2007/04/08(日) 02:44:07ID:???0928923
2007/04/09(月) 08:46:20ID:45uRynI3わざわざテストありがと
>>927
ですね。
もういっっこおかしなところ発見したんですけど、暇な人いたらテストしてもらえませんでしょうか?
/////////////PHP//////////
<?php
require('libs/Smarty.class.php');
$errors['user_name'][]="必須です。";
$errors['user_name'][]="必須です。";
$errors['user_pass'][]="必須です。";
$errors['user_pass'][]="必須です。";
print_r($errors);
$smarty=new Smarty;
$smarty->compile_dir="templates_c";
$smarty->template_dir="";
$smarty->assign('errors',$errors);
$smarty->display('smarty.html');
?>
0929923
2007/04/09(月) 08:47:41ID:45uRynI3/////テンプレート///////////
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
{foreach from=$errors.user_name item=errors}
{$errors}<br>
{/foreach}
<br><br>
{foreach from=$errors.user_pass item=errors}
{$errors}<br>
{/foreach}
</body>
</html>
これをUTF-8で保存して表示すると2度目のループが文字化けしません?
うちの環境の問題ですか?
0930923
2007/04/09(月) 08:49:17ID:45uRynI3変数名(添字)のuser_nameやuser_passをfoo、barでやると文字化けしませんOTZ
0931nobodyさん
2007/04/09(月) 10:26:24ID:???むしろPHPで-がエラーにならないことに驚いた
マニュアルではだめってなってるし
さらに-を使うことにも驚いたけど
0933nobodyさん
2007/04/09(月) 23:39:29ID:45uRynI3ありがとうございます。
そうですね
おっしゃるとおり
さっき実験してて気づきました。
なぜか変数のスコープを勘違いしてました。
すんません。はずかしいです。
0934nobodyさん
2007/04/13(金) 11:37:03ID:W3WC3UzW<script>
array[1] = {$infotype2[1]};
</script>
こんな感じにjavascriptのコード内でsmartyから受け取った値を代入したい場合はどうすればいいんでしょうか。
よろしくお願いいたします。
0936nobodyさん
2007/04/13(金) 11:59:56ID:W3WC3UzWなるほど。勉強になります。
ありがとうございました。
0937nobodyさん
2007/04/13(金) 12:05:45ID:???0938nobodyさん
2007/04/14(土) 00:52:03ID:???サーバサイドスクリプトとクライアントサイドスクリプトの間には何があるのか考えればおのずと答えが出るだろ。
もしかして{がデリミタだから引っかかってるとかじゃないよな?
0939nobodyさん
2007/04/17(火) 19:07:41ID:???$tmpArray = array();
foreach ($list as $row) {
$tmpCheckBox =& $form->createElement('checkbox');
$tmpCheckBox->setName($i);
$tmpCheckBox->setText($row['name']);
$tmpCheckBox->updateAttributes(array(
'value' => $row['id'],
'id' => 'check_'.$i
));
$tmpArray[] = $tmpCheckBox;
$i++;
}
$form->addGroup($tmpArray, 'ques_01', '', '');
こんな感じで checkbox の value の値は変えられるようになったのですが
freeze() すると値が1に戻ってしまいます。
何とか freeze() を経由しても、継承する方法はないのでしょうか?
0940nobodyさん
2007/04/17(火) 22:45:42ID:???0941nobodyさん
2007/04/17(火) 23:43:20ID:???0942nobodyさん
2007/04/18(水) 00:51:02ID:???0943939
2007/04/18(水) 10:23:00ID:???レンダリングで Smarty 使ってたもんでつい…。移動します。
0944nobodyさん
2007/04/22(日) 18:56:08ID:b9VJcguVテンプレート(.tpl)中の
{foreach name=loop from=$products item=product}
〜〜
{/foreach}
としている部分がまるっきりブラウザに表示されません
なにが問題でしょうか?
ありがちなミスのパターン(解決策)を教えてください。
自分なりに確認したつもりですがわかりません
0945nobodyさん
2007/04/22(日) 19:28:50ID:???$productsをassignしてない
$productsのスペルが間違ってる
某情報機関の調査によれば上記の凡ミスが全バグ中の85%を占めるそうです。
0946nobodyさん
2007/04/24(火) 18:30:43ID:???<TBODY>
<TR><TH>AAA</TH><TH>BBB</TH><TH>CCC</TH><TH>DDD</TH><TH>EEE</TH><TH>FFF</TH></TR>
<?php
while ($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
?>
<TR><TD align="center"><?=$rs['h_AAA']?></TD>
<TD><?=$rs['h_BBB']?></TD>
<TD><?=$rs['h_CCC']?></TD>
<TD><?=$rs['h_DDD']?></TD>
<TD><?=$rs['h_EEE']?></TD>
<TD><?=$rs['h_FFF']?></TD></TR>
<?php
}
?>
</TBODY></TABLE>
<?php
}
$result->free();
$conn->disconnect();
?>
smartyの勉強しています。
上の文をphpとtplに分ける際にどう記述すればいいですか?
よろしくお願いいたします。
0947nobodyさん
2007/04/24(火) 20:11:55ID:???ん
http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/
0948nobodyさん
2007/04/25(水) 00:40:47ID:6uGbCoSGサンキュー 解決した!
0949nobodyさん
2007/04/25(水) 00:52:35ID:???つ【最新版】
http://smarty.m-takagi.org/
翻訳者のみなさんマジGJ!
0950nobodyさん
2007/04/25(水) 18:06:36ID:oViUh0CG****php******
<?php
$sql = 'SELECT * FROM table;
$smarty->assign('data', $conn->getAll($sql));
$smarty->display('file:E:/html/list.tpl');
?>
****list.tpl****
<TABLE width="100%" border="1" cellspacing="0" cellpadding="1">
<TBODY>
<TR><TH>AAA</TH><TH>BBB</TH><TH>CCC</TH><TH>DDD</TH><TH>EEE</TH><TH>FFF</TH></TR>
{section name=co loop=$data}
<tr>
<td>{$data[co].AAA}</td>
<td>{$data[co].BBB}</td>
<td>{$data[co].CCC}</td>
<td>{$data[co].DDD}</td>
<td>{$data[co].EEE}</td>
<td>{$data[co].FFF}</td>
<tr>
{sectionelse}
<tr><td colspan="5">No items found</td></tr>
{/section}
</TBODY></TABLE>
参考にして組んでみたのですが
上のソースだと、ブラウザに表示されまん。
データはとんでるぽいのですが。。。
設定まわり???
レス数が950を超えています。1000を超えると書き込みができなくなります。