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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/02/02(土) 00:21:09ID:6cKcKeTp
まぬあるhttp://www.smarty.net/manual/ja/
0781nobodyさん2009/11/17(火) 06:08:10ID:???
Smarty 3.0 Beta 3 Released
ペース早いな
0782nobodyさん2009/11/17(火) 13:05:14ID:???
>>780
更新が少ないもしくは、更新タイミングが決っている場合にキャッシュ有効にすればいい。
大規模サイト用のチューニング項目だと思えばいいんじゃないかね。
0783nobodyさん2009/11/17(火) 15:47:08ID:???
>>780
769にも書いたけど、負荷テストした時は効果合ったよ。
同時アクセス100とか1000の場合に。
0784nobodyさん2009/11/19(木) 15:56:07ID:???
多数の他人に更新させる場合はキャッシュオフ?
掲示板とかね
有効にしといて書き込まれたタイミングでキャッシュ削除するのかな
0785nobodyさん2009/11/20(金) 13:27:52ID:???
ぴーえちぴー5.3.0
りなくす

Smartyでテンプレートが無い場合に白い画面になっちゃうんで、エラーをハンドリングしたいんですけど出来ないでしょうか?
テンプレートがあるか判定なんてめんどーなことしないといけないんですかね?
0786nobodyさん2009/11/20(金) 13:53:02ID:???
できるでしょ
そもそもfatal errorなり出るはず
0787nobodyさん2009/11/20(金) 13:55:42ID:???
PHPのerror_reportingが0になってるとかじゃね?
0788nobodyさん2009/11/20(金) 14:07:49ID:L1RHfQMx
try
{
$smarty->display($tpl);
}
catch
{
なんたら
}
みたいにやりたいです。
エラーレポ調べてみます。
0789nobodyさん2009/11/20(金) 14:24:17ID:L1RHfQMx
error_reportingはnullのようです。ログに出して確認。
3に設定して見ましたが例外はキャッチできませんでした。3が間違いなんでしょうか?

>>786
それは戻り値として出るということですか?
0790nobodyさん2009/11/20(金) 14:27:34ID:???
>>789
error_reporting(E_ALL);
0791nobodyさん2009/11/20(金) 14:30:40ID:???
>>789
もしかしてxampp?
0792nobodyさん2009/11/20(金) 14:32:43ID:L1RHfQMx
displayのソース見ましたが、エクセプションはスローされないようですね…
素直にtemplate_exist使いたいとおもいます。

>>786
voidですね。
0793nobodyさん2009/11/20(金) 15:02:58ID:???
fatal error出るでしょに対する返答がvoidですとか謎い
0794nobodyさん2009/11/20(金) 15:05:46ID:L1RHfQMx
display_errors = Off

display_errors = On
httpd restart

error_reporting(E_ALL);
try
{
$smarty->display($tpl);
}
catch
{
なんたら
}

>>791
XAMPPじゃないです。それぞれソースからいれました。
0795nobodyさん2009/11/20(金) 15:09:05ID:L1RHfQMx
あ、794の結果はダメでした。同じ結果で白い画面になります。

>>793
789への自己レスです。
0796nobodyさん2009/11/20(金) 15:12:27ID:???
ちょろっとググってみたらこんなんもあった

(2)Smartyのファイルを調べてみる
画面が真っ白になった原因として、Smartyのファイルが壊れていることがあるのです。
http://xoops-manual.net/modules/smartsection/item.php?itemid=17
0797nobodyさん2009/11/20(金) 15:14:35ID:???
>>794
テンプレートファイルが無かった場合に出るエラーは
Smarty.class.phpの1591行目くらいにある
$this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
でしょ?

で、例外をスローさせるための案
1.当該箇所を書き換える
2.Smartyクラスを継承したMySmartyクラスを作って_fetch_resource_infoメソッドをオーバライドする
3.set_error_handler関数でwarningが発生した時に例外投げるようにする

xamppじゃないとのことなので真面目に答えてみました
0798nobodyさん2009/11/20(金) 15:25:36ID:L1RHfQMx
>>797
おぉ、まさに欲しかった回答です。
ありがとうございます。
そのワーニングで間違いないです。

1…書き換えるのは好きじゃないです。
2…うーん、処理に悩みそうです。
3…これが簡単そうです。

ちょっとがんばってみます。
たすかります。
0799nobodyさん2009/11/21(土) 10:25:34ID:???
fetchってどういうとき使うの?
0800nobodyさん2009/11/21(土) 11:47:09ID:???
自動送信・返信メールの文面とか。
0801nobodyさん2009/11/21(土) 13:04:20ID:???
>>800
ありがと、メールのテンプレか
就活してたときの毎ナビか何かの企業からメールに
『こんにちわ寒くなりましたね、{$username}さん』
とか、書いてあったのを思い出した
0802nobodyさん2009/11/21(土) 15:18:41ID:???
>>798
普通は三番
サンプルは沢山見つかる
0803nobodyさん2009/11/26(木) 11:34:27ID:tP8Fcb0C
しつもんです
parent.tpl中で、includeを使ってテンプレート化したヘッダを読み込ませたいと思ってるんですが
テンプレート(header.tpl)をページの種類に応じて動的に変更させたいときの手順がよくわからないです。
たとえば、動物の紹介ページでは動物の一覧を、自動車の紹介ページでは自動車の一覧をヘッダに表示したい時、
表示対象の画像や情報(動物写真/自動車写真、それぞれの名前情報など)は、includeタグの中に変数として
持ち込むしかないのでしょうか?

自分のイメージでは{include file='header.tpl' pageType='animal'}として、
変数値animalを受け手のテンプレで解釈してそれを元にDBから必要データを取得できたらいいなと思ったんですが。
(なるべく一カ所で取得プロセスを管理したいので)
そんなのは無理で、あらかじめ親のparent.tpl=parent.phpで必要データを取得して、
それをincludeに変数で渡すしかないという結論でいいのでしょうか?

今思いついた方法は、incudeタグ中の変数でpageType='animal'と渡して、それをheader.tplで
自前のmodifierに譲渡しそこから必要データ取得→出力の流れです。
もっとスマートなやり方ないでしょうか? アドバイスお願いします
0804nobodyさん2009/11/26(木) 15:51:29ID:???
>>803
何を言ってるのか良く分からないけど
>変数値animalを受け手のテンプレで解釈してそれを元にDBから必要データを取得できたらいいなと思ったんですが
すればいいのでは?
0805nobodyさん2009/11/26(木) 15:52:24ID:???
補足、テンプレートファイルで解釈するのではなくPHP側でという意味で。
0806nobodyさん2009/11/26(木) 16:04:59ID:???
余計意味がわからない。
なぜmodifier?function作れば?
08078032009/11/26(木) 23:09:48ID:tP8Fcb0C
皆さんありがとうございます
>>804
header.tplって、単独のページとしては存在しないあくまでパーツのテンプレートなので、
index.tplに対するindex.phpの様なコントローラ(?)のファイルってheader.tplにはないのではと
考えたのですが…(header.phpにアクセスすることはないと思うので)
思い違いなのでしょうか?
>>806
勉強不足なのかもしれません、functionについて調べてみます。ありがとうございます。
0808nobodyさん2009/11/26(木) 23:58:18ID:???
>>807
includeするんだからindex.phpでやればよいのでは?
08098032009/11/27(金) 01:09:41ID:???
>>808
あ、親のページでってことですか、、なるほど!
1)ページのテーマ(animalとか)を引き渡されてDBに働きかけるphpを外部化し、
2)それをheader.tplの親のanimal.php, car.phpなどに読み込んで、
3)結果をincludeタグ渡す
って感じでいいかな。
これならデータの取得部分が複数にばらけることもないのか。。
これのデータ取得の順番を変えたものがfunctionでやるってパターンかもしれない

ありがとうございます。チャレンジしてみます
0810nobodyさん2009/11/29(日) 07:42:11ID:wdDHDadn
テンプレート関数プラグインのfunction(smarty.hogefunc.php)を作ったんですが、
<?php
$var = "abc";
function smarty_function_hogefunc($params, &$smarty){
global $var;
return $var;
}
?>

上記の内容で <div>text</div>{hogefunc} としてもabcを出力しません、なぜでしょうか?
パスが通ってることは確認済みで、 $var="abc"; を echo "abc" とした場合、
abc<div>text</div>の形で出力するようです。
変数のスコープのチョンボをしてるのかなと考えてはみたんですが…
function …{〜} の外に書かれたものは正常に処理されないという仕様なんでしょうか?
申し訳ありませんが、ご意見宜しくお願いします
0811nobodyさん2009/11/29(日) 13:22:28ID:???
お前は何を言ってるんだ
0812nobodyさん2009/11/29(日) 14:16:45ID:???
return "abc";

してみればいいじゃない。
08138102009/11/29(日) 23:16:09ID:???
>>812
functionの中でreturn "abc"; すると、それは返すんです。
なんでかなぁ
>>811
わかりにくかったみたいですみません
0814nobodyさん2009/11/30(月) 09:19:43ID:???
functionの中で

・print_r($_GLOBALS)してみる
・echo $varしてみる
0815nobodyさん2009/12/02(水) 14:25:43ID:1PNbu+TX
http://www.youtube.com/watch?v=lsPL2QoElmw
http://www.youtube.com/watch?v=DyzzLwlIcpE
http://www.myspace.com/ametsub3110

http://www.youtube.com/watch?v=BDD9MZUTQzs
http://www.myspace.com/serphinjapan

http://www.apple.com/jp/quicktime/download/
http://www.jimbeard.com/boomer.html
http://www.jimbeard.com/Beard%20mp3s/Song%20of%20the%20Sun%20128/Camieff%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Song%20of%20the%20Sun%20128/Parsley%20Trees%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Truly%20128/Hand%20to%20Hand%20Wb.01_01.mp3
http://www.jimbeard.com/Beard%20mp3s/Truly%20128/Gonna%20Tell%20on%20You%20Wb.01_01.mp3
0816nobodyさん2009/12/04(金) 17:16:31ID:???
smartyのキャッシュを有効にするとサイドバーにinsertしておいたプラグインが上のほうに来てしまうんだけど、何か原因わかりませんか?
ブラウザで見るソースとcacheフォルダのキャッシュを見ると、DOCTYPEタグより上にプラグインの中身が出てしまってるんです
08178162009/12/05(土) 18:55:21ID:???
あー、すげー馬鹿なことやってた
insertプラグインって中でechoしちゃダメなのかreturnしないとイケないのか
キャッシュオフのときは正常に見えるから気付かなかった
0818nobodyさん2009/12/07(月) 16:47:15ID:???
だからいったじゃん
0819nobodyさん2009/12/09(水) 10:32:51ID:AWY/enbH
一部キャッシュして欲しくない部分があるんですが、そこだけ{insert}にして外に出すしかないんでしょうか?
08208192009/12/10(木) 15:56:47ID:???
なさそうですね
0821nobodyさん2009/12/13(日) 22:00:00ID:???
>>820
これだとだめなん?
ttp://www.smarty.net/manual/ja/caching.cacheable.php
0822nobodyさん2009/12/13(日) 23:07:04ID:???
>>821
ありがとうございました
0823nobodyさん2009/12/15(火) 15:00:29ID:???
Warning: Smarty error: unable to read resource:

のエラーが出る際に、

自分で作った404エラーページ(のテンプレ)を読み込むことはできますでしょうか?
0824nobodyさん2009/12/15(火) 15:56:24ID:???
とりあえずそれは404じゃない。
$error_reportingを参照したらいいとおもう。
08258232009/12/15(火) 16:39:30ID:???
自己解決しました。
0826nobodyさん2009/12/25(金) 18:27:23ID:???
SmartyってWebで検索してもマニュアルかその複製しか全然情報が出てこないけど、どっかいいサイトないですか?
マニュアルはサンプルとか説明が簡単すぎて知りたい情報が出てこないのですが・・・

例えばdefault_resource_typeプロパティで、デフォルトのfile以外の値を知りたいのに、それどころかサンプルすら書かれていなかったり困ります
リソースプラグインの事ももっと知りたいんですが見つかりません

PEARでも感じましたが、なんでこう情報が少ないんでしょうかね?
マニュアルとそのコピー以外の情報が出てきません
0827nobodyさん2009/12/25(金) 19:02:01ID:???
PEARもSmartyも情報は溢れてるよ。
無いのは君の理解力だろう。

Smartyに至ってはマニュアルあれば大抵は事足りる。
リソースプラグインに関しても、マニュアル読んでわからん人には無縁なんじゃねぇかな。
あれ以上丁寧な解説求めるなら金払ってスクールにでも通えばいい。
0828nobodyさん2009/12/25(金) 21:36:44ID:???
ソースも結構シンプルだから
謎があったら追い掛けてみたら?
0829nobodyさん2009/12/26(土) 18:39:45ID:???
>>827
溢れているとまではいかないんじゃないかと俺は思う
0830nobodyさん2009/12/27(日) 00:20:26ID:???
具体的にどんな情報が欲しいの?
「俺の知りたい情報が無い」ってだけじゃ、教える側もわからんだろう

default_resource_typeにしたって、リファレンスのテンプレートリソースとリソースプラグインの項目に十二分な情報載ってると思うしなぁ
ここまで枯れた技術なのに、情報が足りないってのは調べる力か理解力が無いとしか思えないんだが
0831nobodyさん2009/12/27(日) 11:58:44ID:???
もし情報がなかったとしたらこのスレがもっと賑わってると思うんだ
0832nobodyさん2009/12/27(日) 13:02:13ID:???
いやそもそもSmarty使いの絶対数がすくなうわなにをするやめ
0833nobodyさん2009/12/27(日) 19:56:19ID:???
>>831
「もし情報があったとしたら〜」なら同意できるんだけどな。

ブログなんかでちょこっと取り上げているサイトはあっても
ユーザー同士で語り合うようなコミュニティは無い。
マニュアル見ろよってのは当たり前の行為で、
Smartyはそれ以上の使い方(サイト構築のテンプレ利用など)があるから
使い方やアイディアをまとめたサイトがあれば良いとは思う。
0834nobodyさん2009/12/27(日) 21:01:57ID:???
コンパイルせず使う方法ないのかな
0835nobodyさん2009/12/29(火) 11:19:04ID:???
>>833
コミュニティか・・・
たとえば2chにSmartyスレたてたらいいんじゃないかな
0836nobodyさん2009/12/29(火) 11:34:24ID:???
名案だな。
0837nobodyさん2010/01/06(水) 21:51:18ID:???
俺もSmartyのしっかりとしたサイトってないなとは思ってた
マニュアルって簡潔にまとめられてるからね

>>833の言ってるようなことは俺は分かるね
Webだけじゃなく、他にも構築する時にここどうすればいいんだっけ?って時に調べられないからね
情報が少なすぎて
0838nobodyさん2010/01/07(木) 09:11:46ID:???
書籍は?
日本語で複数出版されてるのは恵まれてる方だと思う。

まとめサイトは自分で立ち上げて、ある程度充実させられれば
他の人も情報を集めてくれるようになるかもよ。
0839nobodyさん2010/01/07(木) 15:20:10ID:???
Smartyの本ってある?
Smarty入門しか知らないけれど・・・?
0840nobodyさん2010/01/07(木) 16:37:46ID:???
PHPのウェブアプリの本だとSmarty出てきたりするな
0841nobodyさん2010/01/07(木) 23:58:21ID:???
Smartyのキャッシュ機能ってなにをキャッシュしてるん?
$smarty->assignで割り当てるのは変数だからキャッシュじゃないし
0842nobodyさん2010/01/08(金) 00:03:40ID:???
すまんアホなこと書いた
0843nobodyさん2010/01/08(金) 09:13:25ID:???
だから具体的にどんな情報が欲しいんだよw
WEBに溢れている情報を漁るだけで、大抵の事は答え一歩手前まで調べられるだろ・・・

0844nobodyさん2010/01/08(金) 10:58:43ID:???
Smartyをカッコよく使いこなす方法
0845nobodyさん2010/01/08(金) 11:57:09ID:???
2chで教えて君をしてる時点でかっこわるい
0846nobodyさん2010/01/08(金) 12:11:21ID:???
もっとSmartyをスマートに使う方法
0847nobodyさん2010/01/09(土) 17:17:11ID:???
使いこなし方まではWebで出てこないな、確かに
0848nobodyさん2010/01/17(日) 19:36:43ID:???
Smarty使う場合はdisplay()以降に処理は記述しない方が吉?
0849nobodyさん2010/01/18(月) 03:14:17ID:???
0850nobodyさん2010/01/18(月) 11:28:14ID:???
別にそんなことはないかと思うが
2枚以上のテンプレートをdisplay()する場合もあるし
0851nobodyさん2010/01/18(月) 14:06:09ID:AGLkXiCO
smarty2では
$smarty->assign('pref', array('01' => '北海道', '02' => '青森'));

{$pref.01}
で北海道が取れていたのだけど、
Smarty3Beta板では
{$pref['01']}
としないと取れなくなったのは仕様変更ですか?
0852nobodyさん2010/01/18(月) 14:06:25ID:YiIR+7Mx
質問です。

$hoge = array(
 array("name" => "aaaaa", "value" => 1),
 array("name" => "bb", "value" => 2),
 array("name" => "ccc", "value" => 3),
 array("name" => "dddddd", "value" => 4)
);

$fuga = array(
 array("value" => 2), array("value" => 4)
);

上記二つのような配列変数があります。
Smartyを使って、$hogeの内容をチェックボックスとして表示しようと思っています。
また、$fugaの内容と一致するvalueの部分を選択状態にしておきたいです。
(例)
□aaaaa   ■bb   □ccc
■dddddd

テンプレート側でどのように指定すれば、上記方法を実現できるでしょうか。
{foreach}を使おうと思ってるんですが・・・
0853nobodyさん2010/01/18(月) 14:25:16ID:???
>>852
html_checkboxes使うの?それとも手動でやるの?
0854nobodyさん2010/01/18(月) 15:07:42ID:???
>>853
手動です
html_checkboxesのほうがやりやすいのでしょうか?
0855nobodyさん2010/01/18(月) 15:59:06ID:???
>>854
foreachでやるなら普通にループさせて
要素を出すところでifで比較してchecked入れればいいんじゃない?
$fugaのデータ構造がそのまま使えなくてちょい面倒だけど
予め使いやすいように変換するか、更にループさせて全件比較すればいいかと
0856nobodyさん2010/01/20(水) 22:11:47ID:q80CCbb+
以下のようにinterfaceによる拡張を試しています。

interface iSmarty { const MY_NAME = "foo"; }
class MySmarty extends Smarty implements iSmarty {/*設定*/}

{$smarty.const.MY_NAME}
値fooが表示されることを期待したのですが、MY_NAME(定数名)が表示されてしまいます。

マニュアルの{$smarty.const}の項を見ると、defineによる例が掲載されていて
確かにdefineで定義されていれば正しく値が表示されます。
バージョン2.1なのでちょっと古いのかなとも思うんですが、
php5のコードを追加するのは無理でしょうか。
08578562010/01/20(水) 23:35:47ID:???
すみません、しばらく考えていたのですが、断念することにしました。
拡張も考えてみたのですが、もとがphp4ですから、こちらのPHP環境と合わせて考えると
サブクラスで定義した"クラス定数"をテンプレートから呼び出すことは
おそらく無理と判断しましたm(_ _)m

確かなことは言えませんが、クラスを変数で参照できるphp5.3以降でなら
プラグイン等で機能追加できるような気がします。
0858nobodyさん2010/01/21(木) 04:40:11ID:???
php4だから無理ってどういうこっちゃ?どこに書いてあるん?

マニュアルの例はもうちょっと落ち着いて見直してみたほうがいいと思うけど
0859nobodyさん2010/01/29(金) 18:46:34ID:???
インサートプラグインの中でもテンプレート指定してキャッシュさせてるけど
インサートプラグインが1ページに5、6個あるとかなり速度低下してきてしまう
0860nobodyさん2010/01/30(土) 00:48:00ID:???
>>859
そんな、あなたにsmarty3の出番ですよ。
プラグインを書く必要ないぞ。
08618592010/01/30(土) 10:34:45ID:???
え、そうなの?プラグイン書かなくていいってどういうことですか?
今はindex.tplに{insert name="hoge"}って書いて
[insert.hoge.php]
function smarty_insert_hoge($params, &$smarty) {
 if(!$smarty->is_cached('plugin_hoge.tpl', "plugin|hoge")) {
  DBからデータを取ってきてassign
 }
 return $smarty->fetch('plugin_hoge.tpl', "plugin|hoge");
}
DBに更新を加える時にclear_cacheという感じでやってるんですが、作り方としておかしいですか?
こういうインサートプラグインが増えてくると、is_cachedとfetchをその分しなきゃいけないんで遅くなってると思うんですが
smarty3だと改善されてるんでしょうか?
0862nobodyさん2010/01/30(土) 11:59:30ID:???
Smarty3だと{nocache}で囲むだけでいいらしいよ。だから、インサートプラグインいらず。
0863nobodyさん2010/01/30(土) 12:29:50ID:???
nocacheなら↓で実現できたヤツですね、最初からあるのとないのでは大違いでしょうが。
http://www.smarty.net/manual/ja/caching.cacheable.php
0864nobodyさん2010/01/30(土) 14:12:57ID:???
Smarty2より遅いSmarty3なんてゴミにしかなりえない
08658592010/01/30(土) 14:45:10ID:???
>>862
キャッシュしたいのでnocacheは用途が違う気がします
0866nobodyさん2010/01/30(土) 15:09:07ID:???
あらかじめオブジェクトをシリアライズしておいて、それをアンシリアライズして読めば早いよってことなんだけど
方法がよく分からない。
結局require_once "Smarty.class.php"しなきゃいけないんだよね?
意味分かる人教えてください

Smartyの読み込みコスト(時間)を削減する
ttp://code.xenophy.com/?p=73
0867nobodyさん2010/01/30(土) 16:02:16ID:???
意味わかんない記事ですね
効果も0.01秒だし
0868nobodyさん2010/01/30(土) 16:56:45ID:???
0.01秒って結構大きいんじゃね?
0869nobodyさん2010/01/30(土) 16:57:37ID:???
なんで?
0870nobodyさん2010/01/30(土) 17:23:46ID:???
あれ?デカくね?
0871nobodyさん2010/01/30(土) 17:31:09ID:???
なんでと聞いているんだ
0872nobodyさん2010/01/30(土) 18:09:30ID:???
1回表示するたびに0.01秒だろ
うちのサイトだと0.01秒早くなったら速度2倍だぜ
0873nobodyさん2010/01/30(土) 18:11:35ID:???
感じられねーだろw
0874nobodyさん2010/01/30(土) 21:26:36ID:???
>>873
濡れ濡れよ
0875nobodyさん2010/01/31(日) 16:37:31ID:tjv1ZgGA
compile_dirのディレクトリがなかったり、書き込み権がない場合
コンパイルエラーになりますが、たまにパーミッション設定を忘れたりして
こういう現状が度々あります。

忘れず確認すれば良い事ですが、なにか効率の良い方法はないでしょうか?
0876nobodyさん2010/01/31(日) 16:53:46ID:???
どんな風にできたらいいの?
0877nobodyさん2010/01/31(日) 17:59:24ID:tjv1ZgGA
・コンパイルエラーを出さない
・コンパイル用のディレクトリがない場合、自動的に作成

と言うぐらいしか思いつきません
後者はis_dirでチェックすればいいと思うのですが、前者は方法自体わかりません・・・
0878nobodyさん2010/01/31(日) 18:01:14ID:???
>>877
エラーメッセージでファイルを検索→当該行をコメントアウト
0879nobodyさん2010/02/01(月) 13:24:00ID:???
>>878
そんな凄い事が出来るんですか?
当該行をコメントアウトって、文字列の置換とは違うんですよね?
0880nobodyさん2010/02/02(火) 14:53:16ID:???
Smarty2.6からSmarty3への移行ってlibsの中身変えるだけでいいんですか?
■ このスレッドは過去ログ倉庫に格納されています