![]() |
第2回 HTML_QuickFormを使ってみよう | ご意見・ご感想 |
| 先生 | : | さあ、今日はHTML_QuickFormを勉強してみましょう! |
| たぬき | : | えっ、先生!Smartyじゃなかったん?! |
| 先生 | : | 予定は未定、先生の気分で今日はHTML_QuickFormなの!!文句いわない!! |
| たぬき | : | えー・・・、でもHTML_QuickFormってなんですかー。全く知らないんですけど。 |
| 先生 | : | えー・・・、全く知らない!!なんでも興味持ってやってみなーあかんでー。勉強不足やなー。 |
| たぬき | : | すいません。べんきょーしときます。(だから教えてもらってるんやん) |
| 先生 | : | HTML_QuickFormっていうのは、PHPのお便利ライブラリ「PEAR」にある「フォームをクイックに作れるライブラリ」で、これを使うといろいろ便利なんやで |
| たぬき | : | どんな点が便利なんですか? |
| 先生 | : | 普通にフォーム作ろうと思ったら、一つの入力欄でも、定義、チェック、表示、値の引渡し、全て自分でせなあかんやろ。特に確認だして戻ったときなんか常にその値を表示するような制御をいれたりいろいろ大変やろ。それを入力欄の定義をするだけで勝手にそこらへんの処理をしてくれるとても親切なパッケージなんやでー。 |
| たぬき | : | それは、便利ですねー。フォームもあんまり作ったこと無いけどこれから入れば楽ですねー。 |
| 先生 | : | えっ。普通に作るフォームの苦しみを知らない・・・。それじゃ1年後に教えたあげるわ。 |
| たぬき | : | 先生・・・ |
| 先生 | : | さ、仕事仕事、それじゃ、まずはHTML+PHPで基本的で単純なフォームを作成してみましょうね。たぬき君。それではごく一般的な「入力」「確認」「結果」のソースをつくってね。わたしはコーヒーブレイクしてくるわ。(てくてくてく) |
| たぬき | : | えー・・・。あーあいってしもた。「先生怠慢やぞー!」(聞こえない声で)まっええか。まずは入力を作ろうか。べたやけどこんなもんかなー。 |
001: <html>
002: <head> 003: <title>入力画面</title> 004: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 005: </head> 006: <body> 007: <form method="post" action="conf.php"> 008: <table> 009: <tr> 010: <td>タイトル</td> 011: <td><input type="text" name="title" value=" 012: <?php 013: print $_POST["title"]; 014: ?> 015: "></td> 016: </tr> 017: <tr> 018: <td colspan="2"><input type="submit" value="submit"></td> 019: </tr> 020: </table> 021: </form> 022: </body> 023: </html> |
||
| 図1−1.index.php(入力画面) | ||
| たぬき | : | 次は確認画面。 |
001: <html>
002: <head> 003: <title>確認画面</title> 004: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 005: </head> 006: <body> 007: <table> 008: <tr> 009: <td>タイトル</td> 010: <td><?php print $_POST["title"] ?></td> 011: </tr> 012: <tr> 013: <td align="left"> 014: <form method="post" action="index.php"> 015: <input type="hidden" name="title" value=" 016: <?php 017: print $_POST["title"]; 018: ?> 019: "> 020: <input type="submit" value="back"> 021: </form> 022: </td> 023: <td align="right"> 024: <form method="post" action="ok.php"> 025: <input type="hidden" name="title" value=" 026: <?php 027: print $_POST["title"]; 028: ?> 029: "> 030: <input type="submit" value="submit"> 031: </form> 032: </td> 033: </tr> 034: </table> 035: </body> 036: </html> |
||
| 図1−2.conf.php(確認画面) | ||
| たぬき | : | 最後に結果画面。 |
001: <html>
002: <head> 003: <title>結果画面</title> 004: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 005: </head> 006: <body> 007: <table> 008: <tr> 009: <td>タイトル</td> 010: <td><?php print $_POST["title"] ?></td> 011: </tr> 012: </table> 013: </body> 014: </html> |
||
| 図1−3.ok.php(結果画面) | ||
| たぬき | : | 先生!!!出来たでー。こんなもんでどう?? | ||||||||||||||||||
| 先生 | : | すごーい。もうできたん。もっとゆっくり作ってくれたらよかったのにー。(ぶつぶつ・・・) | ||||||||||||||||||
| たぬき | : | 今日はなんか先生やる気ないなー。なんかあったんちゃう。 | ||||||||||||||||||
| 先生 | : | なっなにゆうてんねんなー。そんな事ないでー。やる気満々やでー。(そろそろ真面目にしよか) それじゃ次は先生が同じ物をHTML_QuickFormで作ったるからまあ見とき。 たぬき君シュールなコードがモットーやろ。これをそのままHTML_QuickFormを使って書いても、同じソースコードがべたべたできるから、まずは共通的な画面定義クラス作ってみようか。 まずこんなメソッドを想定して今のHTMLにあわせて作ってみようと思うねん。
|
001: <?php
002: // QuickForm使用サンプル 003: require_once "HTML/QuickForm.php"; 004: 005: // テクストエリアが一つだけのシンプルなフォーム 006: class CFrmSimple { 007: var $_form; 008: 009: // コンストラクタ 010: // $argAction : 「送信」ボタンのリンク先 011: function CFrmSimple($argAction) { 012: $this->_form = new HTML_QuickForm('frmSimple', 'post', $argAction); 013: } 014: 015: // フォームの項目を定義 016: function setItem() { 017: $this->_form->addElement('text', 'txtTest', 'タイトル'); 018: } 019: 020: // 「送信」ボタンを作る 021: // $argBtnName : ボタンの名前 022: function setSubmit($argBtnName) { 023: $this->_form->addElement('submit', $argBtnName, '送信'); 024: } 025: 026: // 「戻る」ボタンと「送信」ボタンを作る 027: // $argRtnName : 「戻る」ボタンの名前 028: // $argSubmitName : 「送信」ボタンの名前 029: function setReturnSubmit($argRtnName, $argSubmitName) { 030: $buttons[] = &HTML_QuickForm::createElement( 031: 'submit', $argRtnName, '戻る' 032: ); 033: $buttons[] = &HTML_QuickForm::createElement( 034: 'submit', $argSubmitName, '送信' 035: ); 036: $this->_form->addGroup($buttons, null, null, ' '); 037: } 038: 039: // 「戻る」ボタンを作る 040: // $argBtnName : ボタンの名前 041: function setReturn($argBtnName) { 042: $this->_form->addElement('submit', $argBtnName, '戻る'); 043: } 044: 045: // 画面を表示する 046: function dispForm() { 047: $this->_form->display(); 048: } 049: 050: // 画面をフリーズする 051: function freezeForm() { 052: $this->_form->freeze(); 053: } 054: } 055: ?> |
||
| 図2−1.CFrmSimple.php(画面定義クラス) | ||
| 先生 | : | それじゃ、制御しているソースはこれ。 |
001: <html>
002: <head> 003: <title>QuickFormを使った簡単な例</title> 004: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 005: </head> 006: <body> 007: <?php 008: require_once "./CFrmSimple.php"; 009: $frmIndex = new CFrmSimple('index.php'); 010: 011: // 定義、チェック関係 012: $frmIndex->setItem(); // 要素の定義 013: 014: // ===== 確認画面 (入力画面で「送信」クリック時) 焼直し前の[conf.php]部分===== 015: if ( isset($_POST["SUBMIT_INDEX"]) ) { 016: 017: // 「戻る」ボタンと「送信」ボタンを表示 018: $frmIndex->setReturnSubmit('RETURN_CONF', 'SUBMIT_CONF'); 019: 020: $frmIndex->freezeForm(); // 要素を凍結 021: $frmIndex->dispForm(); // 表示 022: 023: // ===== 最終画面 (確認画面で「送信」クリック時) 焼直し前の[ok.php]部分===== 024: } elseif ( isset($_POST["SUBMIT_CONF"]) ) { 025: 026: // 画面表示 027: $frmIndex->freezeForm(); // 要素を凍結 028: $frmIndex->dispForm(); // 表示 029: 030: // ===== 入力画面 (最初と確認画面で「戻る」クリック時) 焼直し前の[index.php]部分===== 031: } else { 032: 033: // 入力画面表示 (最初と確認画面で「戻る」クリック時) 034: $frmIndex->setSubmit("SUBMIT_INDEX"); 035: $frmIndex->dispForm(); 036: } 037: ?> 038: </body> 039: </html> |
||
| 図2−2.index.php | ||
| 先生 | : | これで焼直し完了や。どう??これでわかる?? |
| たぬき | : | (こんなんでわかったら勉強会せんでええやん。ほんま今日の先生手抜きやなー。知ってる人がみたら、誰が今日の先生か一発でわかるでー) すいません。先生。ちょっとわかりにくいんで解説して欲しいんですけど。 |
| 先生 | : | そうかなー。頑張ればわかるとおもうけど。 それじゃ、簡単に解説。 9行目でフォームのオブジェクトを生成します。まず最初にこれやらなあかんで。 12行目でフォーム要素の定義をしてます。 15,24,31行目でどの場面の処理を行なうか決定します。18,34行目でボタンを作成するときにボタンのname属性の名前を変えていて、それがPOST変数の要素に含まれているかで判断するようにしてるんやで。MVCモデルでいったら簡易Controllってとこかな。 15行目で判断されたときには確認画面としてやって来たということになるんやで。34行目で定義してるからなー。16行目から22行目までは確認画面としての処理や、作ってくれた元ソースの[conf.php]部分やで。 18行目で「戻る」ボタンと「送信」ボタンを「setReturnSubmit]メソッドを使って表示 20行目でフォーム内の項目を入力項目から表示項目に変更して 21行目で表示っと。これで確認画面の処理完了や。 23行目で判断されたときには最終画面としてやって来たということになるんやで。18行目で定義してるからなー。25行目から29行目までは最終画面としての処理や、作ってくれた元ソースの[ok.php]部分やで。 これはもう表示するだけなんで 27行目でフォーム内の項目を入力項目から表示項目に変更して 28行目で表示っと。これだけやで。 31行目で判断されたときには入力画面としてやって来たということになるんやで。確認と最終画面以外やからなー。32行目から35行目までは入力画面としての処理や、作ってくれた元ソースの[index.php]部分やで。 34行目で「送信」ボタンを「setSubmit]メソッドを使って表示 35行目で表示っと。これだけや。 こんなんでどお?? |
| たぬき | : | ほっほんまに簡単ですね。なんとなく、わかりましたけど、ちょっと不安・・・ |
| 先生 | : | そっか。わかりましたか。やっぱ先生教え方がうまいもんなー |
| たぬき | : | ・・・ |
| 先生 | : | でも、こんな単純なソースやったら、クロスサイトスクリプティングとかダイレクトSQLコマンドインジェクションの問題とか何もしてないから、注意が必要やね。でもHTML_QuickFormには、フィルタの機能とかもあるので、その定義してやれば共通的に対策できるようになるから更に便利やで。 |
| たぬき | : | それじゃ、それも教えて下さいよー |
| 先生 | : | いつか、気がむいたときね。 |
| たぬき | : | えっ・・・気、気が向いたときって先生・・・ |
| 先生 | : | それじゃ、次はチェックロジックとかを定義して、もう少し複雑なソースで勉強してみよか。というところで2回目は終了。お疲れさんでしたー。 |
| たぬき | : | おっお疲れさんでした・・・ |