トップページphp
1001コメント342KB

【PHP】 Smarty 隔離スレ 【テンプレート】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/02/02(土) 00:21:09ID:6cKcKeTp
まぬあるhttp://www.smarty.net/manual/ja/
0670nobodyさん2009/09/20(日) 19:52:57ID:???
復旧した
0671nobodyさん2009/09/24(木) 18:00:24ID:???
初心者なのであまり良く分からないのですが、テンプレートエンジンはSmarty以外に別のテンプレートも同時使用出来るのでしょうか?
JavaScriptのライブラリのように互いに干渉してしまったりするのでしょうか?

また、調べてみると、何かテンプレートを扱う為にはPHPを学んでいても1〜数週間は馴れるまでかかると書いてありました
ですのでまず最初に一つテンプレートを使用してみようと思っているのですが、やはりSmartyが一番良いのでしょうか?
0672nobodyさん2009/09/24(木) 18:07:40ID:???
まずテンプレート抜きでPHPを身に付けたほうがいいかと
0673nobodyさん2009/09/25(金) 14:31:20ID:???
SmartyってPHP習得した後にやろうとするとハッキリ言って困惑するよな
何だコレ?って感じ
今までPHP学習してきたのってあんま意味無いじゃんって思ったよ
例えばforeachとかさ
HTML?っても最初思った

0674nobodyさん2009/09/25(金) 14:34:03ID:???
PHP習得した後にやらないでいつやるんだよ
0675nobodyさん2009/09/25(金) 15:24:47ID:???
誰もが通る道さ・・・
それを不毛と感じるか、テンプレートエンジンの利点に気がつけるかでPGとしての資質がわかる。
0676nobodyさん2009/09/25(金) 15:39:52ID:???
いや普通につくればphpのforeachもsmartyのforeachも必要だろ。
0677nobodyさん2009/09/25(金) 21:46:51ID:???
そういう事言ってるんじゃないだろ。
0678nobodyさん2009/09/25(金) 21:47:21ID:???
じゃどういうことよ
0679nobodyさん2009/09/25(金) 22:57:18ID:???
同じforeachでも書き方が違って、最初戸惑うってことだろ?
0680nobodyさん2009/09/25(金) 22:59:20ID:???
えっ
0681nobodyさん2009/09/25(金) 23:47:30ID:???
ちゅう
0682nobodyさん2009/09/26(土) 02:10:40ID:???
Smarty 3 is almost here!
[24-Sep-2009] Yes, yes I know. The Smarty 3 beta is taking much longer than expected, but we wanted to be sure we had everything right.
Our preliminary performance tests are already showing us very promising speed improvements over Smarty 2 (2-5x on average), and we're not done! To recap,
Smarty 3 is a 100% rewrite from the ground up, and it is PHP 5 only. We will be getting a feature list up with the Beta, but let me give a quick summary:
0683nobodyさん2009/09/26(土) 04:04:41ID:???
早くなるのはいいな。でも、100%書き直したとなると、いろいろ仕様変わってるのかな。
0684nobodyさん2009/09/26(土) 09:50:48ID:???
100パー書き直したのと、仕様が変わるかどうかは直結しない話でしょう。
むしろ直結するのはバグ率。
0685nobodyさん2009/09/26(土) 15:22:15ID:???
3触ったけどまだ重くて使い物にならないよ。パーサがまともになったせいだろうけど、レンダリングがかなり遅い。
まだかなりバギーだし仕様も固まり切ってないみたいだし、正式リリースは来年末くらいじゃね。
0686nobodyさん2009/09/28(月) 02:57:25ID:???
>>684
直結はしないがPHP周辺ではよくある話だな。
関数を修正してみたら引数の書き方が変わったでござるの巻
0687nobodyさん2009/09/28(月) 17:38:33ID:???
Smarty以外で他にいいテンプレートって何?
0688nobodyさん2009/09/28(月) 19:12:27ID:???
>>687
ttp://www.mimoi.com/product/53
0689nobodyさん2009/09/29(火) 19:25:53ID:???
一応技術板なんだしせめてこのぐらいは・・・
http://www.j-tsugawa.com/jt-020621-EB3101-G.jpg
0690nobodyさん2009/09/29(火) 19:36:34ID:???
プラスチックが乾いてて、持ち上げようとしただけで割れてしまいそうだ・・・
0691nobodyさん2009/10/01(木) 12:03:22ID:???
流れ図記号は全部○を使っているのは俺だけだろうか。
0692nobodyさん2009/10/01(木) 18:28:48ID:KASc2bqu
//PHP側
$list[0]["text"] = '{ImageBox file="test.jpg"}';

//テンプレート側
{foreach from=$list item="data"}
{$data.text}
{/foreach}

独自関数「ImageBox」で指定したファイルが表示されるようにしたいと思い、
配列をforeachで出力させようとしました。
しかし、{ImageBox}の箇所が変換されずにそのまま文字として出力されます。

指定方法が間違っているのでしょうか?
わかりづらいかと思いますが、アドバイスいただければ助かります。
0693nobodyさん2009/10/01(木) 20:50:56ID:???
PHP側では展開されません。
0694nobodyさん2009/10/01(木) 21:02:54ID:???
そりゃ$list[0]["text"]の内容を書き出してるだけだからな。

phpなら可変関数使うところだが
Smartyはプラグインで可変関数の実装を作らないとダメかも。
06956922009/10/02(金) 00:20:33ID:???
>>694
foreachで出力される時に、
変数内のSmarty関数も変換されると思ったのですが、
どうやら違うみたいなんですね・・。

プラグインで実装させるとか、難しそうだ・・・
0696nobodyさん2009/10/02(金) 00:35:40ID:???
そのImageBOXで出力されるものを$out_ImageBOXとか変数に入れ込んでおけば?
0697柏アラフォーパパン& ◆.d6LNJ2fbM.9 2009/10/02(金) 15:06:34ID:bCUcRsfE
dsd
0698nobodyさん2009/10/03(土) 17:55:56ID:???
文字列をテンプレート処理出来るメソッドでも作ればいいんじゃないかね。
$list[0]["text"] = $smarty->fetchFromString('{ImageBox file="test.jpg"}');
0699nobodyさん2009/10/03(土) 17:57:12ID:???
$list[0]["text"] = 'test.jp';

{foreach from=$list item="data"}
{ImageBox file=`$data.text`}
{/foreach}

じゃ駄目なのか?
0700nobodyさん2009/10/03(土) 18:51:58ID:???
よほど特殊な処理をさせたいのでなければ>>699に落ち着くと思う。
まあそういうのはやはりPHPでやるべきだろうな。
smartyは最終出力だけにしておこう。
07016922009/10/04(日) 00:06:35ID:???
>>699-700
その方法だと$listに必ず「ImageBox」が無いと駄目です。
ブログみたいに他のタグも挿入したい場合使えないので、
変数(というか配列に入れた値)に、Smartyタグを入れる事を思いつきました。

それで698さんが掻かれているようなプラグインを作って
一旦Smartyタグを処理させてから配列に入れれば、
foreachで出力しても表示されます。
しかし、当然ながらコンパイルファイルが作成されるので
その分ページの生成に時間がかかることになってしまいました・・。
(キャッシュを使えば良いだけですが、なんか気になりました
07026922009/10/04(日) 00:08:43ID:???
ちなみに以下のサイトを参考にしました。
ttp://d.hatena.ne.jp/lapis25/20080908/1220861488

>>698さんのソースを頼りに検索したらヒットしました。
凄く参考になりました。ありがとうございます。
0703nobodyさん2009/10/11(日) 13:15:33ID:gYB28ahJ
すみません、質問です
smartyで{if}の中で出力したりすると、このsmartyタグのせいで発生した改行やらスペースやらが
HTMLにもモロに出てしまって美しくありません
どうにかする方法ないでしょうか?
0704nobodyさん2009/10/11(日) 14:25:24ID:???
{strip}{/strip}
で囲うべし。
0705nobodyさん2009/10/11(日) 15:23:00ID:???
>>704
かっこわるいです。次の方お願いします。
0706nobodyさん2009/10/11(日) 15:43:55ID:???
反論ではないけど、
おれはHTMLの頭から終わりまでstripで囲ってるよ。
改行、空白によるブラウザの変なバグにも遭遇しないし、
何より若干ではあるものの軽くなる。
かっこいいかどうかで言えば、おれは改行なしのほうがかっこいいと思う。
0707nobodyさん2009/10/11(日) 16:11:57ID:???
意図した改行を入れたい場合はどうしてるん?
<textarea>の中身とか
0708nobodyさん2009/10/11(日) 17:59:26ID:???
>>704
おおー、そうだそれがありました
ありがとうございました

>>707
<textarea><$hoge|nl2br></textarea>じゃ対処できないもの?
0709nobodyさん2009/10/11(日) 18:22:54ID:???
改行を残したい箇所を
逆にliteralで囲う。
0710nobodyさん2009/10/12(月) 00:52:20ID:???
JavaScriptとか、改行に意味を持つ言語が混在する可能性を考えると一括して{strip}するのは得策じゃない気がする。
0711nobodyさん2009/10/13(火) 01:13:00ID:???
>>703
そこまで気にするなら
{if}
{assign var="hoge"}
{else}
{assign var="hoge"}
{/if}
<textarea>
{$hoge}
</textarea>
0712nobodyさん2009/10/13(火) 23:52:48ID:B+0jNtpm
Smarty3期待アゲ
0713nobodyさん2009/10/14(水) 00:10:46ID:k/3ZY/k4
質問です。

↓の、アンパサンドって何の意味があるのでしょうか?

$smarty =& new Smarty;


0714nobodyさん2009/10/14(水) 00:27:06ID:???
参照代入
0715nobodyさん2009/10/14(水) 00:36:04ID:???
>>713
ないよ。

PHP4でも5でもnewはリファレンスを返すんだけど、
PHP5でそれが明言されるまではnewを=するとnewなオブジェクトがコピーされるという迷信があった。
だから=&と書いてるところがたまにあるけど、Smartyマニュアルでも普通に=だ。
要するに、単なる誤解が生んだもの。
0716nobodyさん2009/10/14(水) 00:47:30ID:???
>>715
ほんとに? 俺も参照代入だよって説明どこかで読んだなぁ
あの解説ウソついたのかしら?
0717nobodyさん2009/10/14(水) 01:06:18ID:???
4なら意味あると思うが
0718nobodyさん2009/10/14(水) 01:30:24ID:???
>>715
つ ttp://jp2.php.net/manual/ja/language.oop.newref.php
どこでそんな嘘をきいたん?

ちなみに5でも代入で変数のコピーが行われるのは同じ。
違うのはオブジェクトのコピー時の内部動作がハッシュテーブルの複製から
オブジェクトの実体の参照カウンタ操作になっている点。(zvalの参照カウンタとは別ね)
0719nobodyさん2009/10/14(水) 03:14:45ID:???
ちょっとコード書いて実験すればわかるだろ
俺面倒だからパスね
0720nobodyさん2009/10/15(木) 18:15:01ID:???
みんなこんな曖昧なままに済ましてきたってことはあまり使ってない機能ってことかな
俺も使った覚えないわ、マニュアル本にも例なんてないし。損してるんだろうか。。
0721nobodyさん2009/10/16(金) 11:58:47ID:???
オブジェクトのリファレンスか。
使い道が思いつかんでもないが実際に
使う場面ってそうそうなさそうな。
0722nobodyさん2009/10/20(火) 06:10:16ID:???
Smarty 3だれか使ってみた??
0723nobodyさん2009/10/20(火) 10:43:32ID:???
使ってみた
0724nobodyさん2009/10/21(水) 00:53:52ID:???
Smarty3微妙だなぁ・・・相変わらず癖の強いコーディングで読むの疲れる。
extendリソースがあるんだけど、使い方解る人いる?
0725nobodyさん2009/10/21(水) 10:25:55ID:???
結局Smartyなんてassign、display、{if}、{foreach}だけで十分じゃん
というかコレが核だと思う
後は必要に応じて・・・って感じで十分だし
0726nobodyさん2009/10/21(水) 10:59:25ID:???
Smarty3のプラグインは何故グローバル関数なんだろ?
どこら変がPHP5 OOPなんだよ
0727nobodyさん2009/10/21(水) 22:34:20ID:???
プロパティもメソッドも全部publicは鬼だ
一方、__callでメソッドの外部化をしてる

extendリソースってどれ??
0728nobodyさん2009/10/22(木) 01:31:12ID:???
>>727
sysplugins/internal.resource_extend.php
ソースコメント読む限りでは他テンプレートエンジンのextendっぽいんだけど、
リソースとして定義されてるので、どう使っていいかよくわからんw

getTemplateSource()読むと、超強引にblockタグとか置換してるみたいなのであまり有用ではなさそうだけど・・・('A`;
2から乗り換える利点がまだ見えないなぁ
0729nobodyさん2009/10/22(木) 11:33:30ID:???
>>725
そんなこといったらPHPだって
0730nobodyさん2009/10/24(土) 20:08:39ID:???
smarty使ってるレンタルブログサイトとかないの?
0731nobodyさん2009/10/25(日) 04:49:32ID:???
>>730
あるとしてもユーザにSmartyフォーマットでのカスタマイズを許可するとは考えにくいな。
0732nobodyさん2009/10/25(日) 08:28:37ID:???
>>730
別にsmartyに限らず、独自の記法などで対応してるところはある。
Smartyじゃないとダメなら自分で作ればいいジャマイカ。
0733nobodyさん2009/10/27(火) 00:14:32ID:???
中身はsmartyだけど、smartyフォーマットは使わせないようにして
<%hogehogeLoop>と書いたら{section name=hoge loop=$id} になるように置換してるブログシステムはあるかもしれない
大体は自前でやってるか、MovableTypeの改造版じゃないかな
0734nobodyさん2009/10/27(火) 12:20:20ID:???
>>725
それだけしか使わないならもっと速いテンプレートエンジンあるんじゃない?
0735nobodyさん2009/10/27(火) 12:23:42ID:???
>>734
それなんてPHP?
0736nobodyさん2009/10/27(火) 20:55:46ID:???
カラーミーショップ プロ
ttp://shop-pro.jp/

ブログじゃなくてネットショップだけど、テンプレートにsmarty使ってるね
EC CUBEの改造版なんだろうけど
0737nobodyさん2009/10/27(火) 21:04:25ID:???
Smartyでレンタルブログ運営したら重くてしかたないんじゃない?
ユーザー大量にいたらキャッシュ効かせても厳しい気がする
0738nobodyさん2009/10/28(水) 05:06:51ID:???
それは設計の問題であり、Smatyが原因にはなり得ない。
0739nobodyさん2009/10/28(水) 11:11:33ID:???
Smartyの設計の問題ってことですね
0740nobodyさん2009/10/28(水) 13:46:19ID:???
おしい。Smartyを使う人の設計の問題。
0741nobodyさん2009/10/28(水) 15:26:33ID:???
>>737
気のせい
0742nobodyさん2009/10/29(木) 11:06:44ID:???
いい話題がありませんねー
0743nobodyさん2009/10/29(木) 21:54:28ID:???
gooブログの有料版の説明のとこにこんな記述がある
{include file="/home/gooblog/Smarty/blog/templates/comment_link.tpl"}

パスにSmarty入ってますがな
0744nobodyさん2009/10/30(金) 22:56:36ID:???
実際にロジックとテンプレート合わせないとテンプレート側の文法の間違い分からないの?
0745nobodyさん2009/11/01(日) 07:20:38ID:ZF01kyEW
Smarty 3.0 Beta 1 Released
0746nobodyさん2009/11/01(日) 10:57:23ID:???
>>744
確かにできないな
まあ元々プログラマーと別環境で作業すること自体難しい気はするが。
>>745
モノリンガルの俺には厳しいようだ
0747nobodyさん2009/11/01(日) 11:05:45ID:???
>>745
突撃してみるか
0748nobodyさん2009/11/09(月) 13:54:09ID:jgJG5jOb
テンプレートに定義していないコード(例えば{test}など)がある場合、
Smarty errorが表示されます。

このエラーを表示しない方法はないのでしょうか?
PHPのエラー表示をしない事で対処するしかないのでしょうか?
0749nobodyさん2009/11/09(月) 14:06:20ID:???
trigger_errorしてるところをスキップしちゃえば?
0750nobodyさん2009/11/09(月) 20:59:58ID:I33d9sv+
$error_reporting
↑これ?
0751nobodyさん2009/11/11(水) 19:01:43ID:0BFUpwQj
Smartyって、テンプレートの中にテンプレートを読み込むようなことできる?
ある変数の値によって、特定の領域の内容をかなりダイナミックにレイアウトごと変更させたいんだけど
変化のバリエーションがかなり多いんで{if}でパターン分け記述するのはあまり現実的じゃないんだよね

外部でhtmlとして整形したものを丸ごとコントローラでassignさせて飲み込ませるしかないかな?
0752nobodyさん2009/11/12(木) 03:03:02ID:???
そのレベルも調べられないお前には無理だ。
0753nobodyさん2009/11/12(木) 07:44:56ID:dv0ticwo
Smarty 3.0 Beta 2 Released
0754nobodyさん2009/11/12(木) 11:31:04ID:???
>>752
おー、サンキューサンキュー♪
includeって機能があったんだね、この辺から調べてみるよ
たすかったわほんと、ありがとね
0755nobodyさん2009/11/12(木) 12:04:54ID:???
test
07567542009/11/12(木) 19:22:51ID:SoSJwGM8
ごめん、相談させて欲しい
hoge.tplに
{insert name="hogeAction" title="テスト" script="hoge_action.inc.php"}
って書いて、
同じディレクトリにあるhoge_action.inc.php に
<?php
function smarty_hogeAction($param, $smarty){
return 'あいうえお';
}
?>
って書いたんだけど「あいうえお」の出力がされない。
($param, $smarty)の引数を消して function smarty_hogeAction(){… とやってもダメだ。
何が問題かな? ご意見よろしくお願いします
0757nobodyさん2009/11/12(木) 19:58:44ID:???
書き間違えた
× smarty_hogeAction
○ insert_hogeAction
でやってます
07587562009/11/12(木) 22:52:47ID:???
どうも、自己解決しました。
お騒がせしました
0759nobodyさん2009/11/13(金) 13:18:08ID:???
どういう解決方法?
07607562009/11/13(金) 14:36:48ID:???
勘違いしてたというか参考にしてたページがわかりにくかったというか、
要するに
.tplでの記述は {insert name="hogeAction"}
スクリプトファイルは insert.hogeAction.php
ファイルの格納場所は /pluginsディレクトリ
として入れてりゃ良いだけの話だった。自前modifierとかわらんかった。
insertタグのscript属性とかなくても良いものを必須みたいに書いてたり、
関数名(function insert_hogeAction(-,-){-})を嘘書いてるサイトみて
変なことやりまくってたよ。恥。
0761nobodyさん2009/11/13(金) 14:58:34ID:???
公式マニュアル見ればよかったのにね
07627562009/11/13(金) 15:11:57ID:???
>>761
うん、公式がイマイチわからなくて他のサイトみてたらハマっちゃって。
今また公式見返してるけどやっぱりよくわからない
http://www.smarty.net/manual/ja/language.function.insert.php
「{insert} 関数の名前は、 ネームスペースの衝突を避けるために "insert_" によって始まる必要があります。」
ってあるけど、それじゃ上手くいかなくて
smarty_insert_hogeAction() って形でやっと上手くいったからなぁ…

こっちの方が公式よりわかりやすかった、俺が物わかり悪いんだろうけど
http://www.y2sunlight.com/ground/?PHP5.0%2F8.Smarty%A4%F2%CD%FD%B2%F2%A4%B9%A4%EB
0763nobodyさん2009/11/13(金) 15:22:56ID:???
そりゃプラグインとしてファイルを自動読み込みさせてるからだ
http://www.smarty.net/manual/ja/plugins.naming.conventions.php
>PHP ファイル内で定義する プラグイン関数 は次のように指定します。
>smarty_type_name()
07647562009/11/13(金) 16:02:41ID:???
>>763
そうなの。おおお、疑問の本質に近づいてきた、質問させて。
じゃあsmarty_insert_xxx じゃなくて insert_xxx()ってのはプラグイン(別ファイル自動読み込み)じゃないのか。
そもそもinsert_xxx()ってどこに書くの?
$smarty->assign("msg","hello"); みたいな処理を書いてるコントローラ?の.php?
それがわからなくてあっちこっち見る迷走がスタートしたんだ
0765nobodyさん2009/11/13(金) 16:19:30ID:???
偉そうなので教えん
0766nobodyさん2009/11/13(金) 20:01:32ID:???
自分で試せばいいのに。
0767nobodyさん2009/11/14(土) 14:51:09ID:???
キャッシュ効かせても速度あんまり変わらなくね?なんなのこれ
0768nobodyさん2009/11/14(土) 19:37:58ID:???
下記のように、フォームでエラーがあればp要素を表示、なければ何も表示しない場合、
みなさんは、どこまで、どんな方法でテンプレートを利用していますか?
<p class="error">※必須項目です。記入してください。</p>
<p><input type="text" name="mail" value=""></p>

1. エラーメッセージは最初からpでマークアップ済み、そのままassign、smartyには{}のみ
{$errors.mail}

2. エラーメッセージはテキスト、assign時に空欄かどうか判定してpでマークアップ、smartyには{}のみ
{$errors.mail}

3. $errorsにはテキスト、そのままassign、smartyで{if}処理
{if $errors.mail}<p class="error">{$errors.mail}</p>{/if}

4. $errorsにはテキスト、そのままassign、smartyで関数処理
{$errors.mail|markupFunction}

デザイナさんと分業する場合、
プログラム側がマークアップに関わらない3.が一番いい気がしているのですが、
少しテンプレートファイルが煩雑になるのが気になったりもします。

エラーメッセージマークアップ用の小さなテンプレートファイルを作っておいて、
4.のmarkupFunctionから読み出して利用すると比較的キレイな気もしますが、
テンプレートファイルが小分けになるのも煩雑といえば煩雑な気もします。
0769nobodyさん2009/11/15(日) 03:44:59ID:???
>>767
Apacheの連続アクセステストしたけど、アクセス回数が多ければ多いほど
キャッシュの効果は効いたよ。ただし、1.2〜3倍速くなる程度だけど。
>>768
ブログのテンプレみたいなのを作ってるが、3が一番良いよ。
MTなんかもそうだし。
0770nobodyさん2009/11/15(日) 07:22:36ID:???
自分はクラスだけでやってる。

エラーは常に埋め込まれ、CSSで非表示にしておく。もしエラーなら親要素にerrorというクラスを与えて、その子要素のエラーを表示するCSSを書いておく。

div p{ display:none }
div.error p{ display:block }

これでエラー時のテキストもデザイナー側で書ける。

親要素は
<div class='{$error.title}'>
って感じで、タイトル項目がエラーなら error.title に 'error' を assign しておくだけ。
■ このスレッドは過去ログ倉庫に格納されています