【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/
0702nobodyさん
2006/10/12(木) 07:19:44ID:???mtuの設定が間違ってる。1430ぐらいなのに1500で設定してるだろ?
0703nobodyさん
2006/11/03(金) 23:22:04ID:N9Ney0mMPHPで言うところの、array_searchみたいなやつ。
何か方法ないかな? ボスケテ;;
0705nobodyさん
2006/11/04(土) 21:15:17ID:+XTG9Sit<table>
{foreach from=$list2 key=id item=item}
<tr>
<td>{$item.name}</td>
<td>{$value.keyname[$id]}</td> ← ここ
</tr>
({/foreach})
</table>
({/foreach})
のように、本来ならkeyname.id1 keyname.id2 keyname.id3というところを
内部のforeachのインデクサを配列の添字として使用したい。
何かいい方法ないものかなぁ?
0706nobodyさん
2006/11/04(土) 22:47:30ID:???てか多次元配列じゃなくね?
0707nobodyさん
2006/11/09(木) 04:09:53ID:???ロジック側でなんとかしる
0708nobodyさん
2006/11/10(金) 00:21:40ID:???veax.NET::役に立たないPHP拡張モジュール製作所
http://blog.veax.net/
面白そうなの見つけて注目中
0710nobodyさん
2006/12/02(土) 18:09:36ID:???{/section}
上記のような場合に
{section}間でcntに1加えた数字を使いたいと考えています。
どのようにすればいいでしょうか。
0711nobodyさん
2006/12/06(水) 13:53:37ID:???0713nobodyさん
2006/12/24(日) 18:38:33ID:???0714nobodyさん
2006/12/27(水) 17:09:35ID:???if ($hoge){}
と書いてたように
{if $hoge}{/if}
って言う使い方は出来ないんですよね?
(やってみたらうまく動きませんでした)
わざわざ別の変数を用意して
{if $check_hoge == 1}{/if}
みたいにしないといけないんでしょうか??
0715nobodyさん
2006/12/27(水) 19:30:22ID:???0718nobodyさん
2006/12/29(金) 17:59:05ID:Oa9zj9TG0719nobodyさん
2007/01/07(日) 17:56:17ID:lgQgqthI0720エスパー伊東
2007/01/07(日) 18:03:01ID:???0721nobodyさん
2007/01/08(月) 17:02:30ID:???html_tableとhtml_checkboxesを組み合わせて使うようなことはできますか?
0723nobodyさん
2007/01/08(月) 20:58:19ID:???スクリプトと同じ場所にコピーすれば実行できたんですが
この関数の名前のファイルを作ってpluginsフォルダに置いておけば
自動的に読み込んでくれたりできないんでしょうか?
今は置いたとしても
syntax error: block function 'html_table_block' is not implemented
とエラーが出てしまいます..
0724133
2007/01/12(金) 17:51:59ID:???Smarty error: [in hoge.html line 19]: syntax error: unrecognized tag: 投票
この場合、「投票」という文字を消すと動作します
0725nobodyさん
2007/01/12(金) 20:24:35ID:???取り合えず{literal}{/literal}で囲めば逃げられると思う
0726nobodyさん
2007/01/12(金) 22:28:58ID:3JXbZGmD俺はこれで解決したんだがどうよ
0727nobodyさん
2007/01/12(金) 22:39:25ID:???開始タグを<!--{ 終了タグを }--> にするとか。
0728nobodyさん
2007/01/16(火) 11:38:11ID:JtgOvcxU俺もなんかあったら面倒なのでそうしてる
ところで Smartyで改行(nl)を無効にする命令ってないのかな?
ヘッダーのキーワードをページごとに変更できるように 変数を入れてSmartyの
Sectionで挿入しようとしたんだけど ソースが改行されて汚い
tplファイルを改行ナシにしたらいけるんだろうけど それだとファイル変更時
にわかりにくくなるしなぁ
0730728
2007/01/16(火) 15:27:15ID:???str_replaceをはじめて知ったド素人にレス感謝です
調べたところstr_replaceって置換ですよね? 置換じゃ無理っぽい 多分
説明が悪かったかもしれないのでもう一度
Smartyのテンプレートファイルにおいて
<head>
<meta name="Keywords" content="…,…,…,…,
{if isset($keyword)}
{section name=keyword_no loop=$keyword}
{$keyword[keyword_no]},
{/section}
{/if}
…,…" />
</head>
0731728
2007/01/16(火) 15:27:49ID:???<meta name="Keywords" content="…,…,…,…,
キーワード1
キーワード2
…
…,…" />
と改行されてしまうのが嫌だなと言うことです
テンプレートファイル中で改行してることから それが原因だろうとは思う
のですが 改行ナシにするとテンプレートファイルを見ると汚くなるので
それは避けたいです
(今後他人に仕事を振る可能性もあるし)
で テンプレートファイル中の改行を 出力するHTML上では無効にすることが
出来る命令があればなぁと思ったのです
textformatで出来るかな? と思ったけど無理っぽいし…orz
0732nobodyさん
2007/01/16(火) 16:35:49ID:???0734nobodyさん
2007/01/17(水) 17:22:58ID:???0735nobodyさん
2007/01/17(水) 17:47:35ID:???0736nobodyさん
2007/01/17(水) 17:57:56ID:???こっち貼ってやった方がいいんじゃね?
つーか少しは自分で調べよう
0737nobodyさん
2007/01/17(水) 20:51:11ID:???WindowsXP+IIS5.1+PHP5.2+Smarty2.1.16 を使用すると、
以下のようなエラーが画面に表示されてしまいます。
URL:http://localhost/dash/test.php
Warning: Smarty::include(templates_c\%%D9^D9B^D9B21B55%%test.html.php)
[function.Smarty-include]: failed to open stream:
No such file or directory in C:\Inetpub\wwwroot\dash\libs\Smarty.class.php on line 1258
Warning: Smarty::include() [function.include]:
Failed opening 'templates_c\%%D9^D9B^D9B21B55%%test.html.php' for inclusion
(include_path='.;c:\php\includes;c:\php\PEAR;c:\php\smarty')
in C:\Inetpub\wwwroot\dash\libs\Smarty.class.php on line 1258
C:\Inetpub\wwwroot\dash\templates_c フォルダに
コンパイルされたphpファイルができません。
コンパイルができないみたいです。
WebサーバをApacheにするとうまくいくのですが…
Smartyを使用する場合、IISの設定で変更しなければいけない箇所があるのでしょうか?
0739nobodyさん
2007/01/18(木) 10:28:23ID:???0740nobodyさん
2007/01/18(木) 10:46:18ID:???特に設定する必要はないと思うけど
Smarty.class.php の _compile_resource メソッドがどんな動きをしているか
見たほうがいいかも
0741nobodyさん
2007/01/18(木) 14:39:41ID:???section内で$hoge[$foo]みたいなことしたいのですが、どのようにやれば出来ますでしょうか?
{section name="val" loop=$data}
{$hoge.$foo[val].name}
{/section}
でできませんでした…
0742nobodyさん
2007/01/18(木) 16:32:29ID:???キャッシのexpiresんとこのタイムスタンプ書き換えれば延ばせる
なぜそんなことがしたいのか分からないけど
0743nobodyさん
2007/01/18(木) 17:06:50ID:???{hoge}
と書いたら、php側のhoge変数の中が展開されると思いますが、
これを、
{hoge}そのものを出力したい場合、テンプレートにどう書けばよいでしょうか?
\{hoge\}
とか
{{hoge}}
とか試してみたんですが、無理でした…。
0744nobodyさん
2007/01/18(木) 17:26:18ID:???とか
0745nobodyさん
2007/01/18(木) 17:28:28ID:????は&ね
0746nobodyさん
2007/01/18(木) 17:32:04ID:???0747nobodyさん
2007/01/18(木) 17:48:50ID:???{hoge}
と出すのは無理すかね?
なぜかというと、これをファイルに出力して、またFlexyのテンプレートとして食わせたいのです。
>>746
{hoge}
を、通常通り置換したい場合もあるので、デリミタそのものを変えるのではまずいのです。
お二人ともレスありがとう。
説明不足ごめんなさい。
0748nobodyさん
2007/01/18(木) 18:26:03ID:u6x8DYYxオブジェクトの生成をし、
Smartyのassign関数にアクセスするメソッドを利用しようとすると、
Fatal error: Call to a member function assign() on a non-object
in C:\Program Files\Apache Group\Apache2\htdocs\test\index.php on line 7
と返されてしまいます。
ならべく、テンプレート内にPHPを書きたいのですが、
(本来のSmartyの利用意図に背くのは重々承知です。)どうすればよいでしょう。
--index.php
<?php
require_once('Smarty/libs/Smarty.class.php');
class Headline{
public $oSmarty;
public function __construct($oSmarty){$this->oSmarty=$oSmarty;}
public function get_data(){$this->oSmarty->assign("test","テスト");}
}
$oSmarty=new Smarty();
$oSmarty->template_dir='./templates/';
$oSmarty->compile_dir='./templates_c/';
$oSmarty->display('test.tpl');
?>
--test.tpl
test
{php}$oHeadline=new Headline($oSmarty);$oHeadline->get_data();{/php}
{$test}
0750nobodyさん
2007/01/18(木) 19:06:24ID:???> {php}$oHeadline=new Headline($oSmarty);$oHeadline->get_data();{/php}
new Headline($GLOBALS['oSmaert']);
ってするとどうだろう。
0755743
2007/01/18(木) 20:33:24ID:???でも、まぁ意味はそういうことです。
Smartyでいうところのそれに当たるものが、HTML_Template_Flexyでありませんか?
ってのが聞きたかったんです。
なんか無さそうな雰囲気ですね…。
0756nobodyさん
2007/01/18(木) 20:59:51ID:oKlCOyd1<?xml version="1.0" encoding="EUC-JP"?>
このように、XML宣言の前に関数を使うと、XML宣言の前に
空行が出力されてしまいます。これはXHTMLにおいて致命的な文法エラーになってしまいます。
smarty_header関数は header() でHTTPヘッダを出力するだけだし、
プラグインファイルは終了タグの '?>' を省略しているので文字列は出力していないはずです。
コンパイルされたファイルを見てみたら以下のようになっていました。
<?php echo smarty_function_smarty_header(array('http_equiv' => "Content-Type",'content' => "text/html"), $this);?>
<?php echo '<?xml'; ?>
version="1.0" encoding="EUC-JP"<?php echo '?>'; ?>
0757741
2007/01/18(木) 21:21:15ID:???お願いいたします
0758nobodyさん
2007/01/18(木) 21:57:19ID:???> {section name="val" loop=$data}
> {$hoge.$foo[val].name}
> {/section}
{$hoge[$foo[$val]].name}
でどぉだ。
>>749では完全に寝惚けてて、>>750でもtypoしているグダグダな状態なんで
イマイチ思いだせんのだが、これでダメならバッククォートを使ったりかどうかで
出来たはず。
0759nobodyさん
2007/01/19(金) 00:36:20ID:???多分無理だと思う。メソッドを介した方が早いんじゃない?
function p($flexyVar) { return "{". $flexyVar ."}"; }
{p(#hoge#)}
{p(#hoge.bar:h#)}
##の中に#だけはどうやっても書けないから、
メソッド呼び出しを書きたいならもう少し工夫が要るけどね。
0760nobodyさん
2007/01/19(金) 02:12:14ID:???header();ってどこに書いてもよかったような気がするんだけど
1行目と2行目を入れ替えるのはだめ?
だめなら改行せずにxml宣言も1行目に書くか{strip}{/strip}
stripが誤作動するならliteralで
0762nobodyさん
2007/01/21(日) 17:04:32ID:???0763nobodyさん
2007/01/21(日) 18:54:55ID:???この辺かな?
テンプレートそのものをサニタイズしたいのならちょっと仕掛けが必要かも
0764nobodyさん
2007/01/21(日) 18:58:33ID:???0765nobodyさん
2007/01/21(日) 19:04:19ID:???再度で申し訳ありませんが、foreachを使っているせいか
Warning: htmlentities() expects parameter 1 to be string, array given
となって表示されませんでした・・・。
{$hoge}と出しているところだけエスケープしたいのですが、そういう方法はあるんでしょうか?
0766nobodyさん
2007/01/22(月) 01:04:33ID:???Smartyにサニタイズさせたいのなら普通に修正子を指定するか、nodefaultsを使うか
ソースいじってdefault_modifiersの挙動を変えるかしかないと思う
0768nobodyさん
2007/01/22(月) 09:02:22ID:???自動でHTMLエスケープするってのは良くないような
必要ないもんにまでかけちゃうし無駄なオーバーへッドにもなるし
0769nobodyさん
2007/01/22(月) 13:06:55ID:???皆さんありがとうございます。
とりあえず自分で修正子作ってやってみます。
ちなみにこういった方法は一般的ではないんでしょうか?
0770nobodyさん
2007/01/22(月) 16:09:32ID:???凄く単純な事ですが、いろいろ調べたのですが、どうしても実現できなくて質問させていただきます。
テンプレートから外部テンプレートを組み込む時に、
{include file="/root/dir/html/templates/XXXX.tpl"}
といった感じに記述しますが、この中で、変数を使いたいのです。
"/root/dir/html/templates/"の部分を変数に変えて、ディレクトリ構造を一元化して管理したいのです。
PHPの構造でいうと、"{$base_dir}/XXXX.tpl"と言った感じで、
ディレクトリ構造が変わっても、ファイルを直接弄ることなく、変更できるようにしたいのですが、やり方がわかりません。
つまり、呼び出し元のPHPプログラムで設定ファイルを読み込み、テンプレートの保存されているディレクトリ構造を読み取り、
それをテンプレートファイルに渡して、その渡した値を元に外部テンプレートを呼び出すようにしたいのです。
これを実現するには、どのように記述したらよろしいのでしょうか?
0771nobodyさん
2007/01/22(月) 16:18:33ID:???ディレクトリ構造の値は配列で渡したいのです。
$dir['base']="/root/dir/html/templates";
$smarty->assign("dir",$dir);
と言った感じでわたして、テンプレートの中で
{include file="$dir['base']/XXXX.tpl"}
と言った感じで仕様したいのですが、上記のコードを書くと以下のエラーが出て使えませんでした。
Warning: Smarty error: unable to read resource: "Array['base']/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095
根本的な記述方法の間違いかもしれませんが、宜しくお願いいたします。
Apache2
PHP5
Smarty2.6.16
の環境で勉強しております。
0772nobodyさん
2007/01/22(月) 17:04:54ID:???0773nobodyさん
2007/01/22(月) 17:41:46ID:???すみません。それでも同じエラーが出てしまいます。
dir.base
Warning: Smarty error: unable to read resource: "setting.base/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095
$dir.base
Warning: Smarty error: unable to read resource: "Array.base/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095
0774nobodyさん
2007/01/22(月) 18:16:45ID:Eh2tk1di{include file="`$dir.base'/xxxxx.tpl"}
`(バッククォート)で $dir.base をくくらないと、どこまでが変数か
Smarty が解釈できなくなっている
0775nobodyさん
2007/01/22(月) 18:17:38ID:???0777nobodyさん
2007/01/22(月) 18:19:08ID:???ありがとうございます。
無事、実行できました。
いろんなサイトを見て回ったのですが、バッククォートのことは初めて知りました。
本当に勉強になりました。ありがとうございました。
0779nobodyさん
2007/01/22(月) 18:21:56ID:???http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/language.syntax.quotes.html
0780nobodyさん
2007/01/22(月) 18:26:12ID:???すみません。。。お返しする言葉もございません。
そのマニュアルも一応目を通したつもりでいたんですが、、、
日々精進していきます。
0781nobodyさん
2007/01/23(火) 13:44:19ID:???このスレにPHPのイロハも知らないバカが押し寄せてくる悪寒が…
0782nobodyさん
2007/01/23(火) 21:29:12ID:???0783nobodyさん
2007/01/25(木) 04:27:39ID:???こういう場合でフォーム系のタグに変数埋める作業でもやはりシコシコと手作業するしかないんでしょうか。
宜しくお願い致します。
0786nobodyさん
2007/01/26(金) 20:07:41ID:???{$hoge[$foo->getId()]}
とやると
syntax error: unrecognized tag:
が出るのですが,このようにやりたい場合はどうすればいいでしょうか?
0787nobodyさん
2007/01/26(金) 20:10:51ID:iZlZkVla0788nobodyさん
2007/01/27(土) 10:35:51ID:e0oRsoDRまんどくせえけど
0789nobodyさん
2007/02/02(金) 12:06:02ID:???バックスラッシュは試したんだけど $`hogehoge`と囲ってたのでエラーでした
まさか`$hogehoge`とするとは… PHPでは${hogehoge}なのに…
>>770とそれに回答していただいた皆さんに感謝です
0790789
2007/02/02(金) 12:16:25ID:???○バッククォート
…なんて勘違いを…アホですいません
0791nobodyさん
2007/02/02(金) 15:29:41ID:???0792nobodyさん
2007/02/02(金) 22:13:51ID:???0793nobodyさん
2007/02/02(金) 22:30:25ID:???PHPのコードをベタ書きすれば使える
なるべくロジックをテンプレートに入れないように
処理を変える方がいいと思うけどな
0794nobodyさん
2007/02/02(金) 22:38:39ID:???それはロジック側や構成を見直した方が良いっていう警告
0795nobodyさん
2007/02/02(金) 22:42:07ID:???0796nobodyさん
2007/02/02(金) 23:07:42ID:???テンプレートパーツ名を決めて、メインのレイアウトテンプレートから
includeするファイルを変えるとか色々方法あるんじゃない?
0797nobodyさん
2007/02/03(土) 01:08:18ID:???モデルから引っ張ってくるかのどちらかじゃね。
ビューで切り替えるもんじゃないような気がするが。
0798nobodyさん
2007/02/06(火) 20:28:11ID:adz0uOuqいま、phpBBのソースコードを解読・勉強していて疑問になりました。
0800nobodyさん
2007/02/15(木) 19:29:02ID:t/XW6gI0(3 + 2) * 5
みたいな感じなんだけど。
0801nobodyさん
2007/02/15(木) 20:54:32ID:???0802nobodyさん
2007/02/16(金) 10:58:20ID:qBGQeHi7それがうまくいかないんですよね。
{if '($smarty.foreach.loopname.iteration-9)%3'==0}
こんな感じで処理を行いたいんのですが。
■ このスレッドは過去ログ倉庫に格納されています