【Smarty】PHPのテンプレートエンジン【Flexy】
SmartyとFlexyを軽く使ってみたけど、
結局、テンプレートエンジン使わなくなったよ。
テンプレートエンジンは異なる文法を使うのが面倒くさかったり、
制約やバグがほげほげだったりして、
利用する価値はたいしてなかった気がする・・
デザインの分離はしてるけど、記述は生のPHPでいいよ。
自分一人でやるならなんでもいいわな
一人でやらなくてもPHPでいいと思うよ。
デザインを分離して書けば、
PHPのコードもテンプレートエンジンのコードも
たいして変わらないものになる(もしくはそうできる)
>PHPのコードもテンプレートエンジンのコードもたいして変わらないものになる
その辺は徹底させてるから問題ない。と言うかそんなもん持って来られたら怒鳴って付き返s(ry
まぁ、それで問題なくやれてるんならいいんじゃね?
俺の所ではコレでやれてるから、おまいのとこでもやれるに決まってる。ってのが常に成り立つわけじゃないし
<?= の記述使ってるんだろうか
漏れはあんまり好きじゃないなぁ
デザインの分離は完璧だぜ!って言う人のPHP混在のテンプレートを見てみたい
<?= ?>は使ってないです。
<?php echo ?>でやってます。
ちょっと冗長な感じはあります。
そいつはまた見通しが・・
例えばテーブルの出力とかどうやってんの?
ちょっと長いだけで、構造は変わらないので、基本的に見通しも変わらないですよ。
でも見た目すっきりしてほしい感じはありますけど。←ここだけ生PHPだと微妙なところ。
テーブルの出力については、テンプレートエンジンも生PHPも同じでは?
フォームなどの定型HTMLはViewクラスで生成させることもあります。
デザイナにサーバ側のリソースへのアクセスをある程度抑制したいときはテンプレートエンジン使ったほうが楽だね。
記述が比較的短いってのも利点かな。
PHPテンプレートってのはSmartyとかが世の中にまかり通った後で(つまりテンプレート化の重要性が認識されるようになった後で)、「PHPでも同じじゃね?」派の人たちによって広まった概念じゃないかと思ってみたり。
まあどっちも得手不得手があるだろうし、好きなほう使うってことで問題ないと思う。
俺の場合は個人的にSmarty使ったほうがソースの見た目が断然すっきりするっていうくだらない理由でも気持ちいいから使ってるよ。
ソースの見た目がすっきりするのは重要だな。
PHPテンプレートって考え方はテンプレートエンジンとの対比で生まれたんだろう。
でもまぁ、そもそも PHPがHTMLにロジックを埋め込む って目的で生まれたんだから、
PHPテンプレートなんて当たり前といっちゃ当たり前だな。
つーかテンプレートいじるやつが PHP を破壊しないってことが
大前提で、それが成り立つ現場でなきゃ使えないっていうことが
なんだかスルーされてる気がするんだが。
あとテンプレートにしておけば htmlspecialchars 強制適用とか
やりやすいし「より安全」だと思う。
337 :
336:2006/02/06(月) 09:25:37 ID:???
ごめん、意味が分からんな。
「いわゆるPHPテンプレート」より「テンプレートエンジン」の方が
安全ということが言いたかった。
うちのデザイナー達は、smartyテンプレート自体を破壊しますが何か?
いや、特に何も。
Smartyのテンプレの問題点をデザイナーにちゃんと説明して
理解させてない
>>338が使えない子なだけです
341 :
nobodyさん:2006/02/06(月) 19:31:22 ID:AJx7JA/M
>>326 OOPできない奴がそういう事言うよね。
デザイナーさんたちカワイソス
>>340 それを言い出すと、
生のPHPの問題点をデザイナーにちゃんと説明して
理解させてない
>>340が使えない子なだけです
も同様に成り立つんで、揚げ足取りとしてはダメダメだな。
>>343 まあ揚げ足取りの揚げ足取っても意味ねーよ。
と、揚げ足取りの揚げ足取りの揚げ足を取ってみた。
Smartyで
<?php $request = $_REQUEST; print($request[$req['name']]); ?>
というのを
$request, $reqにはassignできているとして
$request[$req['name']]の部分はテンプレートにどう書けばいいでしょうか。
>>345 assign使って2段構えかな。
{assign var="tmp" value=$req.name}{$request.tmp}
347 :
345:2006/02/07(火) 10:53:47 ID:???
上げ忘れましたすみません。
もうひとつ、345と同じかもなのですが、2次元以上の配列の指定の仕方が
わからないです。初心者ですみません。
たとえばPHPで $data[1]['error']['name']というのは
{foreach from=$data item=results}
として
{$results.error.name}
でアクセスできると思ったのですが、違うみたいで…。
どなたか教えてください。
349 :
345:2006/02/07(火) 11:09:29 ID:???
>>346 早速ありがとうございます。試してみます。
>>348 ええ、違うようです。でも違っているかどうかを尋ねているのではなく、
2次元以上の配列の指定の仕方を尋ねていますので
ひとつよろしくお願いします。
>350
でも1コ足りなくない?
>>351 足りなくなくない?
foreachの中で$results は $data[*]相当の配列じゃなくなくない?
353 :
345:2006/02/07(火) 13:58:46 ID:???
>>346 {$request.$tmp}でいけました。ありがとう。
>>350-352 ごめんなさい。私の配列の数が違ってました。ありがとう。
>assign使って2段構え
これ気持ち悪いよね
無駄な部分が増えるっていうかさー
>>354 まあね。
嫌なら
>>345の$request[$req['name']]みないなものは初めから$smarty->assignしないってのが得策かな。
つーか普通に使っててそんなの登場したことないよ。
テンプレートに突入する前にいじくってでも変な構造のものは除去したい性分だし。
2次元以上の配列自体ほとんど皆無だな。(←これはかなり人によるだろうけど)
オブジェクトの配列ならいっぱいあるけど。
テンプレートにはなるべくビューティホーなデータしか渡したくない。
なるべくシンプルなifとforeachだけで解決できるのがベスト(ちなみにsectionは食わず嫌いw)。
だからSmartyの機能ほとんど使い余してる。
smartyで
とある配列の件数をif文で使うことってできますか?
{if $hoges|count > 0}
こんな感じで使えるといいのですが
できないですよね?
配列とは別に他の変数として件数を渡すのでしょうか?
{if count($hoges) > 0} でいいんでない
>>357 ありがとうございます
知らなかった・・・orz
普通にそこにPHPの文かけるんですね
メールも送れた
359 :
名無しさん@お腹いっぱい。::2006/02/08(水) 10:19:25 ID:Lc3DPQ+B
初の投稿になります。
よろしくお願いしますm(_ _)m
携帯電話でsmartyを使ったサイトを作っているのですが
ページが表示できません。
怪しいと思った部分($smarty->debugging = false)など設定
してみたのですが・・だめでした。
原因と思われる理由って何かわかりますでしょうか?
よろしくお願いします。
360 :
& ◆h9Bn.Lr5Ro :2006/02/08(水) 10:25:12 ID:Lc3DPQ+B
359の追記です。
エラーの内容については
端末が吐き出しているエラーのようです。
kddi --- このページは表示できません(未対応)
docomo --- 接続できません
Smarty以外の部分に原因がありそうな希ガス
携帯コンテンツ用の正しいHTMLかどうかとか
そのサイトでスタティックなHTMLを置いた場合に携帯で閲覧できるかとか
IE等のPCブラウザでは閲覧できるかどうかとか
確認してみては?
364 :
nobodyさん:2006/02/08(水) 14:00:57 ID:Lc3DPQ+B
お返事ありがとうございます。
検証した結果smartyの問題でなく
headerの問題ということがわかりました
皆さんアドバイスありがとうございました。(_ _)m
smartyで配列数分ループさせる記述ってどうするのでしょうか?
phpではforeach()でやってたんですが
{section name=hoge loop=$a}
〜
{/section}
↑上の$aのところにassign('a',配列数);
と変数渡すしかないのでしょうか?
366 :
365:2006/02/22(水) 14:19:24 ID:???
自己レス
smartyにもforeachあるんですね、失礼しました。
誘導されて来ました。
各種処理の結果を表示するhtmlのテンプレートを_template.htmlとして用意し、
それを利用してブラウザに情報を挿入したhtmlを表示させるにはどうすればよいのでしょうか?
今までは表示用のhtmlを、あとから情報を挿入したい部分毎に細切れにしたものを変数に入れておき、
情報を挟みつつ順番につなげてからechoで出力していたのですが、
デザイン面の変更にかなり手間がかかっていました。
そこで次に試してみたのは、
_template.htmlの情報を挿入したい部分に{$hoge}と入れておき、
$hoge = "output test";
$output = file_get_content("_template.html");
echo $output;
としてみたのですが、ブラウザにも「{$hoge}」とそのまま表示され、$hogeに格納した文字列は表示されませんでした。
たとえば$output = "テスト{$hoge}";とやると$hogeの内容が表示されます。
どうすれば_template.html中の{$hoge}のような部分に変数の内容を表示させることが出来るのでしょうか?
よろしくお願いします。
>>368 ここへ来たって事は、
テンプレート園児を使うように仕様変更するつもり
って事だな?
370 :
368:2006/02/22(水) 16:49:35 ID:???
>>369 くだ質スレで質問したところこちらに誘導されたのでこちらで書き込みました。
まだPHPを初めて短いのでテンプレートエンジンに手を出すことは考えていませんでした。
処理を記述したphpファイルからデザインhtmlを呼び出して画面表示できればいいと思っていたので、
外部ファイルを読み込んで変数をぶちこんで出力、ということさえできれば
それ以上の機能はとりあえず欲していません。
テンプレートエンジンに頼るしか手段はないものなのでしょうか?
371 :
nobodyさん:2006/02/22(水) 16:56:55 ID:Lv5GjAsx
ヒント
$smarty->fetch("_template.html");
>>370 先のことを考えるなら、テンプレートエンジンの導入も健闘してみる価値はある。
とりあえず、急ぎで何とかしたいって言うなら、
_template.html内の{$hoge}の部分を
<?php echo $hoge ?>
として
php側で処理の最後に
include('_template.html');
>>368 私も昔smarty程の機能は必要がないと思いってこんな方法で試行したことがあります。
【テンプレート(index.tpl)】
<html>
<body>
<img src="%%GAZOU%%">
</body>
</html>
【PHP】
//テンプレート読み込み
$Path = 'index.tpl';
if (($fp = fopen($Path,"r")) == false){
echo('error: load template')
}
while(!feof($fp)){
$result .= fgets($fp);
}
fclose($fp);
$result = str_replace("%%GAZOU%%", 'welcom.jpg', $result);//文字置き換え
echo($result);//出力
テンプレートデータを持つクラスを作ってしまえば、ソースも美しくなるでしょう。
私の場合、クラスに機能追加し始めだしてから・・・「結局smarty??」となりましたがw
374 :
373:2006/02/22(水) 21:04:30 ID:???
あちなみに、368さんのやり方なら
>>_template.htmlの情報を挿入したい部分に{$hoge}と入れておき、
>>$hoge = "output test";
>>$output = file_get_content("_template.html");
$output = str_replace('{$hoge}', $hoge, $output);
>>echo $output;
と4行目を追加すれば置き換えられると思いますよ。
includeじゃだめなの?
<?php echo $hoge ?>
がめんどくさくないなら一番楽だと思うんだけど。
うわーすげえ文盲やっちまった。
377 :
nobodyさん:2006/02/23(木) 21:14:59 ID:81PJfTdI
Smartyって__toStringメソッドって実行してくれないの?
378 :
nobodyさん:2006/02/24(金) 16:34:08 ID:S8CqOJp1
・・・頼むから教えてよ。
380 :
377:2006/02/24(金) 16:56:42 ID:S8CqOJp1
テンプレートの方が便利なところはテンプレート使って、
後はこれでいいよね。
{include_php file="hoge.php"}
{section name=i loop=$hoge}
<li>{$hoge[i]}</li>
{/section}
この時に、if (i == count($hoge)) の場合に処理をしたいんですが、
どうすればいいですか?
{if $smarty.section.i.last}
smartyってポシャらないよね?
シャラポワ?
テンプレート内の{php}内にある $hogeに変数を渡せますか?
<h1>{$hoge}</h1> ←ここに入ってる$hogeを
{php}
sample($hoge); ←ここに入れたい
{/php}
{assign var="fuga" value=$hoge}
でいけない?
当てずっぽだけど、
sample($this->get_template_vars('hoge'));
とかどうだろ。
>>390 うわ!いけました!
ありがと!!!!!!!!!
これ便利ですね。
一方ではパフォーマンス落ちるとか、
フレームワークの方がいいとか言われてますが、
どう思いますか?
フレームワークとテンプレートエンジンは役割が違うくってよ
フレームワークを骨とすると、テンプレートエンジンは皮。
合わせるとスネ夫
PHPはのび太
ドラえもんは?
WEBサーバ
398 :
nobodyさん:2006/02/28(火) 13:11:01 ID:08x2mpcp
しずちゃんは?
399 :
nobodyさん:2006/02/28(火) 13:19:21 ID:0HF5o3Qs
荒川静香
旬だね
テンプレート自動生成のフレームワークとかあるのかな?
smarty覚えて損したかな??
だってさ、
やっとPHP覚えて、smarty覚えたんだけど・・・
フレームワークっつーのを知ってまたフレームワーク覚えなきゃなあ・・・
別に覚えなくちゃいけないもんじゃない
フレームワーク不要派もいるし
>>402 smartyを利用してるフレームワークはあるし
無駄にはならないと思うけど?
ってかSmartyって普通に使う分にはそんなに覚えることないし
すみません。フレームワークって何ですか?
おれがSmartyで使うものリスト:
基本的に {$var} {if} {foreach} {include} {cycle}
まれに {section} {assign} {strip}
あと修飾子 |default |nl2br |date_format
それ以外のことはだいたいPHPでやってる。
タグが混在しているhtmlをテンプレートにするのって大変ですよね。
{if} {/if}だらけになっちゃう。
どうしてますか?
> タグが混在しているhtml
とは?
410 :
nobodyさん:2006/03/01(水) 06:18:00 ID:BvRBPutv
セックスボムキタ━━━━━━━━(゚∀゚)━━━━━━━━!!!
>>409 要はテンプレートって事じゃないの?
>>408 俺はテンプレートを細分化して対応してるけど
412 :
408:2006/03/01(水) 20:02:59 ID:???
例えばこんなのです。
<h1>見出し</h1>
<p>あああ<span>いいい</span>ううう<p>
<h2>見出し</h2>
<p>ええええ<a href="hoge">おおお</a><p>
<hr>
<h3>見出し</h3>
<div>
<ul>
<li><a href="hoge">かかか</a></li>
<li><a href="hoge">ききき</a></li>
<li><a href="hoge">くくく</a></li>
<li><a href="hoge">けけけ</a></li>
<li><strong><a href="hoge">こここ</a></strong></li>
</ul>
</div>
ええええ
だけ四文字なのが気になる
414 :
408:2006/03/01(水) 20:11:28 ID:???
それで、a hrefがあったりなかったり、
strongがあったりなかったり、
ulだったりolだったり、h3があったりなかったり・・・
大変・・・
smartyで変数の計算はどう記述したらいいでしょうか。
具体的には
{$percent}%:残り{100 - $percent}%
$percentは80とすると
80%:残り20%
と表示したいのですが
実際は
80%:残り100%
となります。
それで行けたと思うけど
スペルミスしてない?
>415
半角スペース消せばいける気がする。
418 :
415:2006/03/02(木) 12:04:45 ID:???
>>416-417 {100-$percent}だと(実際は$result.percent)
Fatal error: Smarty error: [in TemplateName line 85]:
syntax error: unrecognized tag:
100-$result.percent (Smarty_Compiler.class.php, line 436)
in Path/to/Smarty.class.php on line 1095
となってしまいます。
{$result.percent - 100}だと$result.percentの値
{100 - $result.percent}だと100
となります。「tagじゃ無ぇ」と言われても…。
どうしたらよいのでしょうか。
>>418 式の左側がリテラル数値だと構文解析がうまく行かないみたいね。
100を一旦別の変数にアサインしておくとかしか思いつかない…
420 :
415:2006/03/02(木) 12:42:52 ID:???
>>419 別変数にアサインで解決しました。
半角スペースを使えないというのも勉強になりました。
ありがとうございました。
以前(100 - $percent)とかにしたら構文解析通ったような気がする
正確に書くと
{(100-$percent)}
>>422 それで試してみたんだがエラーになるんだよね。
{math equation="100-`$result.percent`"}
そこまでするとテンプレに記述する事じゃなくなってくる気がするw
426 :
nobodyさん:2006/03/03(金) 04:19:51 ID:iZN9RII3
Smartyって
同じテンプレートファイル名は使えないの?
複数のmoduleにIndex.tplを置いてるんだけど
コンパイルキャッシュがバッティング(一方のファイルがあれば、それを読んでしまう)
するようになった。
キャッシュファイルの先頭に付加される文字列って
ファイルの位置によって変えてるんじゃないのかなあ。
>>426 $smarty->compile_dirや$smarty->cache_dirをテンプレートファイルがあるディレクトリに応じて変えてやるしかない。
テンプレートファイルの置き場所を階層化する場合ある程度ラッパとか書くといいと思う。
>426
crc32()とか使ってるみたいだから、衝突する確率が
それほど高い訳でも無いと思うが、あり得なくは無いな。
反則かもしれんが、_get_auto_filename() をオーバーライドするとか。
テンプレートエンジン作ったけど、ここにさらすのが怖い。。
>>429 いいからさらせ
気が無いならこなくていいよ
>>408 スタイルシートを切り替えるという方法もある
>>428 以前俺も同じ問題ではまってたときファイル名かぶったら確実にバッティングしてた気がするけど気のせいかな?
つーかディレクトリ変えるのが一番楽だよ。
ファイル名がかぶってるってことは別のディレクトリにあるってことだから、そのtemplate_dirとcompile_dir・cach_dirに対応関係もたせりゃいいだけだし。
お好みでconfig_dirも合わせてやったり。
個人的にはconfigファイル使わないけどね。
パス含めてコンパイルファイル名決めればいいのに
>432
428だけど、よく見たら、crcの算出に使ってるファイル名には
template_dirの部分が入ってないみたいだから、
template_dir変えてcompile_dir変えないと確実に起きるのかもな。
ソース見た癖にいい加減な書き込みですまんかった。
同名だとバッティングすると思う。ソース読んでないけど、
実経験上。
俺はフレームワークなど使う場合は、moduleごとにcompileディレクトリ作成してるよ。
$compile_id使った記憶がある
template_dir/index.tpl とtemplate_dir/hoge/index.tplでも
バッティングするってことですか?
>>436 そんなのあるんだ。知らなかった。
>>437 template_dirが違ってても、compile_dirが同じならバッティングする、
と思ってたけど、
>>436でなんとかなるのかな?
調べてないからわからんけど。
template_dir/index.tpl
template_dir/hoge_index.tpl
これで解決するよね
440 :
436:2006/03/04(土) 01:19:29 ID:???
自分の場合mojaviだったから、Smarty::fetch()の第3引数にmodule名を渡してた
fetch()の第3引数がnullのときはSmarty::$compile_idが使われるみたい
441 :
426:2006/03/04(土) 05:03:02 ID:???
たくさん情報dクスです
$compile_idにmodule名をセットする方法でOKでした
>>433 俺もそうする方が自然だと思うなぁ
バカばっか
↑↑ ごめん誤爆orz
>>433 そりゃそうだけど、たぶんこの問題がおきるのはsmartyの初期化やdisplayメソッドを呼び出す部分を共通化して一箇所に集めた場合。
たとえばフレームワーク(必ずしもmojaviとか大げさなものでなくても単にアプリ全体の骨組みって意味で)を作るとこういう問題にぶちあたりうる。
いや、このスレの人はやさしいし、回答が的確だし、サマリーしてくれるし。
良スレです。お世話になってます。
defineで定義した定数をテンプレート内で読み込むにはどうしたらよいのでしょうか?
{literal} <?=DEFINED_VALID ?> {/literal} としてみても、
Smartyの構文解析回避するとPHPの構文解析も飛ばされるようで値が読み込めません。
やっぱ一個一個変数にassignしなおさなければならないのでしょうか?(;´Д`A
>>447 自己解決しました。
予約変数$smarty.constでした。
マニュアル百回読み直してきます…
Smartyで、数字に3桁ごとにカンマを入れる時、どうしてますか?
こういう作業は、テンプレートの仕事かなと思い、修正子を調べた
ところ、該当するのが見当たりませんでした。
結局、number_format 関数を通した値をテンプレートに渡す事に
したんですが、何か釈然としなくて・・・。
>>450 俺はそれでいいと思う。
テンプレートに突入する前にMVCモデルのViewでやると考えれば違和感ないと思うけどどうだろう?
453 :
450:2006/03/09(木) 16:09:48 ID:???
御回答ありがとうございます。
>>451 そういう見方も出来るんですが、時刻表示とかは修正子を使って、
数字にカンマを入れるときには上位でというのはバランスが悪いん
ですよね。
>>452 マニュアルの読み込みが足りませんでした。(^^;
これが決定打みたいですね。
ていうかregister_modifier()しなくても
PHP組み込みの関数はそのまま修飾子として使えるはずだけど
455 :
454:2006/03/09(木) 16:32:41 ID:???
修飾子じゃなくて修正子か・・・
456 :
450:2006/03/09(木) 18:20:16 ID:???
マニュアル読み直しました。
454さんが仰る通り、PHP組み込み関数は、そのまま使える様です。
お騒がせしました。
457 :
nobodyさん:2006/03/13(月) 02:48:18 ID:LxXJ5I4v
smartyに挑戦してみました。
乱数をassignしたのですが反映されません。
キャッシュしてるからというのはわかるんですがこれでは静的ページとなんら変わらないと思います。
実際に使用されてる方はどのように使ってるのでしょうか?
よろしくお願いします。
ブラウザのキャッシュじゃないの?
>457
そんなレベルの人間が使うライブラリじゃない。
おとなしく静的ページにしとけ。
461 :
nobodyさん:2006/03/13(月) 18:59:41 ID:vm5765Ln
SmartyをPHP5で使うときの
Strict Standardsエラーってどうしてますか?
開発中はE_STRICTを有効にしたいのですが
なにか回避策はないでしょうか?
462 :
461:2006/03/13(月) 19:19:07 ID:???
自己レスですみません
smartyのrequireのときだけ
一時的にエラーを無効にすることで回避できました
失礼しました
結局テンプレ導入する事で、MVCからVを分離してウェブプログラミングに専念するってのが思想?
とはいえHTMLの埋め込みタグはあんまりきれいじゃないし、デザには理解不能。
デザがHTML埋め込みでプログラミングもひっくるめてHTML記述の責任持てよ。
>>462 5.1.3 から "var $hoge" では Notice 出ないようになるみたい。(CVS の NEWS ファイルより)
?? Mar 2006, PHP 5.1.3RC2
- Removed the E_STRICT deprecation notice from "var". (Ilia)
smarty.class.phpでぐぐると、設定不良サイトいっぱい見つかる(w
466 :
457:2006/03/16(木) 02:50:57 ID:???
>>460 キャッシュ時間の設定とかだとユーザ毎に違う内容を表示させるなどの場合は毎回コンパイルをする事になりますよね?
それは嫌なのでinsert使って見たのですがとても使いづらいです。
毎回表示が変わるようなサイトには向かないんでしょうか。
ユーザ毎に違うデザインを使うのでテンプレートがあるのはとても良いのですが。。
>>466 「キャッシュ」と「テンプレートのコンパイル」を勘違いしていない?
>466
低脳ウゼェ、消えろ
>>463 素人考えでごめんだけど、いくらデザイナでも Java Script くら解るんだから、 Smarty の構文位何と無く解るんじゃない?
phpタグを使って最強テンプレート
毎回表示が変わるようなサイト自体がウェブに向いてない。
遅いじゃん。
>>471 宣伝ですか?
んなもん買わんでもマニュアルに書いてあるやん。
>>474 オンラインドキュメントじゃなくて、書籍になってることに
意義が有る場合もあるのよ。ただ買うだけで満足してしまう
問題があるがねw
>>475 山田祥寛本は「書籍になってる」という事実の価値はあるが
書籍自体の価値は...
印税欲しい関係者必死だな。
Smarty設置について教えてください。
test.php
├Smarty
├log┬templete [中にtest.tpl.html]
├templete_c
test.phpはこうなっています
define("SMARTY_DIR", "Smarty/");
require_once "Smarty/Smarty.class.php";
$smarty = new Smarty();
$smarty->templete_dir = "log/templetes";
$smarty->compile_dir = "log/templetes_c";
$smarty->assign("now_time", gmdate("Y:m:d H:i:s"));
$smarty->display("test.tpl.html");
ところが、次のようなエラーが出てしまいます。
Warning: Smarty error: unable to read resource: "test.tpl.html" in C:\MyWeb\web\php\script\blabla\Smarty\Smarty.class.php on line 1088
何が原因なのか教えていただけませんか?
define("SMARTY_DIR", "C:\MyWeb\web\php\script\blabla\Smarty\");
$smarty->templete_dir = SMARTY_DIR."log/templetes";
$smarty->compile_dir = SMARTY_DIR."log/templetes_c";
レスありがとうございます。以下のように変更しました。
define("SMARTY_DIR", 'C:\MyWeb\web\php\script\blabla\Smarty\\');
$smarty->templete_dir = SMARTY_DIR. "log/templetes";
$smarty->compile_dir = SMARTY_DIR. "log/templetes_c";
しかし、まだ同じエラーが出てしまいます…。
483 :
nobodyさん:2006/03/18(土) 20:52:33 ID:EsSA/NIp
>>482 test.php
<?php
require_once 'Smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->template_dir = dirname(__FILE__) . '/log/templates';
$smarty->compile_dir = dirname(__FILE__) . '/log/templates_c';
...........
$smarty->display('test.tpl.html');
?>
Smartyで、テンプレートファイルの代わりに
変数のに読み込んでおいた内容と使う方法ってあります?
同じ内容のテンプレートを場合によって微妙にパスとかを変えたいので…。
具体的には、本場用とプレビュー用のHTMLを大量生成したいので、
イチイチ1ファイルごとにテンプレートファイルを生成してやると、
速度的に問題があるので…。
>>483 !!!上手くいきました!
大変お恥ずかしいですが、template_dirがtemplete_dirになっていたようですorz
失礼しました
目的と言うか用途が読めない。
練習ならディレクトリごと変えてるでしょ。
>484
なにかSmartyの用途を誤解してないか?
テンプレートファイル自体を動的に生成する必要がある状況って
思い当たらないのだが。
flexyでキャッシュできますか?
できる
できない
491 :
nobodyさん:2006/03/25(土) 14:14:45 ID:RtAYAo7R
できる
492 :
nobodyさん:2006/03/25(土) 17:11:47 ID:WzKCkjot
HTML_Template_Sigmaで質問です。
あるブロックを任意の回数だけ繰り返し表示したいのですが、
例えば以下のようなブロックがある場合、どのメソッドを使えば
いいでしょうか?
ちなみにparseメソッドでは表示されませんでした。
<!-- BEGIN foo -->
テスト
<!-- END foo -->
できない
495 :
nobodyさん:2006/03/26(日) 01:09:55 ID:8F2N8by3
>>493 え?Sigmaってブロックの繰り返しとか分岐とかできないの?
>>494 Sigmaにforeachってメソッドがあるの?
それともPHPのforeachのこと?
できるとかできないとかじゃなくて教えてくれりゃーいいのにな。
性格悪いなおい。
なんで pear のドキュメントみねーんだ
>>499 とりあえず、死んどけ雑魚。
Sigma面倒だから自分で作った。
じゃーな雑魚ども。
まあ無料だしな。
詳細が知りたければ金払わないと。
>>500 雑魚ってあんまり使わない罵倒語だよね。
君はよく言われる状況なんだね(^^;がんばって生きてね(^^;;;;;;;;
このスレは荒らさないでください
>>502 日本語も分からないか?
雑魚ってお前みたいな奴のことを言うんだよ。
良かったな一つお利巧になれてw
この板自体荒れる運命にあるしな。
荒れてウザイから隔離板建てられてるし。
廚向けの言語を使う以上、ノイズが多いのは我慢してもらわないと。
すぐ荒れるしやっぱID欲しいよなぁ。
自治スレで議論してもつけてくれないとからしいけど・・・
教えてほしいときはうそでも教えてくださいって書くと良いですよ。
ウソはすぐに見破りますよ
しかし見破らせない
破瓜の血を流させてやる
むしろ見破れないだろ。だから荒れる。
正直者が馬鹿を見る
flexyでキャッシュホントにできますか?
できますん
出来ると思えば出来る。
出来ないと思うな、思えば負けよ
荒れるようなスレではないのになぁ。
だからこんなところで聞かずにドキュメント嫁
英語よめません><><><>
なんで英語?
日本語版あるのに。
日本語よめません><><><>
524 :
nobodyさん:2006/03/28(火) 12:05:09 ID:ct8TgCpW
Smarty使え
内容的には荒れる要素は無いけど、荒れるような廚が来やすい。
>>523 Cache_Liteなんかを使うのがFlexy流
って以前このスレで見た
> テンプレートのコンパイルは必要に応じて以下の場合にのみ実行されます。
> コンパイルされたファイルが存在しない
> テンプレートに変更が加えられており、コンパイルされたものより大きい
テンプレートに変更がない場合は既にコンパイルしたファイルを使うわけだからこれで十分じゃない
528 :
nobodyさん:2006/04/02(日) 21:51:22 ID:pQIOcBrE
Smartyでの配列の取得方法について教えて下さい。
ステータスには「0, 1...」のようなコードが入っています。
これをPHP側で設定したステータス用の文字列で展開して表示したいのです。
PHP側:
$id = array(0, 1, 2);
$code = array(1, 2, 0);
$status = array("0"=>"不明", "1"=>"未完了", "2"=>"完了");
$smarty->assign('ID', $id);
$smarty->assign('CODE', $code);
$smarty->assign('STATUS', $status);
テンプレート側:
{section name=i loop=$ID}
{$STATUS.$CODE[i]}
{/section}
このままだとIllegal offset typeというエラーが表示されてしまいます。
{assign var="tmp" value=$CODE[i]}
{$STATUS.$tmp}
こちらのように、一度変数に格納すると正常に表示されるのですが、あまりスマートではないので、1行で出力する方法は無いでしょうか?
>>528 {foreach from=$CODE item=c}
{$STATUS.c}
{/foreach}
でいいんじゃないの?
530 :
528:2006/04/04(火) 16:53:19 ID:???
>>529 ご回答どうもです。
サンプルには書いていないのですが、
同時に$ID[i]が使いたい場合もあるのです。
なのでsectionでなんとかできないでしょうか?
>>528 スマートにこだわるのなら
array(
array('id'=>0, 'status'=>1),
array('id'=>1, 'status'=>2),
...
)
みたいな配列にしてからassignした方がスマートじゃないかな
質問させてください。
次に示すような配列を返すようにSQLを発行し、変数$resultに格納しています。
その内容をsmartyのテンプレート内で、foreachで回しながら全件表示するようにしています。
このとき、$itemの中身が入っている場合(0以上の数値)のみ、チェックボックスにチェックを入れたいのですが、
どうやら「$item != ""」と「$item != 0」が同じような動きをしているために、
$itemに0が入っているレコードにはチェックがつかない状態になっています。
これをうまく表示させるにはどうしたらいいのでしょうか。
よろしくお願いします。
//$result
Array( [AAA]=>100 , [BBB]=> , [CCC]=> , [DDD]=> , [EEE]=>0 , [FFF]=> , [GGG]=>)
//smartyのテンプレート内における表示部分
<table>
{foreach from=$result key="key" item="item"}
<tr>
<td><input type="checkbox"{if $item != ""} checked{/if}>{$key}</td>
<td><input type="text" value="{if $item == ""}0{else}{$item}{/if}"></td>
</tr>
{/foreach}
</table>
下に求めている表示例と、現状の表示例を載せておきます。
//求めている表示結果(□:未チェック/■:チェック)
■AAA [ 100 ]
□BBB [ 0 ]
□CCC [ 0 ]
□DDD [ 0 ]
■EEE [ 0 ]
□FFF [ 0 ]
□GGG [ 0 ]
//現状
■AAA [ 100 ]
□BBB [ 0 ]
□CCC [ 0 ]
□DDD [ 0 ]
□EEE [ 0 ] ← チェックした状態にならない
□FFF [ 0 ]
□GGG [ 0 ]
>>532 <td><input type="checkbox"{if $item != ""||$item == "0"} checked{/if}>{$key}</td>
535 :
nobodyさん:2006/04/07(金) 12:10:04 ID:0TErvImy
ありがとうございます!!
無事に動きました!
携帯からでスマソorz
PHP関連スレにしては異常な伸びだなw
539 :
nobodyさん:2006/04/21(金) 07:18:24 ID:qi5wvjsu
>>536のフレームワークスレを読んでて何か書きたくて来ました。
他のテンプレートエンジンvsSmartyならたくさん議論出来ると思うのですが、
ライバルがhtml+phpなのがにんともかんとも。
みんなデザイナさんが書いたhtml+phpソースで鼻血出した事無いのかなー
540 :
nobodyさん:2006/04/21(金) 07:27:03 ID:G2Rp1nFE
>>536 Smartyなら鼻血ださないで済むの?
Flexyなら出さずに済みそうだけど。
>>539 > ライバルがhtml+phpなのがにんともかんとも。
Smartyが実際にそれと同様の結果をもたらしてるんだからしょうがない。
smartyは変に機能をつけすぎなんだよな。
もうちょっと使うべきものが制限されてたら端から高機能を求めようなんて思わないのに。
そもそも目的はViewを分離(=Viewに制限)することだし、すでに十分果たせてるわな。
>>542 別に高機能でもいいじゃん
使わないように制限すれば
544 :
542:2006/04/21(金) 14:04:57 ID:???
>>543 スマン勘違い。
smartyには表示と関係ない機能が無駄についてるのかと思ってたけど、よく調べてみたらどれも表示に関連する機能だった。
smartyのキャッシュに関して質問です。
DBに接続&データを取得し、それをsmartyにアサインして、表示させています。
$obj_smarty->diplay("hoge.tpl",$id);
が一番最後にあるため、せっかくのキャッシュデータがあるにもかかわらず、その前の時点でDB接続をしてしまいます。
表示されるデータは結局キャッシュされたものなんですが。
(コントローラの)ページの先頭で、すでにキャッシュが存在するかどうかのチェックして、
存在した場合は各種処理をスキップするには、どのようにしたら良いのでしょうか?
546 :
545:2006/04/25(火) 21:03:11 ID:???
is_cachedを発見しました。お騒がせしました。
別々のディレクトリに、内容の違う hoge.php があり、
それを一つの temolate_c に出力してしまうのはやっぱ問題ありますかね
>>547 別に構わないと思うけど「temolate_c」は止めた方がいいと思う。
549 :
547:2006/04/26(水) 18:34:41 ID:???
>>548 dクス
今タイポに気付いて一人で吹きました
Dreamweaver8で、Smartyのテンプレートをデザインしたいのですが、
テンプレート内で他のテンプレートをincludeすると、ちゃんと表示されない。
で、ここに辿り着いたのですが、
ttp://smarty.incutio.com/?page=SmartyDreamweaver 最初の方でデリミタを指定できるっぽいのですが、
"{{"、"}}"と指定しても、ちゃんとincludeしてくれない。
初期設定の"{"、"}"だとincludeしてくれるんだけど…。
この設定でデリミタを変更しても、ちゃんと動いている人いますか?
<{ }>ならどうでしょうか
552 :
550:2006/05/02(火) 00:57:53 ID:???
>>551 それも"<%"とかも駄目だったよ…。
Dreamweaver側の設定も何か必要なのかなぁ。
上のコード見ても、ただデミリタを置き換えてるだけっぽいんだけど。
553 :
550:2006/05/02(火) 01:00:41 ID:???
あ。ちなみにSmartyの方の設定が間違ってるとか、
デミリタとincludeの間に、スペースが入ってるとかではないです。
("{"、"}"だとちゃんとincludeされるし)
Smartyで {$data.日本語} っていうのは無理ですよね?
日本語文字列がキーになっているのを表示したいだけなんですけど。
代替方法として(実験中の断片コードしかなくてすみませんが)
次のようなものを考えました。
(もし日本語文字列が普通に使えるのなら無駄になっちゃうんですが・・・)
その1の案はプラグインを作らなくてもいいがテンプレートが冗長になる。
その2のコンパイラ関数の案はテンプレートが冗長にはならないが、修飾子が使えない。
その3のテンプレート関数の案は冗長にはならず修飾子が使えるが、
コンパイル後のコードがコンパイラ関数よりも無駄がある。
修飾子を使いたいので、その3の方法を採用しようと思っています。
もっと良い方法や間違い・勘違いがあったらコメントください。
555 :
つづき:2006/05/02(火) 16:47:03 ID:???
その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[ピリオドで区切った一つ目][ピリオドで区切った二つ目]・・・;
}
その他の案として、
日本語文字のキーを使わない。
日本語文字が使えるようにSmartyにパッチをあてる。
ってのがあると思いますが、今回はちょっとやめておきたいです。
(すでに日本語文字が使えるSmartyパッチがあれば話は別です)
とりあえず、その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;
}
?>
>>554 what internal/script encoding are you using ?
>>558 どういう意味ですか?
正規表現の\wに日本語はマッチしないから
エンコードとか関係ないはずですが?
560 :
株価【99】 :2006/05/03(水) 08:17:28 ID:??? BE:18617235-#
utf8をwordwrapしているのだが、9の倍数だと文字化けが起こらん
561 :
株価【99】 :2006/05/03(水) 09:13:11 ID:??? BE:49644285-#
とおもったら嘘でした。
チックショー!!!
ワロスwww
連想配列で場合によって存在したりしなかったりするキーに関連付けられている要素を出力すると
存在しない場合にエラーになってしまうのですが、
PHPでいうところの isset() のような条件判定で回避できたりしないでしょうか?
PHPを埋め込んで一応対処は出来ているんですが、
せっかくのテンプレートファイルにその箇所だけPHPコードが入ってしまうのがなんともすっきりしません。
めんどうだけど、
default
Smartyの関数でSwitch文はかけますか?
>>566 ifでいいやろ。switchが可能だったとして、手間も可読性もあまり変わるまい
smartyでincludeしたファイルに渡した変数の参照方法を教えて
$ほにゃららか 失礼しました
569だけど
{include file=xxx.tpl value=1}
{include file=xxx.tpl value=2}
{include file=xxx.tpl value=3}
としてもxxx.tplで$valueを参照すると最初の値(1)しか入ってこないのはなぜ?
>>571 compile_dir掃除 or 関連tplを全部保存し直してファイル更新日更新してみたら?
>>572 ミスって同じ値を渡してただけだった o.....rz
ごめんなさい
574 :
nobodyさん:2006/05/29(月) 22:44:38 ID:mZUygf+D
Smartyエラーが出て困っています。Smarty.class.php on line 1450 という感じです。
エラーを読んだ限りでは、ファイルのディレクトリが違うかファイルが存在していないといった
感じだったのですが、テストしたところ動作はしていました。
インクルードパスに原因があるのでしょうか、
ちゃんとSmartyのディレクトリを指定しています。
どなたかアドバイス頂ければな、と思います。お願いします。
エスパー様!エスパー様はいらっしゃいませんか?!
>>574 コンパイルディレクトリのパーミッション確認してみそ。
577 :
nobodyさん:2006/05/29(月) 23:31:22 ID:mZUygf+D
>>576 ありがとうございます。
でもローカルなんですけど、それでもパーミッションて関係あるんですかね。
ド素人ですいません。とにかく調べてみます。
ローカルって何? LAN?
パーミッション分かってない香具師がサイト作ってもソースコード抜かれたりデータ抜かれたりするのがヲチ。
個人情報扱うサイトだけは作らないでくれ。利用者が大迷惑。
ローカルの「windows PC」だからパーミッションが無い、ってな事を言いたいんじゃないかねぇ。
エラーの内容がテンプレートファイルが見つからんとかいうのだったら草植える(w
おいらも一回あったんだけど、ソースには「smarty.class.php」て書いてあるとか。
(頭文字が小文字)
fat32ならcase sensitiveじゃなかったっけ?
Smarty.class.phpの1450行目はコンパイルファイルの読み込みな訳だが。
エラーの内容は省略せずにお願いします。
質問者はエスパーを求めてるんだよ。
そしてエスパーは現れずに、質問者は途方に暮れてVBを使い始める。
register_functionsしていない関数がテンプレートで使えてしまうんですが、異常ですか?
間違えた、register_modifierしていない関数が修正子で使えてしまうんですが
文字列処理関数はデフォルトで使えるわけですが
function hoge(){
return 'hoge';
}
function askdjaocdma(){
return 'askdjaocdma';
}
適当に関数を書いて、登録しないで{$test|hoge|askdjaocdma}と使ってみると何でも使えてしまいます。。。
関数を削除すると、無いよーとエラーにはなります。
ちなみに、$plugins_dirは弄っておらず、$smarty->plugins_dirをechoすると「plugins」だけになっていて、
「plugins」というディレクトリにはhogeと定義した関数は入れていません。
よくわからんけど、単にインクルードとかしてんじゃないの
>よくわからんけど、単にインクルードとかしてんじゃないの
インクルードするだけで使えるの?
Flexyでメソッド使うとき、引数に文字列って使えないですか?
{method('hoge')}だとエラーになってしまいます。
配列に入れたりして、{method(a[hoge])}とかするしかないでしょうか。
すみません。よーくしらべたらリテラル使えって書いてありました
ちゃんと調べずに書いてごめんなしあ><
shinoげんきか
カイハツ日記さんのhtmltemplateのページ無くなっちゃった?
単純で分かりやすくて簡単に改造も出来るし速いしで結構愛用してたんだけどな・・・
可変変数やめて配列にすれば
$form.enq[$num].label
これで出来た気がするが。
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
なんかこういうの出てしまいました。
何か解決の糸口を教えていただけないでしょうか。
エラーメッセージを読め
以上
599です。
すみません。勘違いしてた。
includes\の中にはSmarty.Class.phpとSmarty_Compiler.class.php
しか入れてなくて、\includes\internals\なんて何処にあんだよ!!
って一人で吠えてました。入れりゃいいのね。
あーすっきり。
>>600 ありがとう!!「以上」って言葉でやっと気づいた。
ずっとPerlしかやってこなかったのに、いきなりPHPをやれと。
でもPHPってなかなか楽しそうですね。それに開発が早そう。
テンプレートの中で直接PHPを使うにはどういう風に書けばよいですか?
{<? urlencode($str) ?>}
ではエラーがでてしまいます。
できない?
直接PHPを"使わない"ために、テンプレートエンジンを利用する。
>>602 {$str|urlencode}
じゃあかんの?
php4じゃ使えないの?
>>603 柔軟さに欠ける言語は時として足かせにしかならない。
608 :
602:2006/07/25(火) 00:16:20 ID:???
できました。ありがとう。
通常、templatesフォルダ内にあるテンプレートを読み込んで表示していると思うんですが、
この場合呼び出す.phpファイルと階層が違うためCSSでデザインしにくいです。
何かいい方法ってあるんでしょうか?
hoge┬呼び出す.phpファイル
├cssフォルダ
└templatesフォルダ
として、templates内にあるHTML中では、
「<LINK REL="stylesheet" TYPE="text/css" HREF="./css/〜.css">」としておけばOKじゃない?
Smartyで途中でforeachのループから抜ける場合はどうしたらいいでしょうか。
自分なりに調べてみたんですが解らなかったです。。
それとも無理なんでしょうか。
>>612 {assign var="stop" value="0"}
{foreach}{if !$stop}
処理
{if ループ抜けたい}{assign var="stop" value="1"}{else}ループ抜けたくない{/if}
{/if}{/foreach}
こんな感じか?
Smartyに渡す前に整形しとくべきだとは思うけど
ClearSilverに興味あるんですがここはあんまり関係ないですか?
615 :
nobodyさん:2006/08/07(月) 21:34:55 ID:muOt4GfJ
【PHP】下らねぇ質問はここに書き込みやがれ 25
http://pc8.2ch.net/test/read.cgi/php/1153652403/ こちらから誘導されてきました。
鮎川寛さんの「 PHP 開発日誌 」ってサイト
どこに行ったかご存知ないですか?
そこで配布していた『HTML テンプレート』を
使いたいのですが見当たらなくて困ってます。
どこに移ったか知っている方、
もしくはPHP5 版『HTML テンプレート』を
再配布しているところを知っている方
教えてください。
617 :
615:2006/08/08(火) 20:55:09 ID:+NeExxFV
>>616 ありがとうございます!
これって PHP 5.01 版で止まってるんですね。
次のフレームワーク作るときには
別のテンプレートを採用することも考慮しないとな……
テンプレートへオブジェクト配列を渡した時に
○個目のオブジェクトのメソッドを指定する方法ってあるんでしょうか?
.php
$retarray = array();
while(fetch.....){
$o_work = new $obj;
$retarray[] = $o_work;
}
$smartyobj->assign("objs",$retarray);
テンプレート
{$objs[2]->get_hoge()}
(↑実際にはシンタックスエラーだけど、イメージはこんな感じです)
その方法でアクセスできるよ
620 :
nobodyさん:2006/08/09(水) 13:51:51 ID:z3PeQgxk
{$objs[2]->get_hoge()}
コレだと動きますね(汗
他オブジェクトメソッドの返り血を指定するとエラーになるようです↓うむむ・・
{$objA[$objB->get_hoge()]->get_hoge()}
>>620 そんなのはヘルパーメソッドを作成して、対応するしかないと思う
622 :
618:2006/08/09(水) 16:52:33 ID:???
>>621サン
レスありがとうございます。その方向で進めてみます。
しょーもない質問です。
PHP勉強しはじめたばかりの初心者なのですが、
皆さんのお勧めとかお気に入りのテンプレートエンジンって
ありますでしょうか?
例えば、
>>616のhtmltemplateとか、Smartyとか。
一通り片っ端から使ってみてレポート希望。
ぶっちゃけ作者が使いやすいと思って作った物に対して、どれだけ共感を感じるかじゃね?
どれも一長一短があるから、お勧めを聞いてもばらばらに
なるだけだと思う。
初心者というなら、
よほどのことがない限りは、どれを使っても大して変わらないと思うし。
>>623 最初は、機能がシンプルで、ソースコードを解析しやすい
>>616のHTMLtemplate for PHPを使ってみたらいかがですか?
どんな処理をしているのか、中身を分析すると、自作のテンプレートシステムも作れるようになりますね。
<着眼点>
・それを一つの足がかり=比較基準の材料として、SmartyなりFlexyなり、すでに作られている便利なやつを見ていけばよいのではないでしょうか?
・フレームワークを使う場合は、MVCのView部分と相性の良いテンプレートシステムがあるかも。
メニュー、サブメニュー、…と(操作が)階層式になってるページを画面遷移させるにはどんな構造がやりやすいでしょうか。
メニュー側のインクルードかなと考えたのですがテンプレートに余計な文字が付くのが気になり、
今は {if $inc1}{include file="$inc1"}{/if} として、includeされたテンプレートファイルでも再帰的に同様のことをしています。
セックルと同じで最初の女って重要だけどね。
最初に仕込まれた性癖ってなかなか抜けない。
きも
>>628 動物は、最初の刷り込みで、同じ事を繰り返す面があるね。
以前のものと、新しいものの「差異」を分析&比較する能力が乏しいから?
女(人間)は、プログラミング操作では作れない。
テンプレートは、プログラミング操作で作れる。自由度高し!
比較検証によって、最初のものに固執せず、常に改善していくことができると思うよ。
・Smartyがベストとは限らない。
・PHPがベストとは限らない。
保守から革新へ
(^^)/
最初にphpオナヌーを覚えてしまうと、phpオナヌーを猿の様に繰り返しちゃうよな。
今時テンプレートエンジンとか言ってるイモはどこのどいつですか?
Smartyで、テンプレファイルに
「府、本、旬」
という字があると、そこでエラーを吐いてしまうのですが、
似たような現象になった方はいらっしゃいますか?
その文字があるところでこんなんがでちゃう。
Fatal error: Smarty error: [in index.tpl line 14]: syntax error: unrecognized tag:
>>633 {literal}府、本、旬{/literal}
635 :
633:2006/08/15(火) 15:40:21 ID:???
> 634
ありがとうございます!
本とかは文字コードに中カッコが含まれてるということなんですね?
家まで行って感謝の意を伝えたいくらいです。
よこやりですが・・・
そういう文字って他に何があるんでしょう?
SJISの「表」とかとは少し違いますよね?
日本人なら $left_delimiter $right_delimiter を変更するのは基本だ
Shift_JISとかぶる
まぁ、テンプレートを Shift_JIS で書くとかしなければ良いのだけど
たまーにめんどくさいんだよね
自家製クラス作るのお勧め
>>637 携帯の絵文字を直接扱いたいとか言う状況でなければ、
Shift_JISを使わないようにするのがベスト。
もしくはinput_filterで内部エンコーディングにconvert_encoding。
Shift_JISである必要があるなら出力時に変換。
639 :
633:2006/08/15(火) 16:54:32 ID:???
なるほど〜
delimiterを {{ , }} にするようにしてみました。
携帯用とかShift_JISで出力しなきゃならない
んで、自分でテンプレート作る時は、当然EUCで書いてフィルターだ
けど・・metaタグがShift_JISで本当はEUCとか
デザイナーに説明するのめんどくさい
うむ
prefilter と outputfilter を使っているな
おそらく、結構重たい処理になっているだろうけど楽だし
そこまで、チューニングが必要なページあまりないしな
Smartyならprefilterは安定時には働かないからな。
sjisなんて使わなきゃいいのに。
8ビット時代の苦肉の策ですよ。
647 :
nobodyさん:2006/08/17(木) 12:14:02 ID:kr+Lut29
隠されたセクションを読む方法を教えてください。
common.confに
[.Database]
host=my.domain.com
と書いて、
PHPの中で
$smarty->config_load('common.conf', 'Database');
として読み込もうとしているのですが、どうも読み込んでくれません。
隠蔽セクション以外なら、読み込めるのですが・・・。
649 :
nobodyさん:2006/08/21(月) 14:55:34 ID:EaU1LrCO
携帯用コンテンツならUTF-8でいけね?
素人キャリアはまだsjisしか読めないからダメだよ
素人キャリアって何ですか?
素麺好きが使うキャリア
素人が使うキャリア
utfしかダメですってトップページに書いとけ。utfで(w
656 :
nobodyさん:2006/08/27(日) 20:59:35 ID:OoIUz1EV
Flexyについての質問です。
<script>
var hogehoge = "{hogehoge}";
</script>
のように、HTMLのスクリプトタグ内で変数を使おうとすると、「hogehoge = "{hogehoge}";」と
そのまま表示されてしまい、変数が展開されません。
設定オプションを見たのですが、それらしい設定は見つからず、
どうしれば置き返されるようになるかご存知の方教えてください。
なにとぞ、なにとぞよろしくお願いします。
それってphp使えてるの?
使えてます。他の部分は展開されてますし
もしかして、この現象自分だけなんでしょうか…?
varって宣言が明らかにだめでしょ
あとせめてlanguage属性入れておくれ
>>658 安心しろ。ウチの環境でもダメだったw
Flexyのソースは見ていないけど、scriptタグ内は無視している気がする。
気が向いたら、ソース見て究明してくれ。
>>659 この場合、varもlanguage属性は無関係では?
質問者がここに投稿する際に省略しただけかもしれないし。
<!---->コメントタグ内も無視されるみたい
scriptで変換されないのはちょっと困るね
省略しないで貼るか、ちゃんと自分で問題点切り分けして欲しいね。
あのぐらいなら普通に分かるだろ。
language属性入ろうがなかろうが同じみたいだし。
こんな記述見つけた。<script>タグは使うなということらしい。
--------------------
You can not use flexy tags {varname} in javascript blocks surrounded by <script></script>, as the whole thing gets too messy with it accidentally replacing stuff it shouldnt..
So if you need to send variables to javascript you can use
<flexy:toJavascript flexy:prefix="xxxxx_"
abc="xyz"
bcd="wxy"
/>
this is turned into php code that converts $object->xyz into xxxxx_abc in javascript
eg. in php
$this->xyz = 1234;
$this->wxy = "hello"
$flexy->outputObject($this);
using the above tags - it ends up at the browser as
<script language="javascript">
var abc = 1234;
var bcd="hello";
</script>
------------------------------
<flexy:toJavaScript>だとちょっと使いにくいと感じたので、flexyのタグ?に
{javascript:}〜{endscript:}というのを追加して、
コンパイル時に<script>タグに変換するようにしてみたら使えた。
もっと良い方法あるのかもしれんがわからん。
今まで タグのname属性に設定する値はPHPの定数を使っていたのですが、
Smartyを導入する場合、テンプレートにPHPの記述は普通しないですよね。
みなさんはname属性はどうやって設定していますか?
普通に文字列を設定すると、リクエストから取得する際に間違えるのが
だるいので、定数使っていたんですが。
↓こんな感じ
<input type="checkbox" name="<?=InputDto::CITY?>" >
{$smarty.const.HOGEHOGE}
単票フォームのビューアと編集画面を作らなきゃいけないんだけど、
ビューアと同じ出力場所にINPUTタグがつくだけなのに別テンプレートにしなきゃいけないの?
何かいい方法を><
668 :
nobodyさん:2006/09/26(火) 13:27:20 ID:??? BE:127685726-2BP(200)
freeze
>>667 ifで判断しちゃダメ?
{if $mode == "view"}
{$text}
{else}
<input type=text name=hogeoge value=$text>
{/if}
>>670 レスサンクス!
フィールドだけで50個くらい項目があるのでその方法は現実的じゃないかも><
>>671 入力と表示の時で、フォームのイベントにJavaScriptを書いて切り替えるのはどう?
ついでにCSSの属性書き換えれば、ラベルみたくできるんじゃないかな。
Web公開系だとダメかもしらんけど、業務系ぽいので許される気がする。
>>671 onLoadイベントとかで、フォーム内全体の入力オブジェクトに対して巡回して、
特定のID属性のものの属性を入力と表示で切り替えれば、
個々のフォーム入力要素についていちいち書かなくていいんじゃない?
って意味ね。
>>671 なにかプラグインを書くか
他のフレームワークを使う
freezeと書いてくれてたから何だろうと調べたら
HTML_QuickFormがまさに使えそうです。
Smarty+HTML_QuickFormで行こうと思います><
>>672 それも考えたんですが、もっとスマートに出来ないかと思いまして(汗
677 :
nobodyさん:2006/09/30(土) 23:32:17 ID:iHGhSOaN
文字コードで質問です。
php.iniの設定を
output_buffering = On
output_handler = mb_output_handler
default_charset = EUC-JP
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.substitute_character = Off
このようにして、テンプレート内で
{$data.birth|date_format:"%Y年%b月%d日"}
とすると月より後ろが
1950年1月%d日
1955年1月%d日?|
みたいに文字化けします。%dの前に半角スペースを入れると
1955年1月 14日K
と、日にちは出るのですが、日の後ろが変になります。
テンプレートもphpもeuc-jpで保存し、テンプレートのmetaタグも
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
としています。
date_formatを使っていない部分は文字化けしません。
mbstringの設定の組み合わせをいろいろ変えてみたのですが改善しません。
何かヒントをお願いしますOTZ
678 :
677:2006/10/01(日) 01:19:45 ID:F96v0AKS
ちなみに %Aで曜日を出したら(ロケールjpn)文字化けしました。
679 :
677:2006/10/01(日) 02:15:06 ID:???
げ!
phpで
print(strftime("%Y年%b月%d日"));
でも文字化けした。
Smarty関係ないじゃんOTZ
phpスレの方に行ってきます
お騒がせしました
smary の html_table で <td>中身</td> の中身を編集できるようなものってないんでしょうか?
$data = array( array( "1", "あ"), array("1", "い"), array ("2", "う"), array("2", "え" ) )
以下の用に、データのインデックス1と2をくっつけて表示させたいんですが
2x3テーブル (要素が足りない部分はスペースが代入される)
1あ 1い
2う 2え
space space
>>680 なにをしたいのか分からん
ちゃんとルールがあるならできるだろうが
PHP側で表示用にデータを加工するべきだと思う
自分でそういう関数でも作れって感じだな。
683 :
680:2006/10/02(月) 00:11:10 ID:???
拡張関数のblock で、foreachの item のような実装がしたいんですが、うまくできない;;
誰かやったことある人いますか?
{assign} を実行しているソースってどこにあるんですか?
みなさんtruncate関数って使ってます?
1バイト→2バイト文字に変換しないと化けて使いにくすぎるんですが
687 :
686:2006/10/03(火) 11:44:03 ID:???
って684さん見て気付いたけど、拡張関数ってやつで自作すりゃいいのか!
688 :
nobodyさん:2006/10/04(水) 18:30:02 ID:9Cwrgs3h
flexyの質問です。
$flexy->bufferedOutputObject()の返り値のテキストが、
<を<にしたりと特殊文字をHTML用にエンコードされたものになってしまいます。
http://pear.plus-server.net/package.html.html-template-flexy.html-template-flexy.bufferedoutputobject.html の
/* <tags をパースしないように regex コンパイラを使用する */
$template = new HTML_Template_Flexy( array(
'compiler' => 'Regex',
という部分がそれに対応するやり方のことなのかと思ったのですが、
この通りやっても変換されてしまいます。
('compiler'ってオプションの意味もいまいちわからなかったのですが)
やりたいことは、テンプレートを入れ子のような形で使いたく、
ベースとなるテンプレートを読み込み、その中でコンテンツのテンプレートを読み込みベースに挿入する、
といった感じです。
しかし、挿入された部分のタグの特殊記号が変換されてしまって参っています。
何かよい方法はないでしょうか。
宜しくお願いします。
689 :
688:2006/10/04(水) 18:32:48 ID:9Cwrgs3h
すいません ミスりました
3行目は
× <を<にしたりと特殊文字をHTML用にエンコードされたものになってしまいます。
○ <を<にしたりと特殊文字をHTML用にエンコードされたものになってしまいます。
です
>>687 組み込み関数はそのままでも呼べるけどね
>>688 bufferedOutputObjectの結果を$varに入れたとして、
{var:h}
では駄目?
または適当なElementのoverrideプロパティを利用するという手もあるが…
<div id="hoge" flexy:dynamic="yes">
この要素は別のテンプレートの内容で置換される
</div>
$elms = $outerFlexy->getElements();
$elms['hoge']->override = $innerFlexy->bufferedOutputObject($obj);
692 :
688:2006/10/04(水) 23:37:08 ID:???
>>691 ありがとうございます!
ご教示いただいたどちらの方法でもできました。
:hは恐らく基本的なことですね。勉強不足でした。
693 :
nobodyさん:2006/10/07(土) 00:03:58 ID:/6hITEc2
smartyでセッションの受け渡しってどうするのですか?
ゆうぱっくで
>>693 PHP標準のセッションなら通常通りに設定すれば通常通りに受け渡し可能。
漏れはいつもEMS使ってる。500円で送れるし。
セッションをudpで送るとルータに廃棄されてしまうことが有るので、tcpを指定して送れば良いよ。
tcpならルータが廃棄することは無く送れるから。
いやいや、tcpでも、mtu、mruが足りなくて捨てられる事あるよ
mtuは1500にしとけばどんな回線でも問題無く通るよ。ルータがちゃんとフラグメントしてくれるから問題無し。
pptp通す時は、1500じゃ多すぎるよ
って、ネタ無いのか!
VPNのルータがフラグメントしないのが悪い。
mtuの設定が間違ってる。1430ぐらいなのに1500で設定してるだろ?
703 :
nobodyさん:2006/11/03(金) 23:22:04 ID:N9Ney0mM
hoge.tplに多次元配列を渡して、配列内容を検索しヒットした内容のKEYを戻り値として、取得したいんだが…
PHPで言うところの、array_searchみたいなやつ。
何か方法ないかな? ボスケテ;;
>>703 だれが取得したいの?
テンプレートからテンプレートを呼ぶってことか?
705 :
nobodyさん:2006/11/04(土) 21:15:17 ID:+XTG9Sit
{foreach from=$list1 key=key item=value}
<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のインデクサを配列の添字として使用したい。
何かいい方法ないものかなぁ?
データ構造を見直してみるとか。
てか多次元配列じゃなくね?
前からたまにあがるけど、それ無理
ロジック側でなんとかしる
>>705 foreachのプロパティのiterationじゃダメなの?
{section name=cnt loop=$hoge}
{/section}
上記のような場合に
{section}間でcntに1加えた数字を使いたいと考えています。
どのようにすればいいでしょうか。
iteration
このぐらい理解できないと、クラの言ってる事理解できないぜ^^
Smartyって PHPで変数の有無をチェックするのに
if ($hoge){}
と書いてたように
{if $hoge}{/if}
って言う使い方は出来ないんですよね?
(やってみたらうまく動きませんでした)
わざわざ別の変数を用意して
{if $check_hoge == 1}{/if}
みたいにしないといけないんでしょうか??
{if isset($var)} ってできなかったっけ
717 :
714:2006/12/28(木) 14:04:09 ID:???
718 :
nobodyさん:2006/12/29(金) 17:59:05 ID:Oa9zj9TG
Smartyで{$obj->getObj->getName()}ってできる?
719 :
nobodyさん:2007/01/07(日) 17:56:17 ID:lgQgqthI
誰か答えてやれ
呼んだ?
テーブルの各行の中にチェックボックスを入れたいのですが
html_tableとhtml_checkboxesを組み合わせて使うようなことはできますか?
>>718 {$obj->getObj->getName()}はできない
>>683のURL先を参考に自作関数を入れようとしたのですが
スクリプトと同じ場所にコピーすれば実行できたんですが
この関数の名前のファイルを作ってpluginsフォルダに置いておけば
自動的に読み込んでくれたりできないんでしょうか?
今は置いたとしても
syntax error: block function 'html_table_block' is not implemented
とエラーが出てしまいます..
724 :
133:2007/01/12(金) 17:51:59 ID:???
特定の文字がHTML内にはいっているとエラーになるのですがこれは何なのか分かりますでしょうか?
Smarty error: [in hoge.html line 19]: syntax error: unrecognized tag: 投票
この場合、「投票」という文字を消すと動作します
0x5Bだと思うけど情報が少なすぎて原因は分からん
取り合えず{literal}{/literal}で囲めば逃げられると思う
726 :
nobodyさん:2007/01/12(金) 22:28:58 ID:3JXbZGmD
開始タグを2文字以上にする手もある。
開始タグを<!--{ 終了タグを }--> にするとか。
728 :
nobodyさん:2007/01/16(火) 11:38:11 ID:JtgOvcxU
XOOPSなんかはデリミタを <{ と }> にしてるみたいだね
俺もなんかあったら面倒なのでそうしてる
ところで Smartyで改行(nl)を無効にする命令ってないのかな?
ヘッダーのキーワードをページごとに変更できるように 変数を入れてSmartyの
Sectionで挿入しようとしたんだけど ソースが改行されて汚い
tplファイルを改行ナシにしたらいけるんだろうけど それだとファイル変更時
にわかりにくくなるしなぁ
>>728 $hoge|str_replace じゃあかんの?
730 :
728:2007/01/16(火) 15:27:15 ID:???
>>729 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>
731 :
728:2007/01/16(火) 15:27:49 ID:???
ってやってるんですが 出力されたHTMLのソースを見ると
<meta name="Keywords" content="…,…,…,…,
キーワード1
キーワード2
…
…,…" />
と改行されてしまうのが嫌だなと言うことです
テンプレートファイル中で改行してることから それが原因だろうとは思う
のですが 改行ナシにするとテンプレートファイルを見ると汚くなるので
それは避けたいです
(今後他人に仕事を振る可能性もあるし)
で テンプレートファイル中の改行を 出力するHTML上では無効にすることが
出来る命令があればなぁと思ったのです
textformatで出来るかな? と思ったけど無理っぽいし…orz
{strip}{/strip}
733 :
728:2007/01/17(水) 13:15:30 ID:???
>>732 ありがとうございます!! 出来ました!!!
っやっぱり暫定マニュアルだけではなく 書籍も買わないといけませんね…
キャッシュの有効期限を延ばすにはどうすればいい?
質問です。
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の設定で変更しなければいけない箇所があるのでしょうか?
>>735 ごめん、すでにあるキャッシュファイルの有効期限を延ばしたいんだ。
それを知りたい。
Smartyってファイル単位でキャッシュの有効期限制御していたっけ?
>>737 特に設定する必要はないと思うけど
Smarty.class.php の _compile_resource メソッドがどんな動きをしているか
見たほうがいいかも
smartyの
section内で$hoge[$foo]みたいなことしたいのですが、どのようにやれば出来ますでしょうか?
{section name="val" loop=$data}
{$hoge.$foo[val].name}
{/section}
でできませんでした…
>>738 キャッシのexpiresんとこのタイムスタンプ書き換えれば延ばせる
なぜそんなことがしたいのか分からないけど
HTML_Template_Flexyのテンプレートに
{hoge}
と書いたら、php側のhoge変数の中が展開されると思いますが、
これを、
{hoge}そのものを出力したい場合、テンプレートにどう書けばよいでしょうか?
\{hoge\}
とか
{{hoge}}
とか試してみたんですが、無理でした…。
?#123;hoge?#125;
とか
あら失敗
?は&ね
デリミタを変えたらダメなの?
>>744 {hoge}
と出すのは無理すかね?
なぜかというと、これをファイルに出力して、またFlexyのテンプレートとして食わせたいのです。
>>746 {hoge}
を、通常通り置換したい場合もあるので、デリミタそのものを変えるのではまずいのです。
お二人ともレスありがとう。
説明不足ごめんなさい。
748 :
nobodyさん:2007/01/18(木) 18:26:03 ID:u6x8DYYx
テンプレート中からPHP関数を利用して、
オブジェクトの生成をし、
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}
>>747 {ldelim}hoge{rdelim}
マニュアル嫁よ
>>748 > {php}$oHeadline=new Headline($oSmarty);$oHeadline->get_data();{/php}
new Headline($GLOBALS['oSmaert']);
ってするとどうだろう。
>>742 なるへそ。さんくし。
データの取得に失敗した場合に備えて、そうしようとしただけなんだに
753 :
748:2007/01/18(木) 20:03:22 ID:???
>>750 出来ました!
本当にありがとうございました。
755 :
743:2007/01/18(木) 20:33:24 ID:???
>>754 でも、まぁ意味はそういうことです。
Smartyでいうところのそれに当たるものが、HTML_Template_Flexyでありませんか?
ってのが聞きたかったんです。
なんか無さそうな雰囲気ですね…。
756 :
nobodyさん:2007/01/18(木) 20:59:51 ID:oKlCOyd1
{smarty_header http_equiv="Content-Type" content="text/html"}
<?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 '?>'; ?>
757 :
741:2007/01/18(木) 21:21:15 ID:???
やっぱりこんな複雑なことはできないのでしょうか??
お願いいたします
>>757 > {section name="val" loop=$data}
> {$hoge.$foo[val].name}
> {/section}
{$hoge[$foo[$val]].name}
でどぉだ。
>>749では完全に寝惚けてて、
>>750でもtypoしているグダグダな状態なんで
イマイチ思いだせんのだが、これでダメならバッククォートを使ったりかどうかで
出来たはず。
>>755 多分無理だと思う。メソッドを介した方が早いんじゃない?
function p($flexyVar) { return "{". $flexyVar ."}"; }
{p(#hoge#)}
{p(#hoge.bar:h#)}
##の中に#だけはどうやっても書けないから、
メソッド呼び出しを書きたいならもう少し工夫が要るけどね。
>>756 header();ってどこに書いてもよかったような気がするんだけど
1行目と2行目を入れ替えるのはだめ?
だめなら改行せずにxml宣言も1行目に書くか{strip}{/strip}
stripが誤作動するならliteralで
>>756 smarty の仕様だね
>>760も書いているけど、改行せずに1行に書くようにしないとだめっぽい
smartyの出力のときに自動的にサニタイズさせるにはどうすればいいですか?
助かりました、ありがとうございます。早速やってみます
>>763 再度で申し訳ありませんが、foreachを使っているせいか
Warning: htmlentities() expects parameter 1 to be string, array given
となって表示されませんでした・・・。
{$hoge}と出しているところだけエスケープしたいのですが、そういう方法はあるんでしょうか?
default_modifiersは配列でもオブジェクトでも何でもかんでも適用しようとするからイマイチ使えない
Smartyにサニタイズさせたいのなら普通に修正子を指定するか、nodefaultsを使うか
ソースいじってdefault_modifiersの挙動を変えるかしかないと思う
>>766 文字列ならエスケープ、配列なら無視する修正子をつくって指定するのがいいかと。
そもそもテンプレートにある要素全てを
自動でHTMLエスケープするってのは良くないような
必要ないもんにまでかけちゃうし無駄なオーバーへッドにもなるし
>>766-768 皆さんありがとうございます。
とりあえず自分で修正子作ってやってみます。
ちなみにこういった方法は一般的ではないんでしょうか?
Smartyを最近勉強しはじめました。
凄く単純な事ですが、いろいろ調べたのですが、どうしても実現できなくて質問させていただきます。
テンプレートから外部テンプレートを組み込む時に、
{include file="/root/dir/html/templates/XXXX.tpl"}
といった感じに記述しますが、この中で、変数を使いたいのです。
"/root/dir/html/templates/"の部分を変数に変えて、ディレクトリ構造を一元化して管理したいのです。
PHPの構造でいうと、"{$base_dir}/XXXX.tpl"と言った感じで、
ディレクトリ構造が変わっても、ファイルを直接弄ることなく、変更できるようにしたいのですが、やり方がわかりません。
つまり、呼び出し元のPHPプログラムで設定ファイルを読み込み、テンプレートの保存されているディレクトリ構造を読み取り、
それをテンプレートファイルに渡して、その渡した値を元に外部テンプレートを呼び出すようにしたいのです。
これを実現するには、どのように記述したらよろしいのでしょうか?
すみません。書き忘れました。
ディレクトリ構造の値は配列で渡したいのです。
$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
の環境で勉強しております。
dir.base
>>772 すみません。それでも同じエラーが出てしまいます。
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
774 :
nobodyさん:2007/01/22(月) 18:16:45 ID:Eh2tk1di
>>773 {include file="`$dir.base'/xxxxx.tpl"}
`(バッククォート)で $dir.base をくくらないと、どこまでが変数か
Smarty が解釈できなくなっている
{include file="`$dir.base`/xxxxx.tpl"}
おっと、間違えた。
後ろが`になっていなった
>>775 が正解だな
>>774 ありがとうございます。
無事、実行できました。
いろんなサイトを見て回ったのですが、バッククォートのことは初めて知りました。
本当に勉強になりました。ありがとうございました。
>>779 すみません。。。お返しする言葉もございません。
そのマニュアルも一応目を通したつもりでいたんですが、、、
日々精進していきます。
なんかくだらねぇ質問スレでやたらSmartyを押している奴がいるから、
このスレにPHPのイロハも知らないバカが押し寄せてくる悪寒が…
(略
デザイナーがSmartyのtplを大量に作り上げてくれたんですが、
こういう場合でフォーム系のタグに変数埋める作業でもやはりシコシコと手作業するしかないんでしょうか。
宜しくお願い致します。
>>783 You, Flexy 使っちゃいなよ。
smartyで
{$hoge[$foo->getId()]}
とやると
syntax error: unrecognized tag:
が出るのですが,このようにやりたい場合はどうすればいいでしょうか?
787 :
nobodyさん:2007/01/26(金) 20:10:51 ID:iZlZkVla
お願いします
788 :
nobodyさん:2007/01/27(土) 10:35:51 ID:e0oRsoDR
idをassignしちゃえば?
まんどくせえけど
>>770と全く同じことで悩んでました
バックスラッシュは試したんだけど $`hogehoge`と囲ってたのでエラーでした
まさか`$hogehoge`とするとは… PHPでは${hogehoge}なのに…
>>770とそれに回答していただいた皆さんに感謝です
790 :
789:2007/02/02(金) 12:16:25 ID:???
×バックスラッシュ
○バッククォート
…なんて勘違いを…アホですいません
smartyでswitch文って使えないんですか?
{if}{elseif}でつなげばええんちゃうん。
プラグイン書けば使える
PHPのコードをベタ書きすれば使える
なるべくロジックをテンプレートに入れないように
処理を変える方がいいと思うけどな
うむ、テンプレート側でにswitchがどうしてもないと困るような状況なら
それはロジック側や構成を見直した方が良いっていう警告
じゃあユーザ種別で表示するメニューを変更させる場合は、どこで分岐するのがいいんでしょうか?
そのユーザ種別であらかじめメニュー部分の
テンプレートパーツ名を決めて、メインのレイアウトテンプレートから
includeするファイルを変えるとか色々方法あるんじゃない?
ユーザ種別メニューアイテムをコントローラから押し込むか、
モデルから引っ張ってくるかのどちらかじゃね。
ビューで切り替えるもんじゃないような気がするが。
798 :
nobodyさん:2007/02/06(火) 20:28:11 ID:adz0uOuq
質問です。phpBB2が使用しているフレームワークってなんていうフレームワークなんでしょうか?
いま、phpBBのソースコードを解読・勉強していて疑問になりました。
>>798 独自じゃないの
ネタとしてはスレ違いだよ
800 :
nobodyさん:2007/02/15(木) 19:29:02 ID:t/XW6gI0
smartyでの演算時に、計算を優先する括弧ってどう書けばいいのかな?
(3 + 2) * 5
みたいな感じなんだけど。
`(3 + 2) * 5`でできない?
802 :
nobodyさん:2007/02/16(金) 10:58:20 ID:qBGQeHi7
>>801 それがうまくいかないんですよね。
{if '($smarty.foreach.loopname.iteration-9)%3'==0}
こんな感じで処理を行いたいんのですが。
804 :
800:2007/02/16(金) 11:16:20 ID:qBGQeHi7
よくわからないけど、いろいろやって、以下のやり方で出来ました。
{if ($smarty.foreach.hobbyloop.iteration-9)%3==0}
自分の勘違いだったぽい。レスサンクスでしたー。
煽りじゃなくて、Smarty勉強してて思ったんだけど、
テンプレートファイルに
{if $item <0} 〜HTML〜 {/if}
って書くのと
<?php if($item <0 ){ ?>
〜HTML〜
<?}?>
って書くのと、基本的にテンプレートの中身は変わらない事無いか?
WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離
しようと思ってたんだけど、テンプレートにSmartyのソースが入るんだから
やっぱり、PHPの知識がいるわけで、普通にPHPのソース書くのと違わない
気がするんだけどな・・・。他にメリットある?
>>805 >WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離しようと思ってたんだけど
もうわかっただろ?それをやるにはSmartyだけじゃ無理だって事だ。
俺は表側っつかwebのツラのほうを作る側だから、php系のサイトで
うっかりロジック部分を触って壊したりしないかと常々おびえてて、
そんでsmartyの勉強始めたとこです。
今は1by1の分業体制だけど、これから人増やす可能性も高いので
コード側やってる相方さんも、自分がざっくりphpでプロト書いて
俺にデザインをつけさせる、という路線だとメンテ性とか可読性の面で
もう限界だと思っているみたい。
逆に言えばそういうコラボ体制とかでなければ、php直書きのほうが
効率いいのかもしれないなあ。
808 :
805:2007/02/22(木) 22:45:21 ID:???
>>807 デザ側の立場として質問なんだが、
>うっかりロジック部分を触って壊したりしないかと常々おびえてて、
って書いてるけど、現在は勉強してある程度PHP使えるようになったの?
それとも、完全にソースの部分は触らないようにしてるの?
だいたい、テンプレートと言ってもヘッダーとフッターを分けてincludeする
ようにしている場合が多いし、そんなんじゃ、Dreamweaverでも編集しづらいし、
デザ側のメリット無いと思うんだよな。
他スレとかでやたらこういう話が出てきたり、オブジェクト指向とか言われるけど、
それが他の人間と共同作業する上で、本当に役立つのか疑問に思えるんだよ。
もちろん、出来て困らないだろうけど、807のように、スキルを学ぶ必要あるしさ。
>>808 一応変数追っかけてデバッグとか、DB自体のフィールドを増やさないような
簡単な書き足しぐらいはしてます。でも、やっぱりphpのソースのなかに
丸裸でいろんなものが散らばってるのは神経使います。冒頭に分離されてるなら
まだマシだけど、if文で配列をあるだけテーブル化して表示、みたいな奴だと、
html部のど真ん中に来ちゃいますし。
トラブルが起きたときにどっちが悪さしたのかわかりにくいし、片方が
(他人もDWで編集していることを前提にコラボ系機能が作り込まれている)
DWで、もう片方がテキストエディタで「同じファイルを」いじる、というのも、
作業的にはちと筋が悪いと思ってます。
includeは積極的に使っていきたい仕掛けではありますが、確かに
CSSベースでもテーブルベースでもDWでの編集が困難になるのですよね。
「head部はinclude・その他はDWのライブラリ」というスタンスの方が
web系の人員を増員する方針で考えるなら、むしろ好ましいのかな。
ロジックとデザインの分離は、現実的な問題として *完全には* 無理だと思うな。
でも、テンプレートタグはHTMLデザイナ向けに簡単な設計となっているはずだから
PHPコードをベタ書きするよりはマシかなって。
>>809 なるほど。ま、やっぱりデザイナー側も勉強する必要はあるって事だな。
>>810 >>805のようなソースの場合、べた書きするのと、{}で囲ってsmarty方式に
するのと、違いがあんまり無いと思うんだよな。
まぁ、forearchとかsmarty方式の方がソースは短くなるけどさ。
>>805 そうそうあんまり変わらないと思う。むしろ「 { 」入れてエラー出て困ってたデザイナさんも居た。
でもhtmlソースに出ない{* 〜 *}形式のコメントは活用できると思う。
813 :
nobodyさん:2007/02/23(金) 01:15:09 ID:CtBpLmme
HTMLをプログラマーの物にすればいいんじゃね?
>>805 うちの場合ケースバイケースだけど
表示するか否かというフラグを渡しておいて
{if $hasItem}表示内容{/if}
と出来るようにしたり
条件が複雑だったりよく使うような物だったら
ブロック関数作って
{logined}
ログイン時用の表示
{/logined}
みたいに出来るだけ単純に書けるようにしてるよ
オーサリングツールとの連携は難しいね
Flexyとかだとなんとかなるのかなと思うけど
Smartyは、他のテンプレートエンジンに比べると
何倍も遅いって聞くんだけど、そんなに大きな差があるの?
817 :
nobodyさん:2007/02/23(金) 15:03:37 ID:CtBpLmme
>>815 我慢できなきゃ、Zend Optimizer入れれば。
smartyのテンプレートのHTTPヘッダを変えることはできないのでしょうか?
テンプレートでCSVファイルを作り、それをダウンロードさせるようなことがしたいのです。
少し上の方に書いてあったsmarty_headerという関数をテンプレートに埋込んでみたのですが、
エラーが発生(関数が存在しない)し、使うことができませんでした。
>>818 >エラーが発生(関数が存在しない)し、使うことができませんでした。
プラグイン関数用ディレクトリのパスが通ってないだけだろ。
smarty_header なんてなかったと思うぞ
上のやつは自分で作ったプラグイン例としてsmarty_headerって
書いていたと思う
822 :
756:2007/02/26(月) 12:08:17 ID:???
>>818 とてもシンプルなプラグイン:
{smarty_header http_equiv="Content-Type" content="application/octet-stream"}
{smarty_header http_equiv="Content-Disposition" content="attachment; filename=myfile.csv"}
私が定義した関数です。
plugin/function.smarty_header.php
function smarty_function_smarty_header($params)
{
header("{$params[http_equiv]}: {$params[content]}");
}
823 :
818:2007/02/27(火) 02:39:59 ID:???
プラグインのソース、ありがとうございます。
ですが作成されたファイルの内容がブラウザに表示されるだけで、ダウンロードのダイアログは表示されませんでした。
エラー文言ですが、
Warning: Cannot modify header information - headers already sent by 〜
と表示されます。
エラー文言が表示されることで既にHTTPヘッダが出力されてしまったのかもしれないとおもい
php.iniのdisplay_errorsをOffに倒して実行してみましたが、変わりませんでした。
やはり無理なのでしょうか。
825 :
756:2007/02/27(火) 07:35:44 ID:???
>>823 {smarty_header ...} は文字を出力する前に呼び出さなくちゃだめだよ。
> 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは
> PHP からの出力にかかわらず、すべての実際の出力の前にコールする必要があることです。
> 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
> 空白または空行があり、header() の前に出力が行われてしまうというものがあります。
> 同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
826 :
818:2007/02/27(火) 23:11:30 ID:???
>>824 >>825 ありがとうございます。
>頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
まさにこれでした。
824さんが提示してくださったページは知っていたのですが、理解していませんでした。
あと皆さん、smartyとは関係のない質問をしてしまい済みませんでした。
そういえば以前、未踏で完全分離を目指したテンプレートエンジン作ってたよな。
デザインの分離を考えるとFlexyはよく出来てると思う。
ただ、痒い所に手が届かないが。
>>827 そこの人、日本人だから以前は日本語のドキュメントもあったぞ。
今は無いみたいだが。
一年前使ってみた感想は、時期尚早って感じだったかな。
メインはrubyみたいで、phpのサポは片手間って感じ。
ドキュメントに書いてあるのに実装してない構文とかも確かあったし。
(and preg_matchの配列の渡し方を間違えて、毎回初期化してるんで動かなかったりしたのを修正したのを覚えてる。)
>>830 Flexyは結構面白いんだが、「構文解析が出来る」ものだから、かなり無茶な構文を定義しているような感じがする。
以前いじった時は、スタイルシートで{hoge:fuga}のように最後のセミコロンを省略したりした場合、
Flexyのプラグインを見に行ったような・・・
これまた1〜2年前にいじったきりなんだが修正されたのかな?
よくありがちな、こういう形のページを作るとき
みなさんははどのように作ってますか?
(仮にSmarty使用として)
1. 各コンテンツ.tplから、ヘッダ、フッタ、ナビをconfigから置換。
2. 各コンテンツ.tplから、ヘッダ.tpl、フッタ.tpl、ナビ.tplを読込み。
3. 全体デザイン.tplから、ナビ.tplとコンテンツ.tplを読込み。
4. 全体デザイン.tplから、コンテンツ.tplを読込み、
コンテンツ.tpl内でさらにナビ.tplを読込み。
┌─────────────┐
│ ヘッダ(静的) │
│┌─┐┌────────┐│
││ナ││ ページごとの ││
││ビ││ コンテンツ(動的) ││
││ ││ ││
││静││ ││
││的││ ││
│└─┘└────────┘│
│ フッタ(静的) │
└─────────────┘
私は全体のデザインを作ってしまって、
中身だけ入れ換える方式(上記3、4)が好きなのですが、
デザイナーにとっては、ファイル構成が直感的で
無くなるような気もします。
みなさんはどうしてるか参考までに聞かせてください。
>>832 ナビの部分はコンテンツごとに切り替えることがあるので、おれは3で。
まあ普通3だわな
デザイナーはhtmlベースな状態で管理を行って
デザインに更新があったらその都度プログラマが
変更点を確認して実際のテンプレートファイルに
手を加えるってのが一般的なんじゃないの
直感的なファイル構成にこだわる必要なんて無いと思うぜ
3,4の中身入れ替えって
全体デザイン.tpl に読み込む中身.tpl を選択する
分岐入れるってこと?
俺は良く2のパターンで作るなぁ。
デザイナさんに各ページをHTMLで作ってもらって
基本的にはそれを.tplに置き換えてから手を加える感じ。
>>832 俺はナビ部分が完全静的の場合なら、1をよくやるな。
正確に言えば、全体デザイン.tplからヘッダ・フッタ・ナビを完全固定状態で…って感じだけどな。
でも、ナビも動的にする場合がおおいので、結果として、3みたいな感じになることがおおい。
3の場合ってつまり
各コンテンツ.php内でコンテンツtpl名を変数に割り当てindex.tplを読み込み
index.tpl内で静的なヘッダ・フッタ+動的なコンテンツtplを読み込み
って感じ?(ナビ略)
838 :
nobodyさん:2007/03/06(火) 12:16:59 ID:25mpWck5
括弧の中を先に計算させたくて、以下のようにしたら...:
{section ... start=`($foo.bar-1)*($smarty.const.CONSTANT)` ...}
このようなエラーが出ました:
Fatal error: Smarty error: syntax error: $smarty. is an unknown reference
これはどうしたらよいのでしょうか?
839 :
838:2007/03/06(火) 12:36:12 ID:25mpWck5
計算を優先させる括弧は、{math}でなら使えるみたいだけど、「効率が
悪いので、スクリプト側で計算させてテンプレートに振り分ける方が良い」という
ことが書いてあったのでそうします。
>>835 私の場合は、各アクションの最後にどのコンテンツtplを使用するか送るようにしてる
メニューの部分は、全アクションに継承されたクラスのコンストラクタか、
アクション終わってからセットかな。もしくはtplから直読み。
ちなみに、
>>837の言っている通り、全体デザインtplに送るのは決定されたテンプレート名だけの変数で
読み込む場合は{include file=$contpl}って感じね。
>>832です。
>>833-837,840-842
ありがとうございます。
デザイナ側からの視点だとまた違うんでしょうが、
プログラマ側からでは、3が多数という感じですね。
普段こういった事を同業に聞くこともないので
面白かったです。
3、4の全体ページってもしヘッダでちょろっと変更があったら
ほぼ全部のテンプレートを変更しなきゃいかんよね?
(DWのテンプレ機能とかはおいといて)
文章が分かりづらくてスマソ…。
なんで?
>>844 んなわきゃない
ヘッダやフッタに変更があってもレイアウトテンプレートを修正するだけだ
どう勘違いしてるんだ?
>>844 何が言いたいのかさっぱりわからない
全体ページは共通だろ
848 :
844:2007/03/09(金) 16:44:05 ID:???
スマンです。頭が悪くて把握できていないんですが、
まず全体ページ(例:all.tpl)を呼んで、その全体ページ(all.tpl)のなかで{include 各コンテンツ}を
呼ぶってことでしょうか?
そうそう
851 :
844:2007/03/09(金) 17:32:37 ID:???
852 :
nobodyさん:2007/03/10(土) 10:44:25 ID:GgSEfqVF
smartyで可変変数って使うことができないのでしょうか?
{${$loop[loop].name}}
{$$loop[loop].name}
という2つはエラーになりました。
{$loop[`$hoge`].name} で出来なかったっけ
最近Smarty使ってねえから間違ってたらすまんな
854 :
852:2007/03/10(土) 11:44:36 ID:GgSEfqVF
>>853 ありがとうございます。
しかしちょっとそのやり方がわからないです。
具体的には
$loop[0]['name'] = "a40";
$loop[1]['name'] = "a43";
$loop[2]['name'] = "a58";
のように数字が続いています。
で、sectionの中で
{$a43}や{$a58}などの変数を呼び出したいのですが、どうもうまくいきません。
section が複雑にネストしてるので配列で渡すのはちょっと無理っぽいので、可変変数でなんとかしようと思った次第です。
テンプレートの if 文中で
{$var}.cde
という文字列を使いたいのですが、どのように記述すればいいでしょうか?
{if $var.cde == .....
では$varの配列とみなされてしまうようです。
856 :
855:2007/03/10(土) 11:49:03 ID:???
すいません、、、、
smartyです。
>>854 そういうことか。無理なんじゃないかな。
定数値であれば、$smarty.const.$hoge で取れるんだが、
そんな方法で変数参照出来たら、逆に危なくて仕方ないしな。
設計から見直したまえ。
>>855 // $smarty->assign('var', 'ab');
{assign var="str" value=$var|cat:"cde"}
{if $str == "abcde"}ok{/if}
859 :
nobodyさん:2007/03/13(火) 22:56:37 ID:QJkFtOhT
{$smarty.session.id}でセッションIDが表示されるはずだよな?
なんで、俺だけ出ないのか教えてくれ。
セッションを開始していない
ずっと俺のターン
phpとDBがutf8で、実行の際にoutputハンドラでsjisにして出力してます。
smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
smartyのautoload_filtersで、sjisテンプレをコンパイル時にutf8変換してます。
php(utf8) ← DB(utf8)
↓
smartyテンプレ(sjis) → smartyコンパイル(utf8) → 画面出力(sjis)
このように、すごーく無駄な文字コード変換が2回も入ってしまいます。
なんか他にいい方法ないでしょうか?
863 :
nobodyさん:2007/03/18(日) 02:43:21 ID:CdbythRU
>>862 assign時にShift_JISに変換すればいいと思う。
php(utf8) ← DB(utf8)
↓
assign
↓to sjis
smartyテンプレ(sjis) → smartyコンパイル(sjis) → 画面出力(sjis)
Smartyの仕組みは知らないけど、assign時にコールバック処理を入れられるな
らそれを使えばいいし、無ければSmartyのラッパークラスを用意すればいい。
>>862 デザイナ殴ってでもutf8に変更させる。
DWの設定ってそんなメンドかったっけ?
頻繁に更新するものじゃなかったら、
>>862さんがutf8にコンバートするとか。
DWの設定でエンコード決められてどうするんだよw
往復ビンタしてから
男から殴れ女なら犯せ
結局無駄な処理が入る事になるから
>>864の通りデザイナにUTF8で書いてもらうのが一番良い。
デザイナがだめならクライアントかディレクターあたりに「余計なコストがかかる事になりますが…」
とか言ってデザイナがUTF8で書かざる終えないようにがんばれ。
終えない→おえない
落ち着け
文字コードって最大最悪のバッドノウハウやね。
これがある日本はハンデやで。
Smartyなら
smartyテンプレ(sjis) → smartyコンパイル(utf8)
はテンプレートが更新された後の初回アクセスだけですむから大した負荷にはならないだろ。
>>865 文字コードの設定なんて数秒で変更できる。
みなさんフレームワークは何使ってるんですか?
>>862 >smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
>「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
ええーっ
とりあえずおまいさんが『Dreamweaver 文字コード』でぐぐって、DWの設定を教えてあげればいいじゃない。
つかその程度のこともできないデザイナなんか切れ。
実際にSmarty使っているプログラマーって少ないみたいだな。
>>876 使ってるけど機能のほんの一部しか活用してないwww
>>876 はてなで見たけど、オープンソースを改造するのが
一番多いって…
>>876 自在にSmartyを使えるようになる頃には、自分で template 作れるようになる。
で、その頃になると、Smartyに粗が見え出すんだ。
まぁ、という訳で自作テンプレート使ってる。
880 :
nobodyさん:2007/03/21(水) 20:52:08 ID:NvhysGYm
>>879 どう考えても、Smartyの方が優れてそうだけどなw
>>880 まぁ、その通りだ。
だが、smartyはでかいし機能がありすぎる問題がある。
下手に機能があると、テンプレートに頼りすぎて、どこまでがviewか?とかが崩れるんだ。
シンプルな方が楽だし早いんだよ。
Smartyの余計な文法と微妙な制限を入れるよりも、
PHPでやったほうがわかりやすい。
883 :
nobodyさん:2007/03/22(木) 14:34:43 ID:jPF/zj00
データつかませて吐くだけだからな。
プラグイン機能とかキャッシュとか使ってないの?
>>884 実稼働した後なら
一番使ってるのは
キャッシュかもしんないwww
886 :
nobodyさん:2007/03/22(木) 17:40:02 ID:9EeeeROG
Smartyのキャッシュほどありがたいものはないだろ。
キャッシュ機能ってどういうの?
>>882 はげどう
PHPよりSmartyのほうが使いづらいし貧弱
>>887 DBに接続してデータとって来るような場合
キャッシュがあればDBいかないで表示したり。
テンプレート内のカウンタとか一部のプラグイン部分だけはキャッシュじゃなくて動的にしたい
とかも出来るから結構便利よ。
890 :
nobodyさん:2007/03/23(金) 01:25:37 ID:wrH2dhw4
INSERTプラグインは好きだよ。
>>889 それってどういう仕組みなの?セッションやクッキー使って
DB内のカウント値を保存してるんじゃないよね?
893 :
nobodyさん:2007/03/23(金) 14:57:53 ID:wrH2dhw4
DBの接続コストを減らせるのだ。
この場合、キャッシュのキーになるのはURLなの?
もしそうなら、ページ全体のキャッシュはできても部分キャッシュはできないということ?
>>895 キャッシュのキーはテンプレートのパスとdisplay関数やfetch関数の第2引数として指定できるキャッシュID
マニュアル嫁と。
Smarty使っている有名なオープンソースってある?
898 :
nobodyさん:2007/03/25(日) 04:42:25 ID:UfKh4Z0S
>>876 新規で受注したPHP案件は無理やりでも導入してるぜ
改造案件で昔の担当したアホがスパゲティってるときだけ使わん。
$arr = array("hoge"=>array(0,1,2,3));
{foreach from=$arr item=item key=key}
{$item.hoge|@count}
{/foreach}
連想配列の要素数は上記で取得出来るのですが、要素数を交えた演算が出来ずに困ってます・・・
感覚的に
{$item.hoge|@count * 4 + 1}
というような書き方をしたいのですが・・・どうかお助けください
すみません、上げさせて頂きます
多分、Smarty の話だと思うが、それは無理だったはず
math ならいけるね
すばらしい・・・一つ勉強になりました、ありがとうございました
$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}
つながる
908 :
nobodyさん:2007/04/05(木) 22:15:57 ID:Wh1vrSjM
{literal}〜{/literal}で囲った場所がごっそり消えてしまうのですが
同じ様な事を経験した方っていますかね?
コンパイル済みのファイルの時点でなくなってる感じです。
ちなみにSmartyのバージョンは2.6.6です。
ないですね
俺もないな
911 :
908:2007/04/06(金) 18:35:57 ID:???
>>909 >>910 そうですかぁ・・・。
ちなみに他のサーバーで実行すると{literal}〜{/literal}の中身は表示されます。
php.iniとか環境の違いでsmartyの挙動って変わるんですかね?
そりゃ変わるだろうね
913 :
nobodyさん:2007/04/07(土) 16:48:58 ID:mKHEPGiv
最近はじめたんだけど、smartyの関数とか書式を覚えるとかが
結構メンドクサイねw
バシバシ実用してる人、みんなはそのメンドクサさを乗り越えた甲斐があった?
圧倒的に効率的?
というかめんどくささを解消するためのものではないし
smartyの最小構成を教えてください。
使いたいSmarty変数は
assign display include sectionです。
>>913 デザイナが構文覚えるのは多少苦労すると思うけど
殆ど一般的な式だから、プログラミングやった事があるならすぐに飲み込めると思うが。
むしろ、Switchつかいてぇ・・ぐらい思うんじゃねw
>>915 意味分からないけどとりあえず
require('Smarty/Smarty.class.php');
>>915 smarty.class.phpだけ置いて実行して
無いと怒られたものを入れていけばおk
919 :
nobodyさん:2007/04/07(土) 19:00:45 ID:1Ng7rNgy
テンプレートに渡した連想配列の添字が例えば
$params['e-mail']
だったとき、どのようにすれば表示できるのでしょうか?
{$params.e-mail}
だと、$params.eマイナスmailと解釈されるのか解りませんが、’0’になります。
920 :
915:2007/04/07(土) 19:03:49 ID:???
Smarty.class.php
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内の関数を削除できればもっと省けそうだけど、めんどいですね。
922 :
nobodyさん:2007/04/07(土) 19:20:46 ID:1Ng7rNgy
>>913 PHPはよく知っていて、わざわざまたSmarty使うのにまた、新しい文法覚えるのってどうなのよ、って感じはするよね。
例えばforeachなんてPHPのはマニュアル見なくてもスラスラかけるけど、
つい最近まで、あれ?item=だっけ?form=だっけ?as?みたいに、良くわからなくなって
マニュアル(というか、他で使ってるところ)みて、コピペしてた。
まあ、でも、
>>916さんのいうように、PHP(なり、何か他のスクリプト)解ってるなら特に難しいことないけど、面倒なのは面倒だね。
全部自分一人でするなら、必要ないかも。
Viewの部分の分離なら、PHPだけでも出来るし。
でも、スクリプト知らないデザイナさんなどに覚えてもらうのに楽なのかな?
とはいえデザイナもSmarty覚えるよりPHP覚えた方が、後々役に立ちそうだから微妙だよね。
俺がsmarty使う理由は、デリミタが簡潔でHTMLが綺麗に見えるから。
dreamwearverのデザイナビューでも、わりとエラーにならずにレンダリングされるし。
if文の使い勝手が微妙だけど、プラグイン自分で書くって言う手もあるし。
923 :
nobodyさん:2007/04/07(土) 19:24:40 ID:1Ng7rNgy
>>921 おれもそんなわけないと思ったけどなるんだよね
0に
Smarty-2.6.18なんだけど・・・
バグかな?
>>923 試してみたけど0になったな。 e_mailでやるときちんと表示されるから、バグっぽいね。
Flexyがもうちょい融通きくようになればSmartyから即移行したいんだけどね…。
同じname使うだけでパースエラーとかありえない。
将来的にformのnameかIDでグループ分けしてパース出来るようになるのだろうか。
変数名に-使うなってことで。
928 :
923:2007/04/09(月) 08:46:20 ID:45uRynI3
>>925 わざわざテストありがと
>>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');
?>
929 :
923:2007/04/09(月) 08:47:41 ID: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度目のループが文字化けしません?
うちの環境の問題ですか?
930 :
923:2007/04/09(月) 08:49:17 ID:45uRynI3
ちなみに
変数名(添字)のuser_nameやuser_passをfoo、barでやると文字化けしませんOTZ
>>928 むしろPHPで-がエラーにならないことに驚いた
マニュアルではだめってなってるし
さらに-を使うことにも驚いたけど
933 :
nobodyさん:2007/04/09(月) 23:39:29 ID:45uRynI3
>>929 ありがとうございます。
そうですね
おっしゃるとおり
さっき実験してて気づきました。
なぜか変数のスコープを勘違いしてました。
すんません。はずかしいです。
934 :
nobodyさん:2007/04/13(金) 11:37:03 ID:W3WC3UzW
javascript絡みの話なんですが、
<script>
array[1] = {$infotype2[1]};
</script>
こんな感じにjavascriptのコード内でsmartyから受け取った値を代入したい場合はどうすればいいんでしょうか。
よろしくお願いいたします。
>>934 俺ならJavaScript全体を
PHPコード側で変数に格納して、
assignで渡すけどな。
936 :
nobodyさん:2007/04/13(金) 11:59:56 ID:W3WC3UzW
>>935 なるほど。勉強になります。
ありがとうございました。
そうテンプレート内に書けばいけるじゃん
>>934 サーバサイドスクリプトとクライアントサイドスクリプトの間には何があるのか考えればおのずと答えが出るだろ。
もしかして{がデリミタだから引っかかってるとかじゃないよな?
QuickFormで
$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() を経由しても、継承する方法はないのでしょうか?
なんでsmartyスレで聞いてんの?
なんでスレッドのタイトル見てないの?
Flexyのこともたまには思い出してあげてください。
943 :
939:2007/04/18(水) 10:23:00 ID:???
あ。ごめんなさい。
レンダリングで Smarty 使ってたもんでつい…。移動します。
944 :
nobodyさん:2007/04/22(日) 18:56:08 ID:b9VJcguV
質問です
テンプレート(.tpl)中の
{foreach name=loop from=$products item=product}
〜〜
{/foreach}
としている部分がまるっきりブラウザに表示されません
なにが問題でしょうか?
ありがちなミスのパターン(解決策)を教えてください。
自分なりに確認したつもりですがわかりません
$productsの中身が空
$productsをassignしてない
$productsのスペルが間違ってる
某情報機関の調査によれば上記の凡ミスが全バグ中の85%を占めるそうです。
<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>
<?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に分ける際にどう記述すればいいですか?
よろしくお願いいたします。
948 :
nobodyさん:2007/04/25(水) 00:40:47 ID:6uGbCoSG
950 :
nobodyさん:2007/04/25(水) 18:06:36 ID:oViUh0CG
946です。
****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 DB_FETCHMODE_ASSOCがないからじゃないの
952 :
nobodyさん:2007/04/26(木) 09:07:13 ID:ogJz3FoA
>>951 解決しました。ありがとう
e時ミスでした。
Japanese translation available!
[4-May-2007] The Japanese documentation is here! Thanks goes to Masahiro Takagi, Joe Morikawa, Daichi Kamemoto, and Shinsuke Matsuda for their hard work.
954 :
nobodyさん:2007/05/12(土) 22:26:46 ID:6YVR0l4j
tplファイルから
{php}
require_once(hoge.php)
{/php}
↑みたいなことやるとhoge.phpの中でDB(MYSQL)から読み込んだ文字だけ
文字化けするんだけど何で?
ちなみにhoge.phpを直接実行する場合は文字化けを起こさない。
DBもphpもtplも全部UTF-8Nで統一してんだから当たり前だけど。
{php}使うぐらいならむしろsmarty使うな。
956 :
nobodyさん:2007/05/13(日) 05:21:57 ID:m+4dQ5o9
smartyって
テンプレートの名前、例えばhoge.tplを
www.hoge.jp/hoge.phpとwww.hoge.jp/foo/hoge.phpと両方で使うと、バグると言うか、同じtplとみなして表示がおかしくなりますよね?
template_cを自前で切り替えないとダメってコト?
不便じゃない?
みんなどうしてます?
958 :
956:2007/05/13(日) 14:36:39 ID:???
>>957 $compile_id
こいつか!ヒントサンクス!
教えてください。
php部分
$array=array(
"1"=>array("sys"=>"a1"),
"2"=>array("sys"=>"b2"),
"3"=>array("sys"=>"c2"));
$array2=array(
"a1"=>array("ver"=>"z1"),"a2"=>array("ver"=>"z2"),"a3"=>array("ver"=>"z3"),
"b1"=>array("ver"=>"z4"),"b2"=>array("ver"=>"z5"),"b3"=>array("ver"=>"z6"),
"c1"=>array("ver"=>"z7"),"c2"=>array("ver"=>"z8"),"c3"=>array("ver"=>"z9"));
通常表示このように変数値で配列番号を指定し表示される部分を
foreach($array as $value){
print $array2[$value['sys']][ver];
}
//結果 z1z5z8
smartyで同じ処理をするよう
以下コードを書いたのですがパターン1〜3ともに表示できませんでした。
配列番号を変数で指定することは不可能なのでしょうか?
{foreach item=a key=key from=$array}
{$array2[$value['sys']]ver} パターン1
{$array2.$value['sys'].ver} パターン2
{$array2.$value.sys.ver} パターン3
{/foreach}
smartyの部分修正
{foreach item=a key=key from=$array}
{$array2[$a['sys']]ver} パターン1
{$array2.$a['sys'].ver} パターン2
{$array2.$a.sys.ver} パターン3
{/foreach}
962 :
nobodyさん:2007/05/27(日) 20:34:44 ID:CBMyXuH3
includeファイルにtableタグを使うと
上に空白が入ってしまいます。
<b>aaa</b>だと大丈夫でした。
どうすれば空白がきえますか?
先ほど別の板で{strip}{/strip}を教えて頂いたのですがダメでした。
宜しくお願い致します。
964 :
nobodyさん:2007/05/28(月) 00:33:32 ID:Q4t73dbV
>>963 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0013)about:internet -->
<html>
<head>
<title></title>
<body>
<table>
<tr><td>aaaa</td></tr>
</table>
</body>
</html>
965 :
nobodyさん:2007/05/28(月) 01:05:51 ID:Q4t73dbV
>>963 すいません、間違えました。
少し酔ったんでまたソース書き込みます。
ご親切にレス頂いたのに本当にすみません。
966 :
nobodyさん:2007/05/31(木) 17:23:08 ID:AGOFu4XP
Smartyで配列の件数を出力したいのに
{$ar|count}
とすると
Array
と表示されてしまうのですがなんで?
上のように書いたら
count($ar)になると思ってたのですが。
967 :
966:2007/05/31(木) 17:29:46 ID:???
ごめん
書いた後に気づいた
@で解決した
教えてください。
foreach内でcaptureしたものを配列にして、
html_tableで表示させたいのですが、どうしても
captureで読み込んだものを配列できません。
どうすればテンプレート内で配列にすることができますか?
{foreach from=$item key='key' item='val' name='Loop'}
{capture name='val' assign='row'}
{$val.id}<br>
{$val.word}
{/capture}
{/foreach}
↑$rowに$itemで表示する内容を入れて
↓こんな感じで表示させたい
{html_table loop=$row cols='4'}
どうしてもできないって,どんな方法を試したん?
970 :
968:2007/06/01(金) 15:34:39 ID:???
こんな風にしたり。
{capture name='val' assign=row[$key]}
foreach内にこんな感じで入れてみたり。
{assign var="row" value=$smarty.capture.row}
971 :
nobodyさん:2007/06/13(水) 13:16:13 ID:CAn4D9tB
$fuga['hoge'][$foo['bar]] をテンプレートで表現するにはどうすればいいですか?
$fuga.hoge.$foo.bar では通らないらしい
972 :
nobodyさん:2007/06/13(水) 16:26:42 ID:CAn4D9tB
>>971 自己レスですが
$fuga.hoge[$foo.bar] で通りますた
$fooは連想配列だけどいいのかなあ・・・
973 :
nobodyさん:2007/06/14(木) 13:10:19 ID:41cbMn19
最近ページが出るのが重くて
レンタル先に問い合わせたら、Smarty使ってるせいっていわれたらしんですけど
そんなことってありますか?
Smartyってキャッシュするから他のテンプレートエンジンより高速っていいますよね?
なんかApacheのキャッシュがSmartyと相性が悪いって、いわれたらしいんですけど・・・
もちろん専用サーバーなので、他のサイトのせいで重いってこともないし、
最初立ち上げたときはそれほどでもなくて
明らかに重くなってるので、プログラムのせいってこともないと思うし。
問い合わせた本人じゃないので詳しくわからなかったんですけど、ApacheとSmartyって相性悪いんですか?
もしかしたらapacheのログのせい?
Apacheの設定でどうにかならないのでしょうか?
どうも、こっちが知らないと思って適当にあしらってる感じがしないでもないOTZ
ヴァキュームとかしてるのかな・・・
>>973 Smartyは確かに軽いライブラリじゃないけど
(xdebugで解析するとメインの業務処理より時間がかかってる場合多し)
体感で重いという程なら他の要因を調べるべき。
秒間何十アクセスとかじゃないんだよね?
Pentium3 500MHzとかのヘボマシンだと、
(Webアプリに大いに依存するけど)
秒間十アクセス程度でキツイ。
>>975 ApacheとPHPモジュールならそのマシンでももっともーっと行けるだろ。
普通にGUIログインでクライアントマシンとして利用しながら
サーバー立ち上げてるとか??
977 :
975:2007/06/15(金) 09:10:33 ID:???
>>976 チューニングしないとそんなもんだと思うけど…
OOPしてるからちょっとはオーバーヘッドあるだろうけど、
特に重い処理していないし。
軽いところで、秒間10〜20ぐらい。
APCとか入れると秒間30〜40ぐらいは行ける。
978 :
nobodyさん:2007/06/27(水) 14:31:02 ID:qqHE9rvp
tam(20070624-061801)のアルバム
979 :
nobodyさん:2007/07/02(月) 12:04:34 ID:XrjaoeQ2
ほす
980 :
nobodyさん:2007/07/04(水) 17:25:01 ID:DXXJfQ6l
Smartyにて、テンプレートを使い回す場合はincludeを使用しますよね。
同様に、PHPとテンプレートが対になったパーツの使い回し(例えばblogの最新コメント一覧など)
したい場合は、一般的にはinsertプラグインとして開発するのがベターなのでしょうか?
このあたりの情報ってなかなかありませんね…。
>>980 JavaScriptでパーツ部分(例えばblogの最新コメント一覧など)だけ読み込むのが普通かも。
Smarty関係ないけど。
>>980 外側にフレームワークを使ってるから、その機能でやっちゃう。
>>980 ちゃんとしたフレームワーク使ってなくても、データ取ってきてテンプレートに展開した結果を部品として、HTMLを組み立てるって方法はよくやりますね。
それをまたテンプレート変数にアサインして、外側(レイアウト)のテンプレートに展開するのもありかと。
Smartyオブジェクトを複数生成することになるけど、部品ごとにキャッシュ使ったりテンプレートの格納先を変えたり、応用が効く利点も。
レイアウトはSmartyで、フォーム部分はFlexyってパターンもやったことあります。