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

【PHP】Smarty【Template】

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

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

日本語マニュアルとか
http://sunset.freespace.jp/smarty/
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に
簡単に使い方が書いてあるよ。
0629nobodyさん05/02/02 14:12:50ID:???
>>627
スレタイ嫁
0630nobodyさん05/02/03 12:42:41ID:???
windowsXPでSmarty使おうと思ったんですが、template_cの中に
%%11^111^111BD1DF%%debug.tpl.php
のようなファイルができてしまい、アクセスできません。
どうしたら、正常なファイル名のファイルが作成されるのでしょうか?

Apache2
PHP5.0.1
を使ってます。
0631nobodyさん05/02/03 17:48:11ID:???
>>630
コンパイル用ディレクトリの中はそれでいいんだよ。
0632nobodyさん05/02/03 18:51:23ID:???
>>631
レスありがとうございます。
ですが、

Warning: Smarty::fetch(templates_c\%%11^111^111BD1DF%%debug.tpl.php)
[function.fetch]: failed to open stream: No such file or directory in Smarty.class.php on line 1252

というエラーを吐いて進んでくれないんです。
ファイルは確実に存在しているんですが……
ちなみにDemoフォルダ内を動かしています。
0633nobodyさん05/02/03 21:23:37ID:???
>>632
根本的な解決じゃないかもしれないが、
use_sub_dirをfalseにすればなんとかなるんじゃない?
063462705/02/04 19:35:24ID:???
誤爆スマソ
0635nobodyさん05/02/04 20:51:56ID:???
>>634
別に誤爆ってほどでもないかと。
Smarty+HTML_QuickFormは定番だしね。

ちなみに俺はデザインも自分でやってるので、
そういう場合は、JavaScriptをテンプレートに直書きしてる。
分離が出来てなくてダメな事はわかってるけどね・・・。
0636nobodyさん05/02/11 01:40:26ID:???
>>632
フォルダのwrite権限ないんじゃない?
0637nobodyさん05/02/28 10:40:41ID:???
>>632さんはもう解決した?
全く同じエラーがでて悩んでたんですが、私の場合は>>636さんのご指摘通りでした。

IISで動かしてたので環境は違うのですが、
wwwroot->プロパティ->セキュリティ->Everyoneで書き込みを許可したら動きました。

Smartyのcore_write_file.phpで@renameになっており、
ここでのエラーが出力されないため、解りにくかったです。
0638nobodyさん05/02/28 12:50:49ID:???
>>637です
セキュリティの問題があるかもしれないので
wwwrootではなくtemplates_cを書き込みを許可するようにした。
0639nobodyさん05/03/05 18:32:35ID:???
>>637
はじめにマニュアルを読んでから動かせば @renameとか関係ないんで。
自分の落ち度を他人のせいにするもんじゃない。
0640nobodyさん05/03/05 19:51:23ID:???
テンプレもんだな
0641nobodyさん05/03/08 16:14:48ID:AAd9Sq9Q
こんにちは。
購入したPHPのサンプル本で、希望する動きのがあったので
使用しようと思ったのですが、Smartyを使って紹介されていたんです。
Smartyで書かれている部分を、PHPに直すような高度な事も
出来ないので、大人しくSmartyをインストールしようとしてみた
のですが・・・。
書籍のCDROMに入っていたWindows用のSmartyが
Smarty-2.6.6tar.gzで、解凍しようとしても出来ないのです。

インストール方法を探してttp://sunset.freespace.jp/smarty/の
サイトも何度も読んで見たのですが、『ディレクトリファイルに
インストールしてください』という下りから始まっていて、
ウィンドゥズ対応の圧縮ファイル名などの記述すら見つけられなくて。

どなたか、Win用のインストール方法を詳しく教えて頂けない
でしょうか・・・。
お願い致します。
0642nobodyさん05/03/08 16:20:35ID:???
>>641
はい、こんにちは。
ttp://www.vector.co.jp/ に行き、キーワードの欄に「gz」と入力します。
検索ボタンを押すと結果一覧が表示されるのでお好みのソフトを選択しましょう。
0643nobodyさん05/03/08 17:13:05ID:???
う〜ん... 春ですねぇ。
064464105/03/08 17:34:59ID:AAd9Sq9Q
>>642様
ぎゃー!出来ました。解凍、出来ました。
なんか、すごい恥ずかしい質問をしてしまった気がして
穴をほってでも入りたい気持ちでいっぱいです。
+Lahaで解凍できない=winファイルじゃない?
なんて思考回路になってしまった自分の馬鹿さ加減に
悲しくなりました。
ご指導、ありがとうございました。
今から設置に四苦八苦してまいります。
0645nobodyさん05/03/08 18:36:24ID:???
ほほえましいな がんばれ
0646641_| ̄|○ 05/03/08 21:33:23ID:AAd9Sq9Q
何度もすみません。
インストール先がわからないです・・。
解説サイトさんによると
ディストリビューションの/libs/ディレクトリにSmartyライブラリファイル
をインストールして下さい
とあるのですが、ディストリビュージョンって何ですか・・?
検索してみたのですが、Linuxの・・というのばかりが
引っかかってきて、打ちひしがれるばかりです。
どなたか合いの手をお願いいたします。
0647nobodyさん05/03/08 22:05:41ID:???
らは
0648nobodyさん05/03/08 22:07:59ID:???
>>641への回答は↓に任せた
0649nobodyさん05/03/08 22:10:28ID:???
>>646
インストール先はどこでもいい。
0650nobodyさん05/03/09 01:27:21ID:???
>>641
ハッキリ言ってその程度の知識でサーバ管理するのはとても危険。
ついでに、踏み台にされるとはた迷惑。
いや、公開サーバじゃなくてただPHPの勉強してるだけならいいんですがね。
0651641_| ̄|○いまだわからず・・・05/03/09 04:43:26ID:???
>>649さん
ご指導ありがとうございます。
適当な場所でインストールしてみたのですが、
なぜかMySQLの信号機が赤になってしまって
また打ちひしがれ中です_| ̄|○
PHPdevでSmarty使おうとしているのが悪いのかしら
とか思って検索中です。
>>650さん
まさか、ネット上で公開する気なんてまだまだ
先の先の事ですよぅ!
セキュリティの事もわからないのにっ。
一から色々と、勉強中なのです_| ̄|○
知らない事が多すぎて、覚える事ばかりで
沸騰しそうです。
踏み台にしているつもりは毛頭なかったです。
不愉快にさせてすみません・・・。
0652nobodyさん05/03/09 09:02:15ID:???
[原文]
> Install the Smarty library files which are in the /libs/ directory of the distribution.

[日本語訳サイト]
> ディストリビューションの/libs/ディレクトリにSmartyライブラリファイルをインストールして下さい。

[正しかろう訳]
配布物の/libs/ディレクトリにあるSmartyライブラリファイルをインストールします
(ここでいう配布物ってのは、Smarty-2.6.6tar.gzを解凍した物の事)
0653nobodyさん05/03/09 10:14:49ID:???
>>651
踏み台ってのは、君がここの回答者を踏み台にして…って話じゃなくて、
セキュリティの甘いサーバをネット上に放っておくと、そのサーバを”踏み台”にして、
悪事に利用されるよ、そしてそれは万人にとって迷惑な話だよ。って意味だよ。

ぼちぼちで、やったんさい。
0654nobodyさん05/03/09 10:41:51ID:???
>>641
申し訳ないが前提となる知識が足りなすぎる。
足し算がわからない人に因数分解は無理。

書店で入門書を買ってきてコツコツやりな。
どうしてもわからないことは質問してもいいから。

だいたいディストリビューションっていう単語がわからなければ、
Googleで調べればすむ話でしょ?
自分で調べもしないのに聞くのはイクナイよ。

先は長いけどがんばれー。
0655nobodyさん05/03/10 11:16:13ID:1EPX/SpT
すいません、ご存じの方いらっしゃればご教示頂きたく。

smartyのifでの比較演算なんですが、
{if "1010010001000110000115" eq "1010010001000110000115"}equals{/if}
と
{if "1010010001000110000120" eq "1010010001000110000115"}equals{/if}
の両方とも、出力がequalsになるんですが、
何故なんでしょうか?
0656nobodyさん05/03/10 11:36:31ID:???
>>655
たまたまじゃないですか。
0657nobodyさん05/03/10 11:43:54ID:???
昨日久しぶりにバージョンアップしてみたのですが、
{strip}命令って無効になったのですか?
そのまま{strip}って表示されてしまうのですが・・・。
065865505/03/10 11:44:28ID:???
>656
いや、たまたまじゃない。
つか、すげぇ下らない理由だった。

当然、文字列同士で比較していると思っていたのだが、
数字だけで構成しているとどうやら数値として比較するらしい。
で、有効な桁数以上の文字はカットされてしまい、
(俺のトコだと整数で18桁がボーダーのようだが、環境によって変わるかも。)
前方18桁だけ取り出して、数値としてみれば
両辺一致しているのでtrueになるようだ。

末尾にcatで"a"なんてくっつけてやれば、
文字列同士として比較するため、何の問題もでない。

そんな事にも気づかなかった俺って・・・orz
0659nobodyさん05/03/10 13:38:03ID:???
>>658
いや、くだらなくはないよ。
0660nobodyさん05/03/10 15:16:46ID:???
貴重なバッドノウハウよね
0661nobodyさん05/03/10 15:25:45ID:???
PHPホンスレでガイシュツだけどね。
0662nobodyさん05/03/10 17:46:21ID:8Bnn/FyN
>>657
カスタムタグ使ってると、そーなるバグ
smartyのフォーラムよく見ろ
0663nobodyさん05/03/10 22:24:02ID:???
>>658
だからたまたま(有効範囲内が)同じだということだったんだが…
0664nobodyさん05/03/11 11:29:21ID:???
文字列と数字を比較したりしてもそんな挙動することあるな
if( 0 == "test") とか多分true
そういうときに if( 0 === "test") ってやるんだっけか
066564105/03/12 09:17:24ID:???
Smartyのインストールが無事に出来ました
何日もかけて今頃やっとかよっ!って感じなのですが・・_| ̄|○

ご指導してくださった皆様ありがとうございました。
066664105/03/12 11:31:22ID:Eai46BlS
こんにちは。
何度もすみません。
Smartyをインストールできたのがうれしくて、書籍の
サンプルをそのまま使って、ローカルでテストしてみたのですが、
Fatal error: Cannot redeclare loginfunction()
(previously declared in C:\Program Files\Apache Group
\Apache2\htdocs\samples\chap5\mng\auth.php:12)
というエラーが出てきてしまいます。
0667641 続きです05/03/12 11:31:40ID:Eai46BlS
エラーを調べてみたのですが、関数の二重定義 のために
起きているエラーだ、という所まで検討がついたのですが、
いかんせん、書籍に乗っているサンプルを何もいじっていない
コードなので、なにが悪いのか、わからないのです。
もしかして、知らない間に、どこかいじってしまったのかも、と
思って、再度CD−ROMから該当ファイルをインストールしてみたのですが
同様のエラーのままでした。

コードの該当部分は、下記になります。
<?php
require_once("DB.php");
require_once("Auth/Auth.php");
require_once("chap5/MySmarty.class.php");
$dsn="mysqli://php:php@localhost/sample";
$params=array(
"dsn" => $dsn,
"table" => "mng_usr",
"usernamecol" => "uid",
"passwordcol" => "passwd");
function loginFunction(){
$o_smarty=new MySmarty();
$o_smarty->display("login.tpl");
}
<略> ?>
どこが悪いのか、ご指導いただけないでしょうか・・・・。

よろしくお願いいたします。
0668nobodyさん05/03/12 11:47:33ID:???
>>667
smartyとはもう関係無い話だと思うのだが。。
loginfunctionが二重定義されているという事ならば、
本当にそうなっているのか、
DB.php、Auth/Auth.php、chap5/MySmarty.class.phpの中や、
さらにその中でrequireやincludeされているファイルを
検索して確かめたらいいのでは?
その上で、どのfunction loginFunctionを使うかはそれを作った人の意向によるかと。
066964105/03/12 12:31:08ID:???
>>668さん
ご指摘ありがとうございます。
ファイル内を、検索して探してみます。

おっしゃる通り よく考えたら、確かにSmartyとは直接
関係なかったですね・・_| ̄|○
すれ汚し、大変失礼いたしました。
0670nobodyさん05/03/13 19:08:22ID:8WQj/L10
Smarty入門~PHP5+テンプレート・エンジンでつくるMVCアプリケーション~
http://www.amazon.co.jp/exec/obidos/ASIN/4798108839

買おうか迷っているので感想キボンヌ
0671nobodyさん05/03/13 19:12:02ID:???
>>670
オビを見るに微妙な内容だな
0672nobodyさん05/03/13 19:27:34ID:???
入門する程のものなのか
立ち読みで十分な希ガス
0673nobodyさん05/03/13 19:56:38ID:???
山田 祥寛 (著)はJavaのライターでは有名な人だな。
0674nobodyさん05/03/13 20:08:38ID:???
まるごとPHPにも書いてるね。
・・・「かいてる」の変換候補一発目がなぜか「Keitel」でびびった。
0675nobodyさん05/03/13 21:11:31ID:???
>>673
PHP界隈でも結構書いてる。ライター一本でちゃんと食っていくのには
そのぐらい書かないと駄目なんだなと、いつも思い知らされる訳だが。
0676nobodyさん05/03/13 22:03:03ID:???
MVCってのは自前かな?
それともMojaviとか使ってるのかな?
■ このスレッドは過去ログ倉庫に格納されています