トップページ⇒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/
0153nobodyさん2005/12/02(金) 19:10:32ID:GbypoETy
なぜこのスレをはじめて見たことが判ったのだ?
0154nobodyさん2005/12/02(金) 20:49:36ID:???
それもプラグイン実装
compiler.assign.php 見たらびっくりするぐらい簡単。
適当にいじってcompiler.append.php とかってすれば?
01551512005/12/04(日) 14:03:53ID:Mar0sa+P
>>154
ありがとうございました。
実体はreturn行だけなんですね。
assignをappendに置換したらそのまま。
わかってみればびっくりするぐらい簡単でした。
0156nobodyさん2005/12/04(日) 16:57:43ID:Lg1lZNcA
smarty+JpGraphを使えてる人いますか?
双方単体では使えるのですが、

<?php
require_once("/var/www/common/xxxx/MySmarty.class.php"); //smarty本についてたファイル
require_once("jpgraph-2/src/jpgraph.php");
require_once("jpgraph-2/src/jpgraph_radar.php");
echo "testdayo";
?>

という、実処理なしのスクリプト(EUC-JP)でもエラーが出てしまいます。
JpGraph Error
General PHP error : var : Deprecated. Please use the
public/private/protected modifiers

環境は、
fedora core 4
Apache/2.0.54 (Fedora)
PHP Version 5.0.4
JpGraph2.0rc2/1.19 ※両方でテストしてみた。双方単体では動く。

λ...タスケテ
0157nobodyさん2005/12/04(日) 16:59:53ID:???
JpGraphとやらにE_STRICTでも入ってんだろ
01581562005/12/04(日) 17:05:43ID:Lg1lZNcA
ごめん。自己レス
MySmarty.class.phpが悪かったみたい(?)。
Smarty.class.phpにしたらエラーでなかったです。
もちょっと頑張ってみます。
0159nobodyさん2005/12/05(月) 03:30:22ID:???
FlexyのCompilerって
Flexy,Regex,Standardありますが、どのような違いがあるのでしょうか。
0160nobodyさん2005/12/09(金) 00:22:02ID:???
テンプレートエンジン全般の質問です。
サイト構築に、mod_rewriteを使ってルートのPHPにパスを渡して
それぞれのページを表示させているのですが、
PHPのテンプレートエンジンの中に、各ページのHTMLファイルに
PHPスクリプトを書いたときに適用させられるようなエンジンはないでしょうか?
鮎川さんのテンプレートクラスを使ってみたのですができませんでした。

わかりにくいですね…

・mod_rewrite
 (RewriteRule ^(([0-9A-Za-z\-\_\/]+)\.html)$ default.php?file=$1 [L])
・default.php?file=test/index.html (ルートのPHP)
・main.html (ページ全体のHTML テンプレートタグを使って書いてある)
・test/index.html (default.phpが呼び出しているファイル)
  ↑このなかに<?php ほにゃらら ?> のPHPスクリプトを書いて実行させたい

(´・ω・`)わかりますでしょうか… よろしくお願い致しますm(_ _)m
0161nobodyさん2005/12/09(金) 00:22:35ID:8G0pq1Va
テンプレートエンジン全般の質問です。
サイト構築に、mod_rewriteを使ってルートのPHPにパスを渡して
それぞれのページを表示させているのですが、
PHPのテンプレートエンジンの中に、各ページのHTMLファイルに
PHPスクリプトを書いたときに適用させられるようなエンジンはないでしょうか?
鮎川さんのテンプレートクラスを使ってみたのですができませんでした。

わかりにくいですね…

・mod_rewrite
 (RewriteRule ^(([0-9A-Za-z\-\_\/]+)\.html)$ default.php?file=$1 [L])
・default.php?file=test/index.html (ルートのPHP)
・main.html (ページ全体のHTML テンプレートタグを使って書いてある)
・test/index.html (default.phpが呼び出しているファイル)
  ↑このなかに<?php ほにゃらら ?> のPHPスクリプトを書いて実行させたい

(´・ω・`)わかりますでしょうか… よろしくお願い致しますm(_ _)m
0162nobodyさん2005/12/09(金) 00:23:13ID:8G0pq1Va
ごめんなさい、重複です
0163nobodyさん2005/12/09(金) 00:35:41ID:???
ようはテンプレート内にPHPを直接書きたいってことね?

Smartyの{php}があるが、そういうのはコントローラで処理して
テンプレートには結果だけ渡すのが普通じゃないかな
0164nobodyさん2005/12/09(金) 02:20:36ID:8G0pq1Va
>>163
感謝です。
これを機にsmarty入門いたします。
0165nobodyさん2005/12/09(金) 12:25:36ID:???
なんか間違ってる
01661632005/12/09(金) 17:51:16ID:???
やっぱり違うみたいです…(´・ω・`)
「テンプレート内」じゃなく、「テンプレートに埋め込む文章内」の
PHPを適用させたいのです。
無理でしょうか?なにか代替案があれば教えてくださいm(_ _)m
0167nobodyさん2005/12/09(金) 18:11:55ID:???
Smartyなら内部でevalして結果返すプラグイン書きゃいいじゃん。
パカじゃねーの?
0168nobodyさん2005/12/09(金) 18:23:01ID:???
今ウンコしてて気付きました。
すごい勘違いしてたようです。
なかったことに
0169nobodyさん2005/12/13(火) 00:37:27ID:+LOMjCdo
テンプレートファイルとPHPの内部エンコードを、
別々にすることはできますか?
0170nobodyさん2005/12/13(火) 01:08:06ID:???
>>169
間に変換するフィルタを噛ましてやれば可能。


半素人なデザイナーとか、どうしてもSJISじゃないと
と言い張ったりするから。
0171nobodyさん2005/12/13(火) 02:18:33ID:???
携帯用とかぐるぐる変わるよ
0172nobodyさん2005/12/14(水) 21:38:32ID:???
この中のどなたかPHP部分とHTML部分を完全にわけたblogtoolを作ってくださいm(_ _)m
0173nobodyさん2005/12/14(水) 21:53:11ID:???
いいだしっぺがやってくださいm(_ _)m
0174nobodyさん2005/12/15(木) 00:54:10ID:Ehe3PQsA
>>172
smartyじゃ駄目なの?
0175nobodyさん2005/12/15(木) 12:08:28ID:???
>172
探せばあるよ、ガソバレ!
0176nobodyさん2005/12/17(土) 20:01:40ID:???
サイボウズ ガルーン 2絡みでsmartyを調べているが大した事は無いね。orz
0177nobodyさん2005/12/18(日) 10:40:41ID:???
ただのテンプレートエンジンに何を期待してたんだ?
0178nobodyさん2005/12/18(日) 11:43:26ID:???
独自文法の変な癖にイライラすることはあるな
0179nobodyさん2005/12/18(日) 12:06:49ID:???
文脈の読めない人に文法を扱う能力があるのか疑問です^^;
0180nobodyさん2005/12/18(日) 15:38:25ID:???
たとえばsectionのパラメータに
step=$var*2+1
等の式を指定したら変になる。
そのくらいうまいこと処理しろや!BOKENASU!
0181nobodyさん2005/12/18(日) 21:51:49ID:???
>>180
マジレスしとくと、
そんなことしなければ実現できない設計をした誰かが悪い。
テンプレートエンジンの第一目的は HTML とプログラムの分離なんだから。
綺麗に分離できる設計&プログラミングが要求される、と思う。

ツールを使いこなすには技術がいる。
0182nobodyさん2005/12/19(月) 03:51:38ID:???
最近、Smarty使ってるサイト(もちろん階層は分けてますが、
10万以上のファイル書き出ししてます)が激しく思くなって
きていて、PHPオーバヘッドになっているのは確認したので、
何らかの対処をしようと思っています。

で、一度eAcceleratorとかと組み合わせて使ってみようかなぁと
思っているのですが、Smarty+eAcceleratorで動かしている方
いますか?
0183nobodyさん2005/12/19(月) 11:13:10ID:dKcxa4c0
>>181
確かに、HTMLファイルの上で演算なんかするべきじゃないな。
PHPで全て処理するのが理想だ。
とはいえ、繰り返しなどの処理は{foreach}などに頼るしかなくその上でプログラミングに
近いことをしないといけないのは仕方ないと思う。

そこで質問なんですが、smartyの連想配列の添字に変数を使えませんか?
PHPでいうところの $hoge[$fuga] に相当するような書き方が見当たりません・・・
0184nobodyさん2005/12/19(月) 11:56:48ID:???
$hoge.$fuga
0185nobodyさん2005/12/19(月) 16:17:41ID:???
なんか最近、明らかに業務の質問が出てきてるんだが
qmailスレとかでコンサル雇え、って煽り見て馬鹿だ、って思ってたけど気持ちがわかってきた。
0186nobodyさん2005/12/20(火) 13:47:21ID:???
djb教信者キモい。
0187nobodyさん2005/12/20(火) 20:46:34ID:???
言われて思い出したけどサポートセンターじゃなかったなここ
0188nobodyさん2005/12/21(水) 01:05:51ID:???
使うのは無料だけど、サポートはぼったくりますよってのがオープンソースビジネスだからね。
努力もせず、金も出さずでは答えは得られない罠。
0189nobodyさん2005/12/21(水) 01:25:16ID:???
まぁ、扱えないのに業務で使うなよって話だな。
0190nobodyさん2005/12/21(水) 15:14:44ID:hWyv/SEQ
>>188
何を今更・・・
0191nobodyさん2005/12/21(水) 22:11:38ID:???
俺はqmailは嫌いだが、djbdnsは好きだ。
こういうのもdjb信者というのだろうか。
0192nobodyさん2005/12/22(木) 07:25:41ID:???
>>191
信者は「○○の製品なら完璧!」と妄信し突っ切るヤツであり馬耳東風でありアナタは無問題
0193nobodyさん2005/12/22(木) 13:40:11ID:???
djb先生の製品は完璧です。
愚弄しないでください。
0194nobodyさん2005/12/23(金) 12:57:07ID:???
〃∩ ∧_∧
⊂⌒(  ・ω・) はいはい信者信者
 `ヽ_っ⌒/⌒c
     ⌒ ⌒
0195nobodyさん2005/12/23(金) 13:27:23ID:???
>>193
を信者だと思えるやつは素人
0196nobodyさん2005/12/23(金) 18:03:23ID:???
でも信者って盲目で人の言う事聞かないしねえ。周りは迷惑しまくり。
0197nobodyさん2005/12/23(金) 18:58:13ID:???
盲者
0198nobodyさん2005/12/23(金) 19:45:53ID:OyeIk+oi
エラーハンドリングして表示するようにしたら
Smartyのコンパイル時に
var: Deprecated. Please use the public/private/protected modifiers
が出るようになってうざい。
何かいい方法ないかな?
01991982005/12/23(金) 20:03:18ID:???
ハンドラ内でファイル名に
Smarty_Compiler
が含まれていたら無処理にすればいいだけだった
ゲヘヘ
0200nobodyさん2005/12/27(火) 14:48:31ID:???
>>183-184
関数中に配列変数を使うにはどう書くのですか?

{assign var="abc" value="$def.$ghi"} //失敗
0201nobodyさん2005/12/27(火) 15:36:59ID:???
そりゃ無理だ・・・

{assign var="abc" value=$def.ghi} //成功
{assign var="abc" value=$def.$ghi} //失敗

ですよろしく
0202nobodyさん2005/12/29(木) 01:51:35ID:???
それ前にも挙がったけど無理だった気がす。
設計を考え直そうという結果になったんだっけか。
単に$ghiがassignされてて、代入だけだったら↓
{assign var="abc" value=$def.$ghi}
{assign var="abc" value=$def[$ghi]}
でいけた気もする。 ループの時とかがだめなのよね。
0203nobodyさん2006/01/04(水) 12:10:03ID:fhuv2FvB
Smartyで
{section name=x loop=$TotalDepartment}
{section name=i loop=$DepartmentRest}
  ・・・
{/section}
{/section}
とネスト構造にさせて、{section name=i loop=$DepartmentRest}のループが終わったら
一番上のループに戻って、再度iの値を0に指定したいのだけど、{$i=0}では当然エラーになるし
どうすればいいか試行錯誤しています。どなたかご教示ください。
0204nobodyさん2006/01/06(金) 12:40:03ID:???
普通にループごとに0になるんじゃないの?
あと代入は{assign}でできる。
0205nobodyさん2006/01/06(金) 14:19:41ID:???
{section name=i loop=$DepartmentRest start=0}

でいいんじゃないか?
0206nobodyさん2006/01/06(金) 23:21:24ID:???
Amazonの検索結果画面のソース見たら、変な空白や改行だらけだった。
これって多分Smartyみたいなテンプレートエンジン使ってるんだろうな。
0207nobodyさん2006/01/07(土) 02:39:05ID:???
単に行志向プログラミングしかできないアフォな香具師が作ってるだけかもよ。
文字列操作分のパフォーマンス落ちを回避したいだけかも知れないけど。
0208nobodyさん2006/01/07(土) 13:12:17ID:???
発注元にSmarty使って納品しろと指示され若干困惑気味のSmarty初心者です。
おおよその概略は理解できたのですが、例えば、

全ページで共通なメニューのHTMLを一元化し各ページで読み込む、
その際、リンク先のURL等を変数で動的に置き換える、

ようなことって実現可能でしょうか?
サンプルでは、データ取得処理→テンプレートに適用、のような簡単な例しかなくて…
0209nobodyさん2006/01/07(土) 13:39:46ID:???
>>206
Amazonは、MasonっていうPerlで書かれたテンプレートエンジンを使ってるようです。
ttp://neta.ywcafe.net/000492.html
0210nobodyさん2006/01/07(土) 14:33:03ID:???
>>208
> 全ページで共通なメニューのHTMLを一元化し各ページで読み込む、
{include}で別口のテンプレートファイルを読み込める。
複数のページから同一のテンプレートを使うこともできるし。

> その際、リンク先のURL等を変数で動的に置き換える、
メニューからのリンクは絶対パスに統一すれば無問題。
ちょっとナビーゲーションとか高機能にするのに相対パスが必要ならPHPで頑張ってロジック書いた上で変数にassignすればいい。
0211nobodyさん2006/01/07(土) 14:46:16ID:???
>>210
レスありがとうございます。
include調べてみました。なるほどこれで大丈夫そうです。


リンク置き換えに関しては、開発環境と実運営環境の差を吸収するために
常に変数からの動的生成でやっておりました。
include元の変数が全て利用可能ということなのでこれも問題なく実現できそうです。
0212nobodyさん2006/01/07(土) 18:14:21ID:53dkxsiL
Smartyのテンプレートって基本的には、Shift_JISで記述できないの?
0213nobodyさん2006/01/07(土) 18:24:32ID:???
>>212
"基本的"には。やりたければInput/Outputフィルタで変換を掛ける。
0214nobodyさん2006/01/08(日) 01:31:14ID:???
>>212
エラーになる箇所を{literal}で囲めば良いのさ
0215nobodyさん2006/01/08(日) 11:53:42ID:MOiqJ8HA
>>214
そういう バッドノウハウを w
0216nobodyさん2006/01/08(日) 13:34:12ID:???
Flexyの話がまったくでないな・・・・
0217nobodyさん2006/01/08(日) 13:37:19ID:???
>>216
使ったことないな。どこがいいの?
0218nobodyさん2006/01/08(日) 15:59:58ID:???
>>217
・シンプル&高速
・WYSIWYGなエディタで編集してもぶっ壊れない
が利点じゃなかったかな
0219nobodyさん2006/01/08(日) 16:04:14ID:7XLo98xz
前にSmartyとFlexyで簡単なパフォーマンス比較したら、
Smartyの方がちょっと速かったよ。
0220nobodyさん2006/01/08(日) 17:34:47ID:???
Smarty はテンプレートなのにゴリゴリにロジック書けるから
テンプレートエンジンのメリットが薄れると思う
Perl の Template::Toolkit とかも
0221nobodyさん2006/01/08(日) 17:53:55ID:???
そこでsmarty-lightでつよ
0222nobodyさん2006/01/08(日) 18:08:33ID:???
>>220
俺の場合はテンプレートにロジックは書けたとしても書かないようにしてる。
テンプレート内に書くのはHTMLを生成すること自体に必要な条件分岐とループと変数の表示以外には基本的に何もしない。
その他必要なロジック(例えばリンクのURLを文字列操作とか)は全てViewでやってる。
0223nobodyさん2006/01/08(日) 18:46:09ID:???
>>222
それが普通だし、そうじゃないとテンプレートエンジン使ってる意味ないしなぁ。
>>220はゴリゴリ書いたりしてるの?
0224nobodyさん2006/01/08(日) 19:22:36ID:???
http://simplate.aimy.jp/
これが枯れたら最強じゃね?
テンプレートエンジンはそんなに内部をいじるものでもないから
extensionと親和性が高いと思う。
0225nobodyさん2006/01/08(日) 20:05:02ID:???
>>224
なるほど。基本的にコンパイラ(というかコードジェネレータ)だからFlex+Bison使ってCで実装したほうが賢いってわけか。
Smartyの字句解析+構文解析ってムチャクチャだもんなw
0226nobodyさん2006/01/09(月) 12:18:38ID:???
flexyのほうが構文解析いいよ
0227nobodyさん2006/01/09(月) 13:02:31ID:m48rbPvo
>>212
あれ、俺Smarty+SJISテンプレートで使ってるけど、今のところ何の問題もないみたい
(たしかに一昔前のバージョンまではSJISダメだったけど)

この文字が入ってたらエラーになる、みたいなのがあるのかな?
どんな制限があるのか詳しい人いたら教えて
0228nobodyさん2006/01/09(月) 13:48:28ID:???
SJISの2バイト目に { があったらダメそうな気がするけど、どうなんだろう?
開始タグと終了タグを変更すりゃ大丈夫そうだけど。
0229nobodyさん2006/01/09(月) 15:50:33ID:0a34r5jX
RSSフィードをPHPで読もうとしてsmartyに

<td>{$san.$k.0.TITLE}</td>
<td>{$san.$k.0.DESCRIPTION}</td>
<td>{$san.$k.1.DC:DATE}</td>

のように書いてみた。
TITLEやDESCRIPTIONは読めるけどDC:DATEは読めない

syntax error: unrecognized tag: $san.$k.1.DC:DATE

ほぼ間違いなく「:」を誤読されてるみたいだけど解決できませんか?
0230nobodyさん2006/01/09(月) 17:26:41ID:???
これでどう?

{assign var="date" valud="DC:DATE"}
<td>{$san.$k.1.$date}</td>

もしくは$smarty->assign()するときにDC:DATEの方をいじるとか。
0231nobodyさん2006/01/10(火) 11:23:45ID:???
>>230
アリガ�d
やっぱストレートには行かないですねー
PHP側で$sanを作るときにkeyを変更しました(汎用性が・・ ;_;)
02322272006/01/11(水) 00:22:37ID:62rgCa7x
>>228
「閲」とかがあるとダメらしい

ttp://ns1.php.gr.jp/pipermail/php-users/2003-February/013595.html
この辺で無事解決しました
0233nobodyさん2006/01/11(水) 13:26:36ID:???
うちはテンプレをEUCで書いてload_filterでSJISに変換してる。

携帯端末向けのときだけSJISにしたかったので。
0234nobodyさん2006/01/11(水) 13:38:59ID:???
Smartyのタグを<?と?>にしてる。
JavaScriptとかStyleSheetのために{literal}使うのはまずそれ自体面倒臭いし、JavaScriptやStyleSheetの中にSmartyの変数を入れたい時とかもっと面倒臭い。
<? ?>にしたらエディタの色分けがPHPのままでもある程度ちょうど良かったってのもあるし、SJIS問題も一気に解消。
問題はXHTMLくらいだろうけど、今のとこ使う予定なし。
0235nobodyさん2006/01/11(水) 17:37:21ID:???
> 問題はXHTMLくらいだろうけど
XMLだね
0236nobodyさん2006/01/11(水) 18:23:19ID:???
<? ?>ってまた打ちづらそうだな。
人それぞれなので別に止めないけど。

漏れ的にはcssとjsは外部ファイルなので問題茄子。
リンク先書くとき基準ディレクトリがphpファイル側にあるのは若干辛いものがある。
0237nobodyさん2006/01/12(木) 00:14:14ID:???
うちは {{ と }} にしてるよ
んで、テンプレートをごりごりSJISで書いてます・・

そのうち問題起きるんだろうなぁ
0238nobodyさん2006/01/12(木) 00:57:03ID:F7HO2NXc
デフォルトが { } ってのがわけわからん。
javascript の所 {literal} で囲まないとすぐエラーになるし。

0239nobodyさん2006/01/12(木) 00:58:04ID:???
>>233
load_filterでEUC<>SJIS変換すると、絵文字が化けるんだよなぁ
&xxxx;形式だと、開発PC上で表示(i絵文字インストール済み)できないから不便だし。。。

今はこのあたりを参考に変換掛けて使ってるけどなんかいい方法ないのかなぁ
http://ke-tai.org/index.php?cmd=read&page=DoCoMo%2F%A5%B5%A5%A4%A5%C8%C0%A9%BA%EE#content_1_7

あとmb_convert_kanaも、同様に絵文字が化けちゃうのも困りもの
0240nobodyさん2006/01/12(木) 05:17:41ID:???
>>239
エミュレータ使えば?
0241nobodyさん2006/01/12(木) 15:27:23ID:???
<{ }>にしてる。どっかで見たのでパクった。
0242nobodyさん2006/01/12(木) 22:09:37ID:F7HO2NXc
>>241
xops?
0243nobodyさん2006/01/13(金) 00:13:16ID:???
時代は<!--{ }-->
0244nobodyさん2006/01/13(金) 12:29:11ID:???
<php:PHPCode xmlns="http://~~~"><![CDATA[

]]></php:PHPCode>

これならどうだ!
0245nobodyさん2006/01/13(金) 15:42:28ID:???
(^ω^;)
0246nobodyさん2006/01/13(金) 23:04:51ID:???
Smartyのループって何でこんなんなんだろ
単純なforループでたいがい何とかなるのに
sectionのキモい仕様は何なんだよ。氏ね。
0247nobodyさん2006/01/13(金) 23:50:14ID:???
だが section と if が一番役に立つ・・・。
あと定数への参照機能な。
0248nobodyさん2006/01/14(土) 00:28:32ID:???
普段foreach使ってるからsectionって慣れてないんだけど、sectionの方が便利だったりするものなの?
0249nobodyさん2006/01/14(土) 00:34:49ID:???
>>248

$hoge[1] = 'one';
$hoge[0] = 'zero';
$hoge[2] = 'two';

てなってるとforeachとsection動作違うと思われ。
0250nobodyさん2006/01/14(土) 00:38:36ID:???
>>249
なるほど。そういうとこは注意しないとだね。
参考になった。thx!
0251nobodyさん2006/01/14(土) 00:43:38ID:???
foreachですむところはforeachでいいんじゃね、と思う。
0252nobodyさん2006/01/14(土) 02:42:28ID:YyEEFPbb
smarty使って数年になりますが、
section の使い方覚えるのめんどうなのでforeachしか使った事ありません。
■ このスレッドは過去ログ倉庫に格納されています