第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にあわせて作ってみようと思うねん。
メッソド名 内容
CFrmSimple HTML_QuickFormのフォームオブジェクトを生成してるねん。ここにフォームの属性なんかを書いたら作成されるフォームをその属性に合わせて作るようになってるみたいやで。
setItem フォームの項目内容を定義するところやで。ここにいろんな項目を定義する事を想定してるんです。
この例ではテキストエリアだけしか定義してないんですが、チェックBOX、プルダウン、テキストエリア、を[addElement]で定義するとあら不思議、フォームが出来上がっちゃいます。まあー便利!!。
ただ項目の形式によって、[addElement]の引数が変わるから、ちょっと注意が必要やね。
setSubmit フォームの送信ボタンを定義するところやね。setItemといっしょにしないのは、結果画面などでボタン表示しない場面が良くあるからやで。またこのメソッドはname属性の値を引き渡しするようにしてるんやけど、その理由はボタンのname属性を全ての場面で変更することにより、各場面での処理を決定しているからやねん。詳しくは処理制御のソースコード(index.php)見てね。
setReturnSubmit フォームの送信ボタン、戻るボタンを定義するところやね。
setReturn フォームの戻るボタンを定義するところやね。
setVal setItemで定義した項目内容に対して、値を設定するところやね。
dispForm 今まで定義した項目内容を表示するところやね。
freezeForm 今まで定義した項目内容の入力項目を入力フォームの表示から、表示のみ(非入力項目)にしてやります。

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, '&nbsp;');
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回目は終了。お疲れさんでしたー。
たぬき おっお疲れさんでした・・・

インフォメーションへ戻る 第1回 PHPのコードとHTMLタグ コラム
  第2回 HTML_QuickFormを使ってみよう
  第3回 HTML_QuickFormを使ってみよう(パート2) HTML_QuickForm Memo
  第4回 Smartyを使ってみよう HTML_QuickForm Menu
  第5回 HTML_QuickFormとSmartyを使ってみよう HTML_QuickForm Smarty Tips
  第6回 HTML_QuickFormとSmartyを使ってみよう(パート2) Mojavi Memo
  第7回 実践編 HTML_QuickFormとSmartyを使ってみてどうよ? Ajax Memo
  第8回 HTML_QuickForm_Controller大好き!
  第9回 Mojaviのまとめ
  第10回 Ajax使ってみました
  第11回 PHPEclipse開発環境設定
  第12回 Eclipse+PHPIDEインストール記
  第13回目 PHPIDEによるデバック
  第14回目 Selenium IDEを使ってみました
  第15回目 PDT(旧 PHPIDE)のインストール、デバック