【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/
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}
こんな感じで処理を行いたいんのですが。
0804800
2007/02/16(金) 11:16:20ID:qBGQeHi7{if ($smarty.foreach.hobbyloop.iteration-9)%3==0}
自分の勘違いだったぽい。レスサンクスでしたー。
0805nobodyさん
2007/02/22(木) 22:23:52ID:???テンプレートファイルに
{if $item <0} 〜HTML〜 {/if}
って書くのと
<?php if($item <0 ){ ?>
〜HTML〜
<?}?>
って書くのと、基本的にテンプレートの中身は変わらない事無いか?
WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離
しようと思ってたんだけど、テンプレートにSmartyのソースが入るんだから
やっぱり、PHPの知識がいるわけで、普通にPHPのソース書くのと違わない
気がするんだけどな・・・。他にメリットある?
0806nobodyさん
2007/02/22(木) 22:25:33ID:???>WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離しようと思ってたんだけど
もうわかっただろ?それをやるにはSmartyだけじゃ無理だって事だ。
0807nobodyさん
2007/02/22(木) 22:35:26ID:???うっかりロジック部分を触って壊したりしないかと常々おびえてて、
そんでsmartyの勉強始めたとこです。
今は1by1の分業体制だけど、これから人増やす可能性も高いので
コード側やってる相方さんも、自分がざっくりphpでプロト書いて
俺にデザインをつけさせる、という路線だとメンテ性とか可読性の面で
もう限界だと思っているみたい。
逆に言えばそういうコラボ体制とかでなければ、php直書きのほうが
効率いいのかもしれないなあ。
0808805
2007/02/22(木) 22:45:21ID:???デザ側の立場として質問なんだが、
>うっかりロジック部分を触って壊したりしないかと常々おびえてて、
って書いてるけど、現在は勉強してある程度PHP使えるようになったの?
それとも、完全にソースの部分は触らないようにしてるの?
だいたい、テンプレートと言ってもヘッダーとフッターを分けてincludeする
ようにしている場合が多いし、そんなんじゃ、Dreamweaverでも編集しづらいし、
デザ側のメリット無いと思うんだよな。
他スレとかでやたらこういう話が出てきたり、オブジェクト指向とか言われるけど、
それが他の人間と共同作業する上で、本当に役立つのか疑問に思えるんだよ。
もちろん、出来て困らないだろうけど、807のように、スキルを学ぶ必要あるしさ。
0809nobodyさん
2007/02/22(木) 23:11:43ID:???一応変数追っかけてデバッグとか、DB自体のフィールドを増やさないような
簡単な書き足しぐらいはしてます。でも、やっぱりphpのソースのなかに
丸裸でいろんなものが散らばってるのは神経使います。冒頭に分離されてるなら
まだマシだけど、if文で配列をあるだけテーブル化して表示、みたいな奴だと、
html部のど真ん中に来ちゃいますし。
トラブルが起きたときにどっちが悪さしたのかわかりにくいし、片方が
(他人もDWで編集していることを前提にコラボ系機能が作り込まれている)
DWで、もう片方がテキストエディタで「同じファイルを」いじる、というのも、
作業的にはちと筋が悪いと思ってます。
includeは積極的に使っていきたい仕掛けではありますが、確かに
CSSベースでもテーブルベースでもDWでの編集が困難になるのですよね。
「head部はinclude・その他はDWのライブラリ」というスタンスの方が
web系の人員を増員する方針で考えるなら、むしろ好ましいのかな。
0810nobodyさん
2007/02/22(木) 23:19:43ID:???でも、テンプレートタグはHTMLデザイナ向けに簡単な設計となっているはずだから
PHPコードをベタ書きするよりはマシかなって。
0811nobodyさん
2007/02/22(木) 23:44:06ID:???なるほど。ま、やっぱりデザイナー側も勉強する必要はあるって事だな。
>>810
>>805のようなソースの場合、べた書きするのと、{}で囲ってsmarty方式に
するのと、違いがあんまり無いと思うんだよな。
まぁ、forearchとかsmarty方式の方がソースは短くなるけどさ。
0812nobodyさん
2007/02/23(金) 01:12:03ID:???そうそうあんまり変わらないと思う。むしろ「 { 」入れてエラー出て困ってたデザイナさんも居た。
でもhtmlソースに出ない{* 〜 *}形式のコメントは活用できると思う。
0813nobodyさん
2007/02/23(金) 01:15:09ID:CtBpLmme0814nobodyさん
2007/02/23(金) 01:43:49ID:???うちの場合ケースバイケースだけど
表示するか否かというフラグを渡しておいて
{if $hasItem}表示内容{/if}
と出来るようにしたり
条件が複雑だったりよく使うような物だったら
ブロック関数作って
{logined}
ログイン時用の表示
{/logined}
みたいに出来るだけ単純に書けるようにしてるよ
オーサリングツールとの連携は難しいね
Flexyとかだとなんとかなるのかなと思うけど
0815nobodyさん
2007/02/23(金) 14:43:40ID:???何倍も遅いって聞くんだけど、そんなに大きな差があるの?
0817nobodyさん
2007/02/23(金) 15:03:37ID:CtBpLmme我慢できなきゃ、Zend Optimizer入れれば。
0818nobodyさん
2007/02/26(月) 01:47:05ID:???テンプレートでCSVファイルを作り、それをダウンロードさせるようなことがしたいのです。
少し上の方に書いてあったsmarty_headerという関数をテンプレートに埋込んでみたのですが、
エラーが発生(関数が存在しない)し、使うことができませんでした。
0820nobodyさん
2007/02/26(月) 11:17:58ID:???>エラーが発生(関数が存在しない)し、使うことができませんでした。
プラグイン関数用ディレクトリのパスが通ってないだけだろ。
0821nobodyさん
2007/02/26(月) 11:23:33ID:???上のやつは自分で作ったプラグイン例としてsmarty_headerって
書いていたと思う
0822756
2007/02/26(月) 12:08:17ID:???とてもシンプルなプラグイン:
{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]}");
}
0823818
2007/02/27(火) 02:39:59ID:???ですが作成されたファイルの内容がブラウザに表示されるだけで、ダウンロードのダイアログは表示されませんでした。
エラー文言ですが、
Warning: Cannot modify header information - headers already sent by 〜
と表示されます。
エラー文言が表示されることで既にHTTPヘッダが出力されてしまったのかもしれないとおもい
php.iniのdisplay_errorsをOffに倒して実行してみましたが、変わりませんでした。
やはり無理なのでしょうか。
0824nobodyさん
2007/02/27(火) 03:10:33ID:???http://jp2.php.net/manual/ja/function.header.php
0825756
2007/02/27(火) 07:35:44ID:???{smarty_header ...} は文字を出力する前に呼び出さなくちゃだめだよ。
> 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは
> PHP からの出力にかかわらず、すべての実際の出力の前にコールする必要があることです。
> 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
> 空白または空行があり、header() の前に出力が行われてしまうというものがあります。
> 同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
0826818
2007/02/27(火) 23:11:30ID:???>>825
ありがとうございます。
>頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
まさにこれでした。
824さんが提示してくださったページは知っていたのですが、理解していませんでした。
あと皆さん、smartyとは関係のない質問をしてしまい済みませんでした。
0827nobodyさん
2007/03/01(木) 09:32:48ID:???英語が苦手でなければ、こんなのはどう?
ttp://www.kuwata-lab.com/kwartz/
こんな感じでhtmlとphpを分離できる。
ttp://www.kuwata-lab.com/kwartz/img/fig01.png
ttp://www.kuwata-lab.com/kwartz/kwartz3php-users-guide.01.html#example1
0828nobodyさん
2007/03/01(木) 12:42:20ID:???0830nobodyさん
2007/03/02(金) 00:57:05ID:???ただ、痒い所に手が届かないが。
0831nobodyさん
2007/03/02(金) 09:43:20ID:???そこの人、日本人だから以前は日本語のドキュメントもあったぞ。
今は無いみたいだが。
一年前使ってみた感想は、時期尚早って感じだったかな。
メインはrubyみたいで、phpのサポは片手間って感じ。
ドキュメントに書いてあるのに実装してない構文とかも確かあったし。
(and preg_matchの配列の渡し方を間違えて、毎回初期化してるんで動かなかったりしたのを修正したのを覚えてる。)
>>830
Flexyは結構面白いんだが、「構文解析が出来る」ものだから、かなり無茶な構文を定義しているような感じがする。
以前いじった時は、スタイルシートで{hoge:fuga}のように最後のセミコロンを省略したりした場合、
Flexyのプラグインを見に行ったような・・・
これまた1〜2年前にいじったきりなんだが修正されたのかな?
0832nobodyさん
2007/03/06(火) 03:51:50ID:???みなさんははどのように作ってますか?
(仮にSmarty使用として)
1. 各コンテンツ.tplから、ヘッダ、フッタ、ナビをconfigから置換。
2. 各コンテンツ.tplから、ヘッダ.tpl、フッタ.tpl、ナビ.tplを読込み。
3. 全体デザイン.tplから、ナビ.tplとコンテンツ.tplを読込み。
4. 全体デザイン.tplから、コンテンツ.tplを読込み、
コンテンツ.tpl内でさらにナビ.tplを読込み。
┌─────────────┐
│ ヘッダ(静的) │
│┌─┐┌────────┐│
││ナ││ ページごとの ││
││ビ││ コンテンツ(動的) ││
││ ││ ││
││静││ ││
││的││ ││
│└─┘└────────┘│
│ フッタ(静的) │
└─────────────┘
私は全体のデザインを作ってしまって、
中身だけ入れ換える方式(上記3、4)が好きなのですが、
デザイナーにとっては、ファイル構成が直感的で
無くなるような気もします。
みなさんはどうしてるか参考までに聞かせてください。
0834nobodyさん
2007/03/06(火) 08:01:34ID:???デザイナーはhtmlベースな状態で管理を行って
デザインに更新があったらその都度プログラマが
変更点を確認して実際のテンプレートファイルに
手を加えるってのが一般的なんじゃないの
直感的なファイル構成にこだわる必要なんて無いと思うぜ
0835nobodyさん
2007/03/06(火) 08:53:16ID:???全体デザイン.tpl に読み込む中身.tpl を選択する
分岐入れるってこと?
俺は良く2のパターンで作るなぁ。
デザイナさんに各ページをHTMLで作ってもらって
基本的にはそれを.tplに置き換えてから手を加える感じ。
0836GoA ◆J2EE.GplLk
2007/03/06(火) 09:46:08ID:???俺はナビ部分が完全静的の場合なら、1をよくやるな。
正確に言えば、全体デザイン.tplからヘッダ・フッタ・ナビを完全固定状態で…って感じだけどな。
でも、ナビも動的にする場合がおおいので、結果として、3みたいな感じになることがおおい。
0837nobodyさん
2007/03/06(火) 10:15:32ID:???各コンテンツ.php内でコンテンツtpl名を変数に割り当てindex.tplを読み込み
index.tpl内で静的なヘッダ・フッタ+動的なコンテンツtplを読み込み
って感じ?(ナビ略)
0838nobodyさん
2007/03/06(火) 12:16:59ID:25mpWck5{section ... start=`($foo.bar-1)*($smarty.const.CONSTANT)` ...}
このようなエラーが出ました:
Fatal error: Smarty error: syntax error: $smarty. is an unknown reference
これはどうしたらよいのでしょうか?
0839838
2007/03/06(火) 12:36:12ID:25mpWck5悪いので、スクリプト側で計算させてテンプレートに振り分ける方が良い」という
ことが書いてあったのでそうします。
0841nobodyさん
2007/03/06(火) 14:33:09ID:???私の場合は、各アクションの最後にどのコンテンツtplを使用するか送るようにしてる
メニューの部分は、全アクションに継承されたクラスのコンストラクタか、
アクション終わってからセットかな。もしくはtplから直読み。
0842nobodyさん
2007/03/06(火) 14:36:46ID:???読み込む場合は{include file=$contpl}って感じね。
0843nobodyさん
2007/03/06(火) 15:39:31ID:???>>833-837,840-842
ありがとうございます。
デザイナ側からの視点だとまた違うんでしょうが、
プログラマ側からでは、3が多数という感じですね。
普段こういった事を同業に聞くこともないので
面白かったです。
0844nobodyさん
2007/03/09(金) 15:28:36ID:???ほぼ全部のテンプレートを変更しなきゃいかんよね?
(DWのテンプレ機能とかはおいといて)
文章が分かりづらくてスマソ…。
0845nobodyさん
2007/03/09(金) 15:32:27ID:???0846nobodyさん
2007/03/09(金) 16:00:37ID:???んなわきゃない
ヘッダやフッタに変更があってもレイアウトテンプレートを修正するだけだ
どう勘違いしてるんだ?
0848844
2007/03/09(金) 16:44:05ID:???まず全体ページ(例:all.tpl)を呼んで、その全体ページ(all.tpl)のなかで{include 各コンテンツ}を
呼ぶってことでしょうか?
0849nobodyさん
2007/03/09(金) 17:15:08ID:???0852nobodyさん
2007/03/10(土) 10:44:25ID:GgSEfqVF{${$loop[loop].name}}
{$$loop[loop].name}
という2つはエラーになりました。
0853nobodyさん
2007/03/10(土) 11:30:55ID:???最近Smarty使ってねえから間違ってたらすまんな
0854852
2007/03/10(土) 11:44:36ID:GgSEfqVFありがとうございます。
しかしちょっとそのやり方がわからないです。
具体的には
$loop[0]['name'] = "a40";
$loop[1]['name'] = "a43";
$loop[2]['name'] = "a58";
のように数字が続いています。
で、sectionの中で
{$a43}や{$a58}などの変数を呼び出したいのですが、どうもうまくいきません。
section が複雑にネストしてるので配列で渡すのはちょっと無理っぽいので、可変変数でなんとかしようと思った次第です。
0855nobodyさん
2007/03/10(土) 11:48:12ID:???{$var}.cde
という文字列を使いたいのですが、どのように記述すればいいでしょうか?
{if $var.cde == .....
では$varの配列とみなされてしまうようです。
0856855
2007/03/10(土) 11:49:03ID:???smartyです。
0857nobodyさん
2007/03/11(日) 14:03:45ID:???そういうことか。無理なんじゃないかな。
定数値であれば、$smarty.const.$hoge で取れるんだが、
そんな方法で変数参照出来たら、逆に危なくて仕方ないしな。
設計から見直したまえ。
0858nobodyさん
2007/03/11(日) 14:08:45ID:???// $smarty->assign('var', 'ab');
{assign var="str" value=$var|cat:"cde"}
{if $str == "abcde"}ok{/if}
0859nobodyさん
2007/03/13(火) 22:56:37ID:QJkFtOhTなんで、俺だけ出ないのか教えてくれ。
0860nobodyさん
2007/03/13(火) 23:31:57ID:???0861nobodyさん
2007/03/16(金) 21:09:00ID:???0862nobodyさん
2007/03/18(日) 02:13:43ID:???smartyのテンプレ作成をutf8でお願いしますとデザイナに頼んだら、
「DWの設定まんどくさだから、sjisじゃなきゃダメ」と言われたので
smartyのautoload_filtersで、sjisテンプレをコンパイル時にutf8変換してます。
php(utf8) ← DB(utf8)
↓
smartyテンプレ(sjis) → smartyコンパイル(utf8) → 画面出力(sjis)
このように、すごーく無駄な文字コード変換が2回も入ってしまいます。
なんか他にいい方法ないでしょうか?
0863nobodyさん
2007/03/18(日) 02:43:21ID:CdbythRUassign時にShift_JISに変換すればいいと思う。
php(utf8) ← DB(utf8)
↓
assign
↓to sjis
smartyテンプレ(sjis) → smartyコンパイル(sjis) → 画面出力(sjis)
Smartyの仕組みは知らないけど、assign時にコールバック処理を入れられるな
らそれを使えばいいし、無ければSmartyのラッパークラスを用意すればいい。
0865nobodyさん
2007/03/18(日) 08:53:47ID:???頻繁に更新するものじゃなかったら、>>862さんがutf8にコンバートするとか。
0866nobodyさん
2007/03/18(日) 09:12:45ID:???往復ビンタしてから
男から殴れ女なら犯せ
0867nobodyさん
2007/03/18(日) 16:01:57ID:???>>864の通りデザイナにUTF8で書いてもらうのが一番良い。
デザイナがだめならクライアントかディレクターあたりに「余計なコストがかかる事になりますが…」
とか言ってデザイナがUTF8で書かざる終えないようにがんばれ。
0868nobodyさん
2007/03/18(日) 16:02:47ID:???0869nobodyさん
2007/03/18(日) 18:11:10ID:???0870nobodyさん
2007/03/18(日) 18:17:59ID:???これがある日本はハンデやで。
0871nobodyさん
2007/03/18(日) 20:08:33ID:???smartyテンプレ(sjis) → smartyコンパイル(utf8)
はテンプレートが更新された後の初回アクセスだけですむから大した負荷にはならないだろ。
■ このスレッドは過去ログ倉庫に格納されています