トップページ⇒php
984コメント324KB

【PHP】Smarty【Template】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/03/10 00:57ID:NhgrjNBT
このスレ、あってもいいんじゃないかと。

本家(英語)
http://smarty.php.net/

日本語マニュアルとか
http://sunset.freespace.jp/smarty/
0529nobodyさん04/12/08 01:12:49ID:???
これって元になったテンプレートエンジンとかあるんでしょうか?
源流ってどのへんになるんだろ?
0530aya04/12/09 17:20:27ID:hK+hWFtH
windows2000(IIS)でのsmartyの設定でつまづいてしまっています。

まずダウンロードしたSmarty-2.6.6.tar.gzを解凍し、その中のlibsの中身
を、
c:\php\smarty というフォルダを作ってコピーし、
C:\WINNT\のphp.iniのinclude_pathを下記のように変更しました。

// 変更前(既に入れたpearのパス)
include_path=".;C:\php\pear;c:/php/includes;c:/php/pear"
// 変更後(smartyへのPATH)
include_path=".;C:\php\pear;c:/php/includes;c:/php/pear;c:/php/smarty
"

これで、smarty/demo/index.php(SMARTYのテストプログラム)にアクセスすると
、
---------------------------------------------------------------
Warning: main(Smarty.class.php): failed to open stream: No such file or directory in c:\inetpub\wwwroot\nyuukin\demo\index.php on line 4

Fatal error: main(): Failed opening required 'Smarty.class.php' (include_path='.;C:\php\pear;c:/php/includes;c:/php/pear;c:/php/smarty') in c:\inetpub\wwwroot\nyuukin\demo\index.php on line 4

---------------------------------------------------------------
のエラーが出てしまいます。 smartyへのpathを通すのにはどうすればいいんでしょう?
不躾ですみません。


0531nobodyさん04/12/10 04:49:38ID:gB4mZSIs
PathはSmarty.class.phpがある場所にしなさい
と出てますが・・・ちゃんとある?
0532nobodyさん04/12/10 10:44:56ID:???
Smarty.class.php は libs の中にある。
0533aya04/12/10 10:58:34ID:f65efB7J
>>524
そうなんですよね。ちゃんと設定したはずなんですが、pathが
通っていないんです。
既に稼動しているPEARのライブラリのパスは
include_path='.;C:\php\pear;c:/php/includes;c:/php/pear'で
pear配下のファイルがincludeできるのですが、
(include_path='.;C:\php\pear;c:/php/includes;c:/php/pear;c:/php/smarty'
として、
c:/php/smarty/Smarty.class.php
にアクセスするとエラーになってしまうんです。

include_pathは、ウィンドウズのシステム環境変数のPATH設定と
同じ感覚でセットアップしているのですが・・
どうしてなんだろう?





053453204/12/10 11:14:16ID:???
>>533
せっかく返事したんだから読めよ。

require_once('libs/Smarty.class.php');
でいけるんじゃねーか。
いけなかったら、libsにパス通せ。
0535aya04/12/10 12:22:05ID:f65efB7J
>>533
ごめんなさい。間違えました。533スレッドは、
>>533さんへのレスポンスでした。しっかり読みました。

要は、解凍したlibの中身を、smarty直下に移動したわけだから、
c:/php/smarty'
とinclude_pathを追加したんです。

053653204/12/10 20:07:24ID:???
\ と / が混在してるのが気になる。

ひとまず\で統一してみれば?
0537aya04/12/11 13:42:57ID:Jq/LlFpl
>>536
そうなんです。
ディレクトリセパレータを(/),もしくは(\)に統一して実行してみたの
ですが、PEARは正常に稼動し、SMARTYは相変わらずPATHが通っていない
状況が続いています。
0538nobodyさん04/12/11 21:58:48ID:???
Pathは通ってるけどSmartyが未設定なんじゃないの。
だいたいPath通す必要性ないよ。
0539nobodyさん04/12/12 17:33:42ID:???
>>537
Smarty-2.6.6\demo\index.php
> require '../libs/Smarty.class.php';
なわけだが。
0540nobodyさん04/12/13 17:56:41ID:???
>>539
どうやら>>537はlibsの中身だけを
c:\php\smarty\ に置いてるらしいぞ。
今まで読んだ感じだと。
0541nobodyさん04/12/13 22:35:43ID:???
ayaって釣り馬鹿の共有コテじゃないか
0542nobodyさん04/12/16 17:12:21ID:RdrCSV2b
連想配列の添え字の指定を変数で行いたい時ってどんな書き方すれば良いんですかね?
{$DATA.$key}
こんな指定の仕方がしたいんですが…
0543nobodyさん04/12/16 22:21:21ID:???
>>542
mk:@MSITStore:c:\php\HtmlHelp\php_manual_ja.chm::/ja/language.types.array.html
0544nobodyさん04/12/16 23:45:45ID:???
>>543 ???
Smartyでの指定の仕方なのですが
0545nobodyさん04/12/17 01:16:41ID:???
>>544
demo\index.php、demo\templates\index.tpl嫁よ。
0546nobodyさん04/12/17 01:52:06ID:???
>>545 ???
どこにも連想配列のKeyを変数で指定している記述は見当たらないんですが
0547nobodyさん04/12/17 11:34:54ID:???
てか、
{$DATA.$key}
これでできるでしょ…。試してないの?
{$DATA[$key]}
でもできるみたいだけど。
0548nobodyさん04/12/19 11:34:13ID:???
Smartyって配列の扱いが面倒な気がするのですが
こんなもんなんでしょうか?
そのうちなれるのかな。
ほかのテンプレートはどうなんすか?
0549nobodyさん04/12/19 11:37:18ID:???
>>548
最近気づいたんだけど
section
でなく
foreach
を使うと配列ラクだよ
0550nobodyさん04/12/19 15:48:21ID:???
テンプレートの記述とは書いてないけどね
0551nobodyさん04/12/19 15:58:49ID:???
>>550
言うたら何が面倒なのかも書いてないやろ。
0552nobodyさん04/12/19 16:36:21ID:???
>>550
なにが面倒なの?
0553nobodyさん04/12/19 21:03:08ID:???
誰がホセなの?
0554nobodyさん04/12/19 21:12:51ID:???
だれがつまらんこと言ってるの?
0555nobodyさん04/12/19 21:40:23ID:???
>>554
まずお前が鼻に付く
0556nobodyさん04/12/19 23:38:58ID:???
そしてお前があごに付く
0557nobodyさん04/12/20 20:15:55ID:???
>>556
何?同じようなこと繰り返せば面白いとでも思ってんのかバーカ
0558nobodyさん04/12/21 04:09:14ID:???
>>557
なんか嫌なことあったの?
0559nobodyさん04/12/21 12:33:51ID:???
SmartyとPear::Auth と HTML_QuickFormを併用してMVC設計してる人いないかな?
0560nobodyさん04/12/21 13:46:25ID:t6MkBwt3
寒稽古してる人いる?
056155904/12/21 13:49:27ID:???
HTML_QuickFormを使うとMとVの分離が怪しくなる。
しかもSmartyとの連携も怪しくなってきたりして。
0562nobodyさん04/12/21 17:58:00ID:???
>>561
同感。
0563nobodyさん04/12/23 06:26:50ID:???
HTML_QuickFormじゃなくてSmartyValidatorのほうはどうですか?誰か使ってる人います?
0564nobodyさん04/12/27 15:43:31ID:???
SmartyValidatorってはじめて聞いたので、ググってみた。
・・・情報が少なすぎる。
0565nobodyさん05/01/03 00:08:40ID:???
最近PHP始めたのですが、ソースが肥大化してしまいSmarty化しているのですが、
while($row = mysql_fetch_array($left)) {
print("[".$row["month"]."/".$row["day"].]");
}
こんな感じのをSmarty化できずに困っています。
{foreach}{/foreach}などを使ってやるようなことは解ったのですが、
key とか name などの使い方が解りません。どなたか教えてください。
0566nobodyさん05/01/03 00:32:46ID:wnsIsqHm
>>565
そんな単純なコードをいじったところで変わりぁせん
0567nobodyさん05/01/03 20:57:14ID:???
>>565

こんな感じか。

PHPのコード
$rows = array();
while ($row = mysql_fetch_array($left)) {
$rows[] = $row;
}
$smarty->assign('rows', $rows);

テンプレート
{foreach from=$rows item=row}
[{$row.month}/{$row.day}]
{/foreach}

Smartyマニュアルの「第4章 変数」の「phpから割り当てられた変数」のあたりを
読むといいよ。
0568nobody& ◆vGPd8m6uvw 05/01/03 21:01:00ID:???
>>567さん
感謝です。
>Smartyマニュアルの「第4章 変数」の「phpから割り当てられた変数」のあたりを
>読むといいよ。

是非読ましていただきます。
0569nobodyさん05/01/04 23:38:34ID:???
Smarty側でforloopを
使うことは罪に当たります。
057056905/01/04 23:39:24ID:???
2005年における初めてのネット上での書き込みが
こんなくだらないものだった。
もう少し考えてから書けば良かったのに俺。
0571nobodyさん05/01/06 13:52:57ID:???
ところで、{foreach}間でeregを使って正規表現を使うには、どうすればいいですか?
0572nobodyさん05/01/06 18:12:11ID:DWsuB/B6
html_optionsではき出してる各要素に、
onclickをつけてjavascriptを呼び出したいんですが、
何か良い方法ないですかね
0573nobodyさん05/01/06 18:23:57ID:???
smartyってHTMLには便利なんだけど
メールのテンプレートに使おうとするとたいへん。
IF文をうまく書かないと
改行がへんなとこで入ったり、改行しなかったりして
結果、テンプレートが見にくくなる。
うまい方法ないかなー?

>>572
適当に html_options2 とか作って
パラメータを増やす
0574nobody& ◆k0eA9hHNm2 05/01/07 00:04:35ID:???
mysqlから取り出したデータを表示させるチャットスクリプトなんですが、
自動リンクさせるためにregex_replaceを追加したのですが、エラーが起きてしまいます。
ソース:{$row.comment|regex_replace:"(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)":" <a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>"}
どうすればいいですか?
0575nobodyさん05/01/07 00:09:56ID:???
>>574
エラーメッセージを読め
0576nobody& ◆QWv3R1XL8M 05/01/07 00:17:18ID:???
>>574 追記
Warning: Unknown modifier '(' in ちょめちょめ on line 24
と出てします
0577nobodyさん05/01/07 00:38:20ID:???
>>576
あんた誰?
0578nobodyさん05/01/07 01:34:57ID:???
>>577
初心者です。
0579nobodyさん05/01/07 01:36:36ID:???
もしかして>>574=>>576か?
だったら書き込み毎に変えるようなトリップ使わずに
元質問のレス番を名乗れ
058057405/01/07 01:41:48ID:???
>>579さんの指摘はごもっともです。以下気をつけます。
0581nobodyさん05/01/07 01:49:23ID:???
Warning: Unknown modifier '(' in と出てもおそらく '(' が原因ではない。
'/' 3つをエスケープしてないじゃないか。
0582574=58005/01/07 02:07:47ID:???
>>581さん指摘ありがとうございます。
ソース:{$row.comment|regex_replace:"(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,! #~*/:@&=_-]+)":" <a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>"}
を
{$row.comment|regex_replace:"'(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,! #~*/:@&=_-]+)'":" <a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>"}
に変えると正しく作動するようになりました。
0583nobodyさん05/01/07 02:12:01ID:???
ところでこういう問題は起きていないか?
http://www.ironhearts.com/diary/archives/000365.html
0584574=580=58205/01/07 02:14:27ID:???
>>583さん
まさにそれです。そのとうりです。
0585nobodyさん05/01/07 10:29:27ID:???
>582
そんなのテンプレートに書くの?
modifierプラグイン書いたほうがいいよ
0586nobodyさん05/01/07 11:46:56ID:???
>>585
俺もそう思う。
modifier.alink.php みたいな。
なんか落ちてそうだけどな。
0587nobodyさん05/01/14 00:43:42ID:???
質問なんですが、インストールする場合は/usr/local/・・・っていう場所じゃなくてもOKです?
たとえばレンタルサーバにSmarty置いて動作させたりは可能なんでしょうか・・。
0588nobodyさん05/01/14 02:08:19ID:???
>>587
まず試せ。
0589nobodyさん05/01/14 02:18:55ID:???
>>588
その回答だと使えるんですね、サンクス
0590nobodyさん05/01/14 09:42:08ID:???
ムッキー
0591nobodyさん05/01/14 20:49:49ID:???
かわいい
0592nobodyさん05/01/18 16:40:18ID:GbvmkgfT
誘導尋問のプロフェッショナル発見

・・・と書き込んでおこう
0593nobodyさん05/01/18 20:43:29ID:???
その程度の回答で満足できるなら
なぜ最初に試さないんだろう・・・
0594nobodyさん05/01/20 08:23:23ID:???
試すより聞くほうが楽だからだろ
0595nobodyさん05/01/20 10:25:20ID:???
試す 同期型処理
聞く 非同期型処理
0596nobodyさん05/01/20 14:29:42ID:???
試す 自分で行動
聞く 人に頼む
0597nobodyさん05/01/20 15:58:23ID:???
試す すでに環境が用意できている
聞く まだ環境が用意できていない
0598nobodyさん05/01/21 00:30:18ID:Q7KPWxeo
・1
 ・2
 ・3
  ・4
   ・5
  ・6
 ・7
  ・8

ttp://www.skullysoft.com/soft/ssc-board/bbs/main/c-board.cgi?id=cboard
このようなツリー型の掲示板に代表されるような木をSmartyで表示したいと思っています。
foreachやsectionでは決まった深さであれば入れ子にして表示することができるのですが

例えば2階層なら

{foreach .....}
・根
 {foreach .....}
 ・葉
 {/foreach}
{/foreach}

のようにして表示できるのですが、実行時に深さが決まる場合はどのようにすればよろしいのでしょうか?
ご存知の方がいらっしゃいましたらよろしくお願い致します。
0599nobodyさん05/01/21 00:43:39ID:???
>>598
{foreach .....}
・根
 {foreach .....}
 ・葉
  {foreach .....}
  ・葉
   ....
  {/foreach}
 {/foreach}
{/foreach}
0600nobodyさん05/01/21 01:06:26ID:???
>>242の方法はどう?
0601nobodyさん05/01/21 01:46:56ID:???
>>598
最近この手のツリー式BBS作ったけどツリー作る所まではロジック側でやったよ。
表示順とインデントまで作ってSmartyの方では単純なループで表示させるだけって感じで。
0602nobodyさん05/01/21 03:01:42ID:???
>>600
ありがとうございます
この方法で試してみたところ上手くいきました
(key val)が1つの葉で多分木の状態になっています

- base.html

<ul>
{include file="incl.html" root=$root}
</ul>

- incl.html

{if isset($root.key)}
<ul>
 {foreach from=$root item=node}
  {include file="incl.html" root=$node}
 {/foreach}
</ul>
{else}
 <li>{$root.key} - {$root.val}</li>
{/if}

>>601
確かにそちらの方がよさそうですね
恥ずかしながら上のを作っているときに無限ループにはまってしまって
デザイナーがやる仕事ではないと思いましたorz
issetを持ち出している所も、ほとんどPHPのプログラムになっていますし

ただ、予め作ってしまうと上で上げた単純な<ul>を使った方法や
ttp://www.skullysoft.com/soft/ssc-board/bbs/main/c-board.cgi?id=cboard
のようにしたいという場合にテンプレート側のみで出来なくなってしまうので非常に悩んでいます
0603nobodyさん05/01/21 17:13:04ID:???
Smartyはdisplay関数で出力しますが、ブラウザに出力するのではなくファイルに出力したりできるんでしょうか?
ざっとマニュアル見てみたのですがそのような関数は無いみたいでした。
自分でソースを編集しないとダメなのかな・・(´・ω・`)
0604nobodyさん05/01/21 17:20:08ID:???
fetch()
0605nobodyさん05/01/21 17:20:23ID:???
>>603
ob_start();
$smarty->display();
$result = ob_get_contents();
ob_end_clean();

// あとはお好きなように
060660505/01/21 17:21:25ID:???
>>604
そんなのあったのね。サンクス。
0607nobodyさん05/01/21 17:28:58ID:???
>>604-605さん
ありがとうございます
早速試してみます
0608nobodyさん05/01/21 19:47:12ID:???
>>602
データにインデント数(何番目の階層か)まで持たせれば、
<ul>だの<li>だののループでどうにかなるんじゃないの?
0609nobodyさん05/01/21 20:32:27ID:???
>>608
ならない
やってみれば分かる
0610nobodyさん05/01/21 22:03:06ID:???
>>609
サンプルをくれ
061159805/01/21 23:54:03ID:???
>>608
私もそれを考えてみたのですが、どう実装すれば良いか分からず


そこでblockプラグインを作成しようと思ったのですが、blockの内部の変数は
既に変換済みで渡されるということなので、どうすればforeachみたいな事を
できるのかマニュアルと格闘していたのですが解決できそうな方法がありませんでした。

やはりテンプレート上のみで解決するには上で解決したような例でinclude再帰か
foreachの実装みたいなものをSmarty側で新たに組み込むかなど
上手い方法がなかなか思いつきませんorz
061259805/01/21 23:57:53ID:???
もう一つ思いついたのが、blockプラグインで変換済みで渡されるなら
Smartyの構文で渡すのではなく、特殊な文法でいくという感じでした

{html_tree ......}
this is [[node]]
{/html_tree}

これならpreg_replaceしながらでいけるのですが、新しい文法を作り出さないで
上手くいく方法がないか模索しています
0613nobodyさん05/01/25 17:14:22ID:ShBI8nKK
Smartyで、{$link->setAction('MemberList')->addLinkParam('id', 24)}のように、
setActionオブジェクトのメソッドにアクセスしようとしたところ、syntax error: unrecognizedが発生してしまいました。
参照オブジェクトからのメソッドはコールできないんでしょうか?
0614nobodyさん05/01/26 19:05:19ID:???
>>613
呼び出せます。
以下を読んでみて。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/advanced.features.html#advanced.features.objects
061561405/01/26 19:06:32ID:???
あ、よく読んでなかった。
テンプレートの中でメソッドコールのチェーンはできないと思います。
0616nobodyさん05/01/26 23:31:40ID:???
というか、そういう状況って、モデルとビューを分離しきれてないんじゃないかと。
0617nobodyさん05/01/27 01:01:07ID:???
BAA、BAA
0618nobodyさん05/01/27 18:57:53ID:???
Mojavi+Smartyを組み合わせた環境で、
Shift-JISで書いたテンプレートに「施」の文字を入れると、
以降の一部が化けてコンパイルエラーになります。
Smarty単独でも起きたのでMojaviは関係ないようですが。

適当なテンプレートに「実施キャンペーン」と入れた結果:
Fatal error: Smarty error: [in hoge.html line 165]: syntax error: unrecognized tag: キャンペーン {$hoge|default:0 (Smarty_Compiler.class.php, line 417) in /usr/local/apache/mojavi/opt/smarty/Smarty.class.php on line 1088
061961805/01/27 18:59:13ID:???
途中で送ってしまいました。
スクリプトから直接echo()した場合や、
フォームからDBへの入出力等だと化けは発生してません。
0620nobodyさん05/01/28 00:11:19ID:???
>>618
マルチバイト文字"施"のなかに'{'が含まれている罠
{literal}でかこっとけ。
0621nobodyさん05/01/28 00:22:59ID:???
>>618
SJISで書いても良い事無いよ。素直にEUCか、UTF-8にしときなさい。
0622nobodyさん05/01/28 00:45:45ID:???
>>621
i-mode専用サイトの場合絵文字が直接うめこめる。
0623nobodyさん05/01/28 05:06:57ID:???
絵文字はフィルタつかわね?
0624nobodyさん05/01/28 06:48:39ID:???
>>602
同じようなことで悩んでいるのですが、この例でassignしてある$rootの
配列の構造がどうなってるのか教えていただけないでしょうか…。
0625nobodyさん05/01/30 10:13:27ID:???
>>624
ちょっといい例が思いつきませんが例えば下のツリーの関係なら
・あ
 ・赤
  ・ポスト
 ・雨
・か
 ・亀

こんな感じの配列です
(
 (あ
  (赤
   (ポスト)
  雨
  )
 )
 (か
  (亀)
 )
)
062662405/02/01 00:46:14ID:???
>>625
なるほど、理解できました。サンクスです。

自分でも調べてみました。
Pear::TreeやPear::DB_NestedSet(初めて知った)を使う、という手もあるみたいです。
ttp://www.codecomments.com/archive224-2004-3-151787.html
0627nobodyさん05/02/02 03:50:11ID:???
HTML_QuickFormのバリデーションで、
「どれか1つが記入されていたらOK」というRuleは
どうやって設定すればいいでしょうか。

いまtextフォームが4つあるんですが、
単純にrequireにしただけだと空欄が認められないし、
何も設定しないと入力チェック自体が出来ないという状態に。
0628nobodyさん05/02/02 09:00:55ID:???
Pearスレ向きな質問のような気がするけど..
addFormRuleでいいんじゃない?
http://hatotech.org/kumatch/archives/000331.html ここのPDFに
簡単に使い方が書いてあるよ。
■ このスレッドは過去ログ倉庫に格納されています