というわけでOpenPearパッケージを作ってみた。
http://openpear.org/package/Services_Shitaraba
まあ例のしたらば削除スクリプトから各メソッドを切り出しただけというかんじなわけですが。
使い方は簡単。
リンク先にあるとおり、
>pear install openpear/Services_Shitaraba
でインストールできます。
もしくは2ファイルしかないので手動でコピペでも可。
そしたら他のPearとまったく同じ感覚で使えます。
まあ、例外?何それ?とばかりにfalse返すだけでその原因がさっぱり分からないとか、書き方がPearのコーディング規約に全く沿っていないとか、そもそもServices配下でいいんだろうかとか、色々アバウトな点もあったりしますが気にしない。
以下のように使用します。
sample.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
//OpenPear/Services/Shitaraba
require_once('Services/Shitaraba.php');
//引数はジャンル、掲示板番号、管理画面パスワード
$shitaraba=new Services_Shitaraba('gerne','123456789','password');
//各パラメータを個別にセットする場合
$shitaraba->setGerne('gerne');
$shitaraba->setBbsnum('123456789');
$shitaraba->setPw('password');
//全スレッドリストを取得
$ret=$shitaraba->getThreadList();
//特定のスレッドを取得
$ret=$shitaraba->getThread('123456789');
//全スレッドの全データを取得
$ret=$shitaraba->getAllThreadData();
//NGワードが含まれる発言を取得
$ret=$shitaraba->getNGThreadData('あああああ');
//NGワードが含まれる発言を削除
$ret=$shitaraba->deleteNGThreadData(
$shitaraba->getNGThreadData('あああああ')
);
//全発言数を指定(1000以外に変更している場合に使用)
$ret=$shitaraba->setMaxNumber(2000);
//1000(setMaxNumber)行ったスレを取得
$ret=$shitaraba->getDatThreadList();
//1000(setMaxNumber)行ったスレをdat落ちさせる
$ret=$shitaraba->datThread(
$shitaraba->getDatThreadList()
);
//特定のスレをdat落ちさせる
$ret=$shitaraba->datThread(
array(123456789,234567890)
);
|
特にNGワード削除は管理画面からだとやってらんないくらいめんどくさいので、省力化に有効な手段なのではないかと思います。
インターネットが開放的でグローバルで自由だ、という考え方は間違いです。
インターネットはきわめて閉鎖的で局所的で、そして自由な世界です。
理由は情報流通形態にあります。
インターネット以前のメディア、テレビ新聞ラジオ等は受動的なメディアでした。
局選択の自由程度はありましたが、基本的にはメディアが配信する情報を好むと好まざるとにかかわらず受け取らなければなりませんでした。
逆にインターネットの情報は能動的です。
自分で受け取る情報をコントロールできるということです。
自由な世界であえて興味のない情報や不快な情報を探そうとする人は少ないでしょう。
結果的に局所的なコミュニティがたくさんできあがり、そこから出て行こうとはしなくなります。
原理上“情報強者”ほど引っかかりやすい罠と言えます。
逆にホームページをYahooにしてしまうような一般人にとってはインターネットは開放的でグローバルで自由な世界かもしれません。
さて、そのような局所化した者たちは、仲間内で更に先鋭化します。
先鋭化した結果がプラス方向ならまだいいのですが、大抵はマイナス方向に行ってしまいます。
そう、たとえばここ。
古くは技術系だったようですがPSP初期不良騒動で一挙有名になり、自分は偉いという幻想を持ってしまったようです。
徐々に幻想は進行していき、「東大卒のミリオンディレクター」「ケータイ小説を執筆」「今年独立して会社作るお」といった超設定が次々にできあがっていきました。
同時にいつのまにかPSPとPS3支持に鞍替えします。
PS3支持だけならまあ別に問題ないのですが、問題なのがその手法。
PS3を持ち上げるために必ずWiiとXBOX360を貶めるわけです。
それはもう任天堂に親を殺されたかのような憎しみをひしひしと感じられます。
必死感と本気感と。
| 以後、業界人同士の話に、素人であるあなたがくちばし突っ込むコメントは承認しないことにします。 それと企業の経営者のくだらない発言を鵜呑みにするような人は、このコメント欄には不要です。 |
いつの間にか経営者より偉くなっています。
先鋭化した一部の読者以外からはドン引きされているってことに気がついていないんでしょうかね。
まあ気づいてたら書かないか。
その経営者の発言。
社長が訊く『知らないままでは損をする「モノやお金のしくみ」DS』
| 岩田 そこはちょっと任天堂と似ているところなんですが、 デバッグをしてくれる・・・デバッグというのは ソフトが正しく動くかどうかをテストすることなんですけど、 デバッグ部隊の中心になっているのはアルバイトの方々なんです。 わたしたちが商品をつくっているとき、 その人たちから「ここはちょっとわかりません」と言われたら、 たとえそれが当社を代表するゲームデザイナーの宮本(茂)が つくったものであっても、ちゃんと直さなきゃいけない、 そういう文化が任天堂にはあるんですね。 坂村 たとえアルバイトの人たちに対してであっても、 「君たちはわかってない」とは言えないと。 岩田 はい。 彼らはお客さんの声を代弁してるわけですから。 |
どちらがより正しい意見を言っているか、まあ言うまでもないでしょう。
勿論どちらかというと“情報強者”であるつもりである私の意見も、閉鎖的で局所的で自由な発言かもしれません。
ちなみにhttp://www.int2.info/news1.htmとかhttp://hwbb.gyao.ne.jp/cym10262-pg/fenomina.htmlとかは最初から狂ってるんで別格な。
前2回のエントリはトラックバック送りましたが却下されました。
http://yuubiseiharukana.blog.shinobi.jp/Entry/129/
http://yuubiseiharukana.blog.shinobi.jp/Entry/147/
無論今回も送りますが無視されることでしょう。
Pearは使う分には便利ですが、パッケージ作成には申請出してパッケージ定義のXML書いて審査があって検閲があってどうのと面倒です。
またCPANのAcme::のようなネタモジュールの公開も(たぶん)許されていません。
そんなわけで有志によるもうすこし緩いPearライブラリとしてOpenPearが存在します。
とりあえず適当に使ってみます。
インストールもPearと同じです。
cd C:\xampp\php
pear channel-discover openpear.org
pear install openpear/Acme_IdolMaster-alpha
なんか知らんがAcme/Amce/にインストールされてしまったのでフォルダ一個上に移動。
何故。
imas.php
1
2
3
4
5
6
7
8
9
|
//インスタンス
require_once('Acme/IdolMaster.php');
$imas=new Acme_IdolMaster();
$haruka=new Acme_IdolMaster_Member_AmamiHaruka();
//使い方が分からぬ
print('<html><pre>');var_dump($haruka,$imas);die();
|
せっかくインストールしたはいいが使い方が分からぬ。
中身を取得するメソッドが見あたらないんだがどうすれバインダー
Acme_IdolMaster_Member_Baseクラスはあるのにextendsしてないし。
さすがα版だぜ。
原型になったと思われるAcme_MorningMusumeのほうはというと、
public function select(){
throw new Exception('><');
}
じゃねえよ!
野望だったらもうちょっとどうにかしろよ!
やっぱ審査も多少は必要かも。
Zend_DbはMySQLやOracleといったDB間の差異を吸収してくれるデータベースアダプタです。
といっても内部的にPDOを使用しているのでPDOが使えるのならわざわざZend_Dbを使用する意味はほとんどないんですが。
zend_db.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//Zend_Db
require_once('Zend/Db.php');
$form = new Zend_Db();
//DBインスタンス
$db=Zend_Db::factory(
'Pdo_Mysql'
,array(
'host'=>'localhost'
,'username'=>'testuser'
,'password'=>'testpass'
,'dbname'=>'zend_test'
,'profiler'=>true
)
);
//SQL実行
$sql="SELECT * FROM test";
$ret = $db->fetchAll($sql);
//プリペアドステートメントは非常に簡単
$num=$_REQUEST['num'] ? $_REQUEST['num'] : 1;
$sql="SELECT * FROM test WHERE id=?";
$ret = $db->fetchAll($sql,1);
//インサート
$insert_array=array(
'value'=>'あいうえお'
);
$db->insert('test', $insert_array);
//関数のインサートはちょっとだけ面倒
$insert_array=array(
'value'=>'あいうえお'
,'date'=>(new Zend_Db_Expr('NOW()'))
);
$db->insert('test', $insert_array);
//関数とエスケープ値を同時に使用したい場合はすごく面倒
$insert_array=array(
'value'=>'あいうえお'
,'date'=>new Zend_Db_Expr(
'NOW()+INTERVAL '.$db->quote($_REQUEST['hour'],'INTEGER').' HOUR'
)
);
$db->insert('test', $insert_array);
//実行したSQLとかを調査できる
$profiler = $db->getProfiler();
$query_profile=$profiler->getLastQueryProfile();
print($query_profile->getQuery());
|
便利なのはプリペアドステートメントです。
SQL文中に?を書いて、呼び出すときに第二引数に指定するだけです。
複数指定する場合は配列で指定します。
PDOにおけるbindValueより手間が少なくなります。
インサートも配列を送るだけで実現できますが、関数を使いたい場合はZend_Db_Exprを通さないといけません。
まあZend/Db.phpを呼んだ時点で使用できる分DB_DataObject_Castなんかよりよっぽどましですが。
他のDB接続モジュールと違う明白な利点は、プロファイラが充実しているところです。
インスタンス作成時に引数としてとりあえず'profiler'=>trueを渡しておけばプロファイラが起動し、以後に実行したSQLなんかを保存してくれます。
その後$db->getProfiler()でプロファイラのインスタンスを取得でき、そこから各SQLの詳細なんかを見ることができます。
バインドした値なんかも見えるので便利。
また実行時間をチェックして、実行が遅いSQLを抽出したりといったパフォーマンスチューニングに便利な機能もあります。
チューニングのために毎回microtime()とかTIMEDIFFとかを埋め込んだりする必要もなく、開発が簡単に行えます。
http://japan.cnet.com/blog/kenn/2008/02/28/entry_25005627/
>この 'Thu Feb 28 00:06:14 -0800 2008' というのは Ruby の Time.now の文字列表現そのままです。
>この場合、フォームが表示されてから2時間以内のsubmitしか有効でないとしています
>さらに値をSHA-1などでハッシュしてしまえば、ハッシュする前のデータが推測できず、リプレイ攻撃以外に手段がなくなります。
日時形式をハッシュ化したら「2時間以内」がチェックできないと思うんだが。
PHPではエラーが発生した場合わりとわかりやすく教えてくれますが、テキスト表示なので素っ気ないです。
ビジュアル的に表示してくれるツールとしてXDebugというものがあります。
エラーが発生した周辺のトレースなんかも行ってくれ、デバッグがちょっとだけやりやすくなります。
導入はxgebug.orgからダウンロードしてきてインストールするのが正道ですが、例によってXAMPPには最初から入っていたりします。
php.iniにも予めXdebugの定義が書かれており、コメントを外すだけで使用できます。
デフォルトで使用されている[Zend]セクションを全てコメントアウトし、[XDebug]セクションのコメントを外します。
丁寧にも「Only Zend OR (!) XDebug」なんて注意書きまでしてくれているのでおとなしく従いましょう。
php.ini
| [XDebug] ;; Only Zend OR (!) XDebug zend_extension_ts="C:\xampp\php\ext\php_xdebug.dll" xdebug.remote_enable=true xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_handler=dbgp xdebug.profiler_enable=1 xdebug.profiler_output_dir="C:\xampp\tmp" |
適当にエラーが出るコードを書いて実行すると、↓のようにテーブル表記でエラー部分をわかりやすく表示してくれます。
[Zend] Warning: Wrong parameter count for substr() in C:\xampp\htdocs\index.php on line 3
[XDebug]
( ! ) Warning: Wrong parameter count for substr() in C:\xampp\htdocs\index.php on line 3
Call Stack
#
Time
Memory
Function
Location
1
0.0008
57224
{main}( )
..\index.php:0
2
0.0008
57336
substr ( )
..\index.php:3
あと、副作用でvar_dump()の表示も色つきに変化します。
まあ、慣れれば通常の表示でも十分ではあるのですが、やっぱ見た目が明るいとなんとなく違うというか。
ただ問題点として、変数の中身が長すぎると途中で端折られてしまいます。
出力の時点で消えているため、どうやっても確認することができないので物凄い迷惑。
端折られるサイズの制限は、php.iniに
xdebug.var_display_max_data //表示する最大データサイズ、デフォルト512
xdebug.var_display_max_depth //配列やオブジェクトを表示する深さ、デフォルト3
を追加すると変更することができます。
var_display_max_data=65535、var_display_max_depth=20くらいに変えてしまいましょう。
この人が曲解と捏造を売りにしていることは既に有名ですが、今回もまたやってくれました。
http://gamenokasabuta.blog86.fc2.com/blog-entry-1200.html
「多様性」が足りないハードは盛り上がらないらしい@さあ?
| しかし、まあなんですね、4Gamerでも「任天堂は別業界」的な発言が出てますが、「任天堂がゲーム業界各社にとってのロールモデルになり得ない」という認識が広がったことが結果として、ある意味、任天堂の(サードパーティに対する)求心力が低下する原因になったんだから、皮肉なものです。 問題は、本当に「任天堂業界」なんてものが存在するのか、それともバブリーな盛り上がりにすぎないのか。DSの実用ソフトマーケットは壊滅しました。まあ今は『ドラクエ9』で活性化しているけれども。Wiiの勢いも、日米ともに低下しています。 もし後者なら、ゲーム業界の他社にしてみれば、「そろそろだと思ってたんだよね」「まあ今回は任天堂さん、じゅうぶん勝ったんじゃないですかね」ぐらいの結論で終わるのでしょう。 前者の可能性もあるんでしょうか? 任天堂も「DSでマック」とか学校へのDS導入とか、色々やっていますね。けれども、ファミコン、SFC時代の「勝った後の余力でやった色々な施策」以上のものとは思えません。結局、任天堂自身がどれだけ本気で「任天堂業界」の構築に注力していたかどうか、なんですよね。 去年からの動きを見るに、微妙に不徹底だな、と。新しいマーケットを安定化させることと、既存のマーケットへのアピールをすること。どちらも中途半端に思えますね。まあこの1、2年の任天堂に対する僕の感想は、基本的に「不徹底」「中途半端」「勝って覚悟が無くなった」に集約されるわけですが。 |
この発言の元となった記事。
技術を売りにしているうちは,成熟期とはいえない@4Gamer.net
http://www.4gamer.net/games/095/G009544/20090825047/
| 4Gamer: ところがここ十数年……そうですね,初代のPlayStationが登場してから,でしょうか。前提であるはずの面白さの追求が曖昧になってきた面が否めないと思うんです。先生がおっしゃるように,新しい技術を使うことが優先されていることも多くなったようにも見えます。 原島氏: 例えばPLAYSTATION 3は,ゲームを作る人の意見をどこまで反映して設計されたと思いますか? 4Gamer: 設計開発時に詳しいわけではないのですが,恐らく,そういったことはほとんど反映されていないのではないでしょうか。 原島氏: あれも任天堂は思い切りましたよね。それまでにも,似たようなものはあったわけです。ところがどれもうまくいかず,Wiiも同じような運命をたどるだろうと考えていた人も少なくなかったはずです。 しかし,誰を対象とするのか,ゲームとは何かを考えたときに,ああいうものになった。任天堂も,宮本さんも素晴らしいと思います。 4Gamer: 任天堂はもはや「全然別のところ」にいるんですよね。ゲーム業界とかそういうレベルじゃなくて。皆はそれを追いかけていたつもりが,もはや今の任天堂は別のポジションにいます。例えるなら,町の書店が一流の総合書店を目指して努力していたら,いつの間にか相手はアパレルになっていた,みたいな。 原島氏: そうでしょうね。でも,その一方では,疲れたときに「ちょっと30分やってみようか」というゲームがあってもいい。疲れを癒すようなゲームを続けていって,たまに腰を据えて遊ぶゲームがあればいいんです。 そういう意味では,この前出た「ドラゴンクエストIX」なんかは,短い時間で遊べるモードも用意してあるんでしょう? 僕はまだ触ってないんだけれども,ニュースで見たときに,そういうことを考えてるのかなと思いましたよ。 4Gamer: 確かに,よくできていると思います。昼間,持ち歩くことで多少なりとも他人と関わることができるし,それによって,さらにゲームを楽しむことができる。おっしゃる通り,寝る前の短い時間に,その日,見ず知らずの人からもらった地図で遊ぶこともできます。原島氏: いろんなことが,よく考えられていますよね。 原島氏: そう,ゲームはまだ,ナイロンやビニロンの時代なんです。「ポリゴンでこれだけの表現ができます!」というのがまさにそれですね。成熟期というのは,どこかがナイロンを出したから,それに倣えばいいというものではないんです。皆同じだから,どこかで差別化を図らなければならない。ゲームも技術を売りにするのではなく,別のところで差別化できるようにならないと成熟期とはいえません。 4Gamer: 今のRPGなんかに顕著ですよね。たまに「最新のRPG」というものをやってみると,画面上で何が行われているのかサッパリ分かりませんし,ルールがむやみに複雑怪奇になってるし。 原島氏: それは継続してやり慣れている人と,そうでない人の違いでしょうね。コミック誌の漫画も,毎週読んでいれば面白いけれども,数年振りに読むとサッパリ分からない。 4Gamer: でもそうやって,やり慣れている人向けにゲームが作られているというのも,市場が閉塞していく一因だと思うんですが。 |
どう見ても元ネタの意図を読めていませんね。
元ネタの言いたいことは
・ゲーム業界は技術を指向しすぎて「面白さの追求」を怠っている
・情報技術は今後「リアルワールドにヴァーチャルワールドが重ね書き」されてくる
・今のゲーム機が進んだ方向は、複雑怪奇で「市場が閉塞していく」方向
・任天堂は他のゲーム機が進んだ方向ではなく、全然別の方向に進んだ
つまり、従来の延長では行き詰まるしかないので任天堂は質的変換を起こしたということです。
それに対してこの人は、
・任天堂はゲーム業界各社にとってのロールモデルになり得ない
・任天堂業界が存在するか、バブリーな盛り上がりのどちらか
・新しいマーケットの安定化、既存のマーケットへのアピール、どちらも中途半端
一体何を読み取ってるんだか。
まあ
>DSの実用ソフトマーケットは壊滅しました
なんて寝言言ってる時点で読む価値無いんですがね(単に粗製濫造で埋没してるだけ、PS時代のRPGバブルのようなものだ)
そもそも「任天堂はゲーム業界各社にとってのロールモデルになり得ない」なんて誰が言ってるんですかね。
「ゲーム業界各社は任天堂の真似を出来ない」ならまだわかりますが。
あとこの人は繰り返し「PS3の時代が来る」と言っていますが、ここで断言しておきます。
「そんな時代は来ない」
理由?
「ドラクエ本編が出ないから」です。
Remote File Include攻撃とは、外部から任意のPHPスクリプトを実行させることができてしまうという攻撃です。
allow_url_includeディレクティブを利用します。
allow_url_includeは、require_once()等で任意のURLをインクルードできるというディレクティブです。
他所にあるAPIを取得したいといった場合に、簡単にインクルードすることができます。
さて、これがどう脆弱性かというと、require_onceの引数にうっかりユーザ入力値が紛れ込んでしまうと大変なことになるわけです。
引数に'php://input'と入れられると、POSTで送られてきたPHPコードが実行されてしまいます。
穴を完全に塞ぐためにはallow_url_includeをオフにする必要がありますが、PHP_INI_SYSTEMのためini_setでは設定不可能です。
そもそもallow_url_includeのデフォルトは0のため、あえて1にしてあるということは何か理由があるのでしょう。
アプリケーション側で対策を行わなければなりません。
まあ、それ以前にrequire_once()に入力値なんか使うなという話ですが。
register_globalsがオンだったりするとうっかり引っかかってしまう可能性もありますので、require_once()の引数となるパスは__FILE__等信頼できるものを使用するか、あるいはコンフィグファイルなどでdefine()しておくと安全です。
そういやinclude_pathにURL入れたらどうなるんだろう?
さて、こちらの解説記事では、'php://input'ではなくURLをインクルードした際、あたかもrequire_onceを実行した側でPHPコードが実行される的なことが書いてあるのですが、試してみた結果では単に実行結果が取得されただけでした。
要するに、単にfile_get_contentsしてprintしたのと同じような動作をしたということです。
別に呼び出し元で定義した変数を呼び出し先で参照できるということもなく、逆に呼び出し先で定義した変数を呼び出し元で参照することもできませんでした。
まあ勿論想定と全然違うファイルがincludeされることで問題はありますし、呼び出し先でフィッシング的なコードを書くことで詐欺に使えるかもしれませんが、サーバの情報を盗み出せるというのがいまいちわからないんですが。
ターゲットサーバにアップローダ等が存在し、どうにかしてPHPファイルのアップロードに成功した場合、そのファイルをインクルードさせることで情報を入手することが可能になりますが、言ってることは違う感じですし。
それとも、どこか他に設定を行ったら本当に呼び出し元で呼び出し先に書いてあるコードが実行されてしまうのでしょうか?
※2010/12/23追記
取消線部分は間違っているので新記事を参照してください。
Smartyインスタンスをvar_dump()するとわかりますが、Smarty::assignした変数はSmarty::_tpl_varsに入っています。
で、Smarty::_tpl_varsはPHP4互換のためvarで宣言されているので外部から書き換えが可能です。
さて、これで何が便利かというとテンプレート内から配列にアサインしたい場合です。
テンプレート内で変数をアサインすることができます。
{assign var='title' value='hoge'}
{$title}
とすると$titleで'hoge'を表示することができます。
ところがこの{assign}、実は配列をアサインすることができません。
そんな場合に{assign}が覗いている先を直接書き換えてしまいます。
{php}
$this->_tpl_vars['aaaa'] = array('aa'=>'hoge','bb'=>'fuga');
{/php}
これで{$aaaa.aa}で'hoge'を表示することができるようになりました。
まあ、そもそもテンプレート内で配列をアサインするような設計になっている時点でどこかがおかしいんですがね。
ここで出てくる{php}ですが、これは{php}{/php}で挟まれた部分をPHPとして解釈するという極めて危険な関数です。
これを使用した時点でSmartyの役目が台無しです。
というわけで、$smarty->security=true;とすると使用を禁止することができます。
これで安全といえば安全なのですが、同時にPHP関数の修正子も使用できなくなってしまいます。
使用できるのはpluginsフォルダに入っている、カスタム修正子を含めた修正子だけとなります。
{$text|substr:5:10}とかも使えなくなってしまうのが少々困りもの。
{php}だけ禁止して他はおっけーとかの設定はできんものかのう。
前{html_select_date}、{html_select_time}を紹介しましたが、それ以外のフォームもSmartyから簡単に作成できます。
html_input.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
//Smarty
require_once('./../smarty/libs/Smarty.php');
//チェックボックス
$form_checkbox=array(
'1'=>'チェックボックス1'
,'2'=>'チェックボックス2'
,'3'=>'チェックボックス3'
,'4'=>'チェックボックス4'
);
$form_checkbox_selected=array(2,4);
//ラジオボタン
$form_radiobutton=array(
'1'=>'ラジオボタン1'
,'2'=>'ラジオボタン2'
,'3'=>'ラジオボタン3'
,'4'=>'ラジオボタン4'
);
$form_radiobutton_selected=3;
//ドロップダウンリスト
$form_option=array(
'1'=>'リスト1'
,'2'=>'リスト2'
,'3'=>'リスト3'
,'4'=>'リスト4'
);
$form_option_selected=3;
//変数アサイン
$smarty->assign('form_checkbox',$form_checkbox);
$smarty->assign('form_checkbox_selected',$form_checkbox_selected);
$smarty->assign('form_radiobutton',$form_radiobutton);
$smarty->assign('form_radiobutton_selected',$form_radiobutton_selected);
$smarty->assign('form_option',$form_option);
$smarty->assign('form_option_selected',$form_option_selected);
//表示
$smarty->display('html_form.html');
|
html_form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<html><body>
{html_checkboxes name='form_checkbox' options=$form_checkbox
selected=$form_checkbox_selected separator='<br />'}
{html_radios name='form_radio' options=$form_radiobutton
selected=$form_radiobutton_selected separator='<br />'}
{html_options name='form_option' options=$form_option
selected=$form_option_selected}
{* checkboxを自力で表示する *}
{foreach from=$form_checkbox key=form_key item=form_item}
<input type="checkbox" name="form_checkbox[]" value="{$form_key|escape}"
{if $form_key|in_array:$form_checkbox_selected}checked="checked" {/if}>
{$form_item|escape}
</input><br />
{/foreach}
</body></html>
|
チェックボックス、ラジオボタン、ドロップダウンリストが簡単にできました。
その下に書いてある自力での表示と比べるとその威力は一目瞭然です。
内容が予め決まっているようなフォームであればテンプレートに書いてしまっても問題無いでしょうが、データベースに一覧を入れておいてそこから選択させるようなフォームを作りたい場合などに役に立つことでしょう。