トップページ⇒php
983コメント287KB

【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/
0263nobodyさん2006/01/14(土) 15:37:17ID:???
>>262
そうすると全部 section でいいのでは・・・。
foreach 使ってる人は無理して転向しなくていいけど。

>>260
テンプレートエンジンは使ったほうがいいぞ。
圧倒的に管理しやすくなる。
0264nobodyさん2006/01/14(土) 16:36:11ID:???
でも所詮はテンプレート。フレームワークほど使い勝手は良くならない。
0265nobodyさん2006/01/14(土) 16:40:58ID:???
フレームワークよりテンプレートエンジンのほうがPHPでは有用だとおもう。
02662652006/01/14(土) 16:41:58ID:???
言い方が悪いな、有用じゃなくて重要な。
0267nobodyさん2006/01/14(土) 16:43:49ID:???
部品化を進めるならJavaに勝るものはないし。
効率だけを考えるならC, PHP, Java, その他スクリプトで一番手っ取り早いのを適宜使うしなぁ。
0268nobodyさん2006/01/14(土) 18:17:14ID:???
>255
foreach を使うのは簡単だから。
配列まわすならforeachってのは直感的にわかりやすいと思うんだけど

section を使ったほうがシンプルに書ける場合があるってことですね。
0269nobodyさん2006/01/14(土) 18:21:16ID:???
>256
好みの問題かもしれないですがソートはロジックで保障すべきだと思うけど。
そこをテンプレートでってのがsectionを嫌う理由かもしれません。
単なる好みですね。
0270nobodyさん2006/01/14(土) 18:21:47ID:???
フレームワーク使ってSmarty使ってる俺は?
0271nobodyさん2006/01/14(土) 18:26:22ID:???
>>270
上手な手抜きさんかな?
0272nobodyさん2006/01/14(土) 20:14:03ID:???
>>266
逆じゃない?
ほかのjava,rubyなどと違ってもともとhtml埋め込み型言語なのだから、
webprogでのテンプレートエンジンの重要さはほかの言語より重要度では劣るのでは?
php自体が独自タグによるテンプレートエンジンであるという主張ならわかるが。
0273nobodyさん2006/01/14(土) 20:48:50ID:???
おれは 266 じゃないが、
PHP 生書きでテンプレートもどきってのはあんまり感心しない

ただ、Smarty でロジック書きまくってるのは PHP そのままで
いいじゃんと思うこともあるな、確かに
言語増えただけじゃん、みたいなね
02742662006/01/14(土) 21:01:42ID:???
>>272
他の言語とは比べてない。
PHPにおけるフレームワークとテンプレートエンジンの重要度について言ってる。
0275nobodyさん2006/01/14(土) 21:41:07ID:???
htmlを生成するための道具として作られたphpなんだから、
htmlを生成するための道具としてのテンプレートエンジンの重要性ってそれなりに低い気もするが。

どちらも使ってるけど、どっちかっていったら無くなって困るのはフレームワークかな。
いざとなれば生書きにもそれなりのメリットはあるし。

というか、2つは矛盾しないし、目的も違うから比べること自体アレだけど。
0276nobodyさん2006/01/14(土) 22:37:27ID:???
う〜ん、個人的にはプロトタイプ画面をさっさと書いて提案書に貼り付けられるのがいいんだよね。
自分がプログラム書くにせよ、他人に流すにせよ、プロトタイプコードをそのまま渡せるから。
Smarty より手軽なものがあればそっちを使うけど。
0277nobodyさん2006/01/15(日) 01:00:13ID:???
>>273
それがPHPの特性でもあるわけだから別にいいんじゃないの。
0278nobodyさん2006/01/16(月) 00:49:42ID:???
完全な見本htmlを全ページ用意してくれるようなプロジェクト用に、
xmlcとまでは行かなくても、amritaかkwartzライクなテンプレートエンジンがphpにも欲しいな。
kwartzも期待してたけど開発停止状態のうえphpコンパイラはobsoleteみたいだしなぁ...
0279nobodyさん2006/01/16(月) 01:06:24ID:???
>>278
guesswork用のテンプレートにちょっぴり期待してる
物が出れば触ってみるつもり。出ればね・・・
0280nobodyさん2006/01/17(火) 01:42:35ID:ZnOPSUo7
smartyから簡易に$GLOBALSの値を取得する方法はありますか?
0281nobodyさん2006/01/17(火) 02:31:48ID:ZnOPSUo7
Smartyでは

{include file=$includeFile}

のようにして include に変数を渡せるのですが、
これと同じようなことをFlexyでも可能でしょうか?
0282nobodyさん2006/01/17(火) 09:48:32ID:???
foreach使うと

$hoge1[n]->hoge2[n]->xxx

みたいな変数でも
二重にして回せるよ

sectionはそれができないから使わない
0283nobodyさん2006/01/18(水) 20:15:38ID:???
ネタなんだろうが、そんなコーディングするプログラマとは絶対仕事したくないな。
0284nobodyさん2006/01/19(木) 00:09:19ID:???
普通にあると思うが
0285nobodyさん2006/01/19(木) 00:17:35ID:???
>>283みたいのが一番めんどくさいかも・・
0286nobodyさん2006/01/19(木) 00:27:19ID:???
>>279
Subversionにそれらしきものが・・・
0287nobodyさん2006/01/19(木) 00:38:24ID:qu6lGv13
>>284-285 読み手の判断に任せなよ。

自身があるなら、どーんと構えとけ。
0288nobodyさん2006/01/22(日) 14:18:24ID:???
Flexyってテンプレートから定数参照できないの?
0289nobodyさん2006/01/22(日) 20:05:05ID:???
>>288
globalfunctionsオプションをtrueにして
{GLOBALS.constant(#CONSTANT_NAME#)}
で参照はできる。
if文の中に使ったり複雑なことしようと思うと難しいけど。
0290nobodyさん2006/01/22(日) 20:39:07ID:???
あんまり細かいところめんどくさいと、
もうテンプレートエンジン使わなくても、PHPでいいやんって思ったりするね。
0291nobodyさん2006/01/22(日) 21:47:39ID:???
つか使い方がそもそもテンプレートの域を超えたがっているように見えるが
0292nobodyさん2006/01/22(日) 23:16:09ID:???
PHPのテンプレートエンジンはJavaScriptと組み合わせて、PHPのコーディングが殆ど無しに画面遷移まで実現できるのがいいと思う。
index.php に画面遷移先に必要な定数だけ書いて、後は画面単位で大雑把なスケルトンコードを書けばいい。
逆にいえばそれ以外にはメリットがない・・・。
んまー、コードはすっきりするけどね。
0293nobodyさん2006/01/23(月) 00:19:55ID:???
{$form.radio1.label}
{$form.radio2.label}
...
...

みたいにカウンターでraidoの値を増やしていきたいのですができますか?
{counter start=1}
{$form.radio$counter.label}

とかforeach使ってみましたがダメでした。
0294nobodyさん2006/01/23(月) 01:41:15ID:???
>>293
なんで配列にしないで変数名に1,2,3,....をもってるの?
0295nobodyさん2006/01/23(月) 01:48:37ID:???
>>294
mojavi, HTML_QuickForm + Smartyを利用していて addElementするとそうなるからです。
02962932006/01/23(月) 03:07:43ID:???
{foreach}で分解して {if $counter == "hoge"}
みたいにして無理やり解決してみました。

0297nobodyさん2006/01/23(月) 13:03:47ID:???
addGroup
0298nobodyさん2006/01/23(月) 15:09:54ID:???
>>297
addGroup使っても同じかと思って気にしていなかったんですけど…
どうやるんですか?というかどう違うのですか?
0299nobodyさん2006/01/23(月) 16:23:36ID:???
>>298
http://pear.php.net/manual/ja/package.html.html-quickform.html-quickform.addgroup.php
0300nobodyさん2006/01/23(月) 23:34:04ID:???
phpのstr_repeatみたいなのはsection使うしかないですか?
0301nobodyさん2006/01/24(火) 11:26:43ID:???
>>282-283
これってなにが悪いの?
デザイナーには嫌がられてるの?
理由があるなら使わないようにするけど
0302nobodyさん2006/01/24(火) 14:27:42ID:???
>>301
情報隠蔽できてないだろ。
0303nobodyさん2006/01/24(火) 15:02:00ID:???
>>302
情報隠蔽?
0304nobodyさん2006/01/24(火) 17:55:41ID:???
>>301
単純に構造が分かりにくいから。
同じ [n] で回すなら、別の変数に分けた方がいい。
優れたプログラマなら自分の死んだ後のことも考えとけ。
0305nobodyさん2006/01/24(火) 19:15:04ID:???
>>304
そこかよw

$hoge1[m]->hoge2[n]->xxx

これならいいか?
0306nobodyさん2006/01/24(火) 21:53:48ID:H58eWtwf
  _、_
( ,_ノ` )y━・~~~
0307nobodyさん2006/01/24(火) 22:12:11ID:???
>>304
smarty側でどう書くか
理解できてないとみた
0308nobodyさん2006/01/24(火) 22:15:47ID:H58eWtwf
  _、_
( ,_ノ` )y━・~~~
0309nobodyさん2006/01/25(水) 00:57:06ID:???
SmartyLightって終わったんだな
乗らなくてよかった
0310nobodyさん2006/01/25(水) 03:05:04ID:???
>>309
何が終わった?
メンテ?開発?
0311nobodyさん2006/01/25(水) 07:32:48ID:???
開発が。
0312nobodyさん2006/01/25(水) 08:13:34ID:???
Smarty側から名称についてクレームが付いた。
加えてシンタックスの限界にも不満を感じていた。
そんなわけで、メンテも開発も止める。

http://www.paullockaby.com/faq/#0015
0313nobodyさん2006/01/26(木) 11:25:03ID:7udzlJtl
Smartyで
for ($i=0;$i<10;$i++){
echo "<br>"
}

みたいな単純なループをしたい場合どうしたらいいですか?
配列の要素数のループは出来るのですが
このような単純なループの書き方が分かりません。
0314nobodyさん2006/01/26(木) 11:29:05ID:???
{section name=i loop=10}
<br>
{/section}

で出来ました。
0315nobodyさん2006/01/27(金) 00:56:53ID:???
flexyで
radioエレメントへsetValueして動いた方いますか?
0316nobodyさん2006/01/27(金) 10:46:07ID:???
>>315
どう動かないのか良く分からないけど…
radioに対するsetValueは、
同じnameを持つ全てのElement全てに対して実行しないと
以前のチェックが解除されない。

<input type="radio" name="foo" id="foo1" value="1" checked="checked">
<input type="radio" name="foo" id="foo2" value="2">

があったとして、foo2だけにチェックを入れるには、
foo1, foo2両方にsetValue(2)を実行しないと駄目。
0317nobodyさん2006/01/29(日) 04:26:53ID:???
フォーム要素に値入れる時は
escape:html
でおけ?
0318nobodyさん2006/01/31(火) 11:29:21ID:RWHeKAHi
html_select_timeのall_extraってどのように使用するのでしょうか?

>全てのselect/inputタグにさらなる属性を追加

とあるんですけど、html_select_dateのyear_emptyみたいな使い方ができるのでしょうか?
ちなみに「all_extra=""」と記述してみたりしたのですが何も変化がありません。
0319nobodyさん2006/02/01(水) 23:35:59ID:BABJfEVv
FATAL [C:\Apache Group\Apache2\htdocs\Accounting\mojavi\smarty\Smarty.class.php:1251] fetch(templates_c\Login.html.php): failed to open stream: No such file or directory
Smartyでキャッシュファイルを出力していますけど、ファイルがこのメッセージのように見つからないと出ます。どなたかご教示願います。
0320nobodyさん2006/02/01(水) 23:37:58ID:BABJfEVv
>>319
補足ですが、実際このファイルは存在しています。
0321nobodyさん2006/02/02(木) 00:11:10ID:???
>>319
前後のソース晒せ
0322nobodyさん2006/02/02(木) 11:25:37ID:???
HTML時の文字コードへの変換をプラグインで実装したのですが
(**.php、**.tpl 共にEUCで記述し、HTMLではShift_JISで出力)、
postfilterでEUC→SJISを登録しただけではHTMLがEUCのままで失敗し、
outputfilterで変換プラグインを登録するとうまく動作しました。

それぞれのフィルタの適用されるタイミングをよく理解していないのですが、
postfilterで出力がEUCになった理由はなんなのでしょうか?
prefilter → [コンパイル] → postfilter → [キャッシュPHP] → outputfilter → [HTML]
という順序と認識しているのですが…
キャッシュPHPからHTMLを吐く際にさらに文字コードの変換が内部で行われている、のでしょうか?
0323nobodyさん2006/02/02(木) 16:59:46ID:???
>>322
php.iniの設定による。
0324nobodyさん2006/02/03(金) 21:14:43ID:Gniyc3tZ
smarty って関数呼び出しが冗長なのがいやです
何かいい方法ないですか?
0325nobodyさん2006/02/03(金) 21:20:20ID:???
全部自前で汁
0326nobodyさん2006/02/03(金) 22:11:50ID:???
SmartyとFlexyを軽く使ってみたけど、
結局、テンプレートエンジン使わなくなったよ。

テンプレートエンジンは異なる文法を使うのが面倒くさかったり、
制約やバグがほげほげだったりして、
利用する価値はたいしてなかった気がする・・

デザインの分離はしてるけど、記述は生のPHPでいいよ。
0327nobodyさん2006/02/03(金) 22:15:43ID:???
自分一人でやるならなんでもいいわな
0328nobodyさん2006/02/03(金) 22:19:55ID:???
一人でやらなくてもPHPでいいと思うよ。
デザインを分離して書けば、
PHPのコードもテンプレートエンジンのコードも
たいして変わらないものになる(もしくはそうできる)
0329nobodyさん2006/02/03(金) 22:58:44ID:???
>PHPのコードもテンプレートエンジンのコードもたいして変わらないものになる
その辺は徹底させてるから問題ない。と言うかそんなもん持って来られたら怒鳴って付き返s(ry

まぁ、それで問題なくやれてるんならいいんじゃね?

俺の所ではコレでやれてるから、おまいのとこでもやれるに決まってる。ってのが常に成り立つわけじゃないし
0330nobodyさん2006/02/03(金) 23:19:23ID:???
<?= の記述使ってるんだろうか
漏れはあんまり好きじゃないなぁ
デザインの分離は完璧だぜ!って言う人のPHP混在のテンプレートを見てみたい
0331nobodyさん2006/02/03(金) 23:34:20ID:???
<?= ?>は使ってないです。
<?php echo ?>でやってます。
ちょっと冗長な感じはあります。
0332nobodyさん2006/02/03(金) 23:39:01ID:???
そいつはまた見通しが・・

例えばテーブルの出力とかどうやってんの?
0333nobodyさん2006/02/03(金) 23:46:52ID:???
ちょっと長いだけで、構造は変わらないので、基本的に見通しも変わらないですよ。
でも見た目すっきりしてほしい感じはありますけど。←ここだけ生PHPだと微妙なところ。

テーブルの出力については、テンプレートエンジンも生PHPも同じでは?

フォームなどの定型HTMLはViewクラスで生成させることもあります。
0334nobodyさん2006/02/04(土) 00:06:24ID:???
デザイナにサーバ側のリソースへのアクセスをある程度抑制したいときはテンプレートエンジン使ったほうが楽だね。
記述が比較的短いってのも利点かな。
PHPテンプレートってのはSmartyとかが世の中にまかり通った後で(つまりテンプレート化の重要性が認識されるようになった後で)、「PHPでも同じじゃね?」派の人たちによって広まった概念じゃないかと思ってみたり。
まあどっちも得手不得手があるだろうし、好きなほう使うってことで問題ないと思う。
俺の場合は個人的にSmarty使ったほうがソースの見た目が断然すっきりするっていうくだらない理由でも気持ちいいから使ってるよ。
0335nobodyさん2006/02/04(土) 00:35:35ID:???
ソースの見た目がすっきりするのは重要だな。

PHPテンプレートって考え方はテンプレートエンジンとの対比で生まれたんだろう。
でもまぁ、そもそも PHPがHTMLにロジックを埋め込む って目的で生まれたんだから、
PHPテンプレートなんて当たり前といっちゃ当たり前だな。
0336nobodyさん2006/02/06(月) 09:24:34ID:???
つーかテンプレートいじるやつが PHP を破壊しないってことが
大前提で、それが成り立つ現場でなきゃ使えないっていうことが
なんだかスルーされてる気がするんだが。

あとテンプレートにしておけば htmlspecialchars 強制適用とか
やりやすいし「より安全」だと思う。
03373362006/02/06(月) 09:25:37ID:???
ごめん、意味が分からんな。
「いわゆるPHPテンプレート」より「テンプレートエンジン」の方が
安全ということが言いたかった。
0338nobodyさん2006/02/06(月) 09:38:34ID:???
うちのデザイナー達は、smartyテンプレート自体を破壊しますが何か?
0339nobodyさん2006/02/06(月) 09:45:41ID:???
いや、特に何も。
0340nobodyさん2006/02/06(月) 10:17:50ID:???
Smartyのテンプレの問題点をデザイナーにちゃんと説明して
理解させてない>>338が使えない子なだけです
0341nobodyさん2006/02/06(月) 19:31:22ID:AJx7JA/M
>>326
OOPできない奴がそういう事言うよね。
0342nobodyさん2006/02/06(月) 19:40:47ID:???
デザイナーさんたちカワイソス
0343nobodyさん2006/02/07(火) 06:15:30ID:???
>>340
それを言い出すと、

生のPHPの問題点をデザイナーにちゃんと説明して
理解させてない>>340が使えない子なだけです

も同様に成り立つんで、揚げ足取りとしてはダメダメだな。
0344nobodyさん2006/02/07(火) 09:48:40ID:???
>>343
まあ揚げ足取りの揚げ足取っても意味ねーよ。
と、揚げ足取りの揚げ足取りの揚げ足を取ってみた。
0345nobodyさん2006/02/07(火) 10:34:47ID:???
Smartyで
<?php $request = $_REQUEST; print($request[$req['name']]); ?>
というのを
$request, $reqにはassignできているとして
$request[$req['name']]の部分はテンプレートにどう書けばいいでしょうか。
0346nobodyさん2006/02/07(火) 10:49:13ID:???
>>345
assign使って2段構えかな。
{assign var="tmp" value=$req.name}{$request.tmp}
03473452006/02/07(火) 10:53:47ID:???
上げ忘れましたすみません。
もうひとつ、345と同じかもなのですが、2次元以上の配列の指定の仕方が
わからないです。初心者ですみません。
たとえばPHPで $data[1]['error']['name']というのは
{foreach from=$data item=results}
として
{$results.error.name}
でアクセスできると思ったのですが、違うみたいで…。
どなたか教えてください。
0348nobodyさん2006/02/07(火) 10:59:46ID:???
>>347
それは違くなくない?
03493452006/02/07(火) 11:09:29ID:???
>>346
早速ありがとうございます。試してみます。
>>348
ええ、違うようです。でも違っているかどうかを尋ねているのではなく、
2次元以上の配列の指定の仕方を尋ねていますので
ひとつよろしくお願いします。
0350nobodyさん2006/02/07(火) 11:12:18ID:???
>>349
いや、だから違くなくない?
0351nobodyさん2006/02/07(火) 12:03:44ID:???
>350
でも1コ足りなくない?
0352nobodyさん2006/02/07(火) 12:24:13ID:???
>>351
足りなくなくない?
foreachの中で$results は $data[*]相当の配列じゃなくなくない?
03533452006/02/07(火) 13:58:46ID:???
>>346
{$request.$tmp}でいけました。ありがとう。
>>350-352
ごめんなさい。私の配列の数が違ってました。ありがとう。
0354nobodyさん2006/02/07(火) 15:27:45ID:???
>assign使って2段構え
これ気持ち悪いよね
無駄な部分が増えるっていうかさー
0355nobodyさん2006/02/07(火) 16:00:21ID:???
>>354
まあね。
嫌なら>>345の$request[$req['name']]みないなものは初めから$smarty->assignしないってのが得策かな。
つーか普通に使っててそんなの登場したことないよ。
テンプレートに突入する前にいじくってでも変な構造のものは除去したい性分だし。
2次元以上の配列自体ほとんど皆無だな。(←これはかなり人によるだろうけど)
オブジェクトの配列ならいっぱいあるけど。
テンプレートにはなるべくビューティホーなデータしか渡したくない。
なるべくシンプルなifとforeachだけで解決できるのがベスト(ちなみにsectionは食わず嫌いw)。
だからSmartyの機能ほとんど使い余してる。
0356nobodyさん2006/02/07(火) 17:44:21ID:???
smartyで
とある配列の件数をif文で使うことってできますか?

{if $hoges|count > 0}
こんな感じで使えるといいのですが
できないですよね?

配列とは別に他の変数として件数を渡すのでしょうか?
0357nobodyさん2006/02/07(火) 18:01:10ID:???
{if count($hoges) > 0} でいいんでない
0358nobodyさん2006/02/07(火) 19:56:16ID:???
>>357
ありがとうございます
知らなかった・・・orz

普通にそこにPHPの文かけるんですね
メールも送れた
0359名無しさん@お腹いっぱい。:2006/02/08(水) 10:19:25ID:Lc3DPQ+B
初の投稿になります。
よろしくお願いしますm(_ _)m

携帯電話でsmartyを使ったサイトを作っているのですが
ページが表示できません。
怪しいと思った部分($smarty->debugging = false)など設定
してみたのですが・・だめでした。
原因と思われる理由って何かわかりますでしょうか?

よろしくお願いします。
0360& ◆h9Bn.Lr5Ro 2006/02/08(水) 10:25:12ID:Lc3DPQ+B
359の追記です。
エラーの内容については
端末が吐き出しているエラーのようです。
kddi --- このページは表示できません(未対応)
docomo --- 接続できません
0361nobodyさん2006/02/08(水) 10:37:46ID:???
Smarty以外の部分に原因がありそうな希ガス

携帯コンテンツ用の正しいHTMLかどうかとか
そのサイトでスタティックなHTMLを置いた場合に携帯で閲覧できるかとか
IE等のPCブラウザでは閲覧できるかどうかとか

確認してみては?
0362nobodyさん2006/02/08(水) 12:32:36ID:???
>>360
・リダイレクトのしすぎ
・空の出力
■ このスレッドは過去ログ倉庫に格納されています