TOP > 読み物 > PHP: ぴゅーっと速くプログラミング > フレームワークを作ってみよう(7)

PHP: ぴゅーっと速くプログラミング

フレームワークを作ってみよう(7)

実践編2の前に

さて、前回こんな話がありました。

「足し算CGIを作れ」という課題にも関わらず、四則演算できるようにまでしてくれてます。 しかもちゃんとpreg_match()を使って入力チェックまで。 実はO君は、PHPはこれが初めてなんですよ。 びっくりです。 強いて言えばform.html<select>タグのところ。 もうちょっと工夫できる余地がありそうですよね。 ここのところは今後解説する予定です。

該当部分を再掲してみましょう。

form.html: download source

  1: <h1>算数</h1>
  2: 
  3: <?php if($this->error); ?>
  4: <p><b><font color="red"><?=$this->error ?></font></b></p>
  5: <?php endf ?>
  6: 
  7: <form action="<?= MYSELF ?>" method="POST">
  8: <input type="hidden" name="action" value="done">
  9: <input type="text" name="x" value="<?= $this->_x ?>">
 10: <select name="cal">
 11: <option value="+">+
 12: <option value="-">-
 13: <option value="*">×
 14: <option value="/">÷
 15: <input type="text" name="y" value="<?= $this->_y ?>"><br>
 16: <input type="submit" name="ok" value="答え">
 17: <input type="submit" name="cancel" value="リセット">
 18: </form>

<select>が閉じてないのはご愛嬌として(そもそも彼はPHPどころかCGIも初めて…)、 とりあえず X や Y の値はページを跨いでも保存されているのに対し、 演算子は覚えてくれないのは寂しいですよね。 それに繰り返しが出てきたら「プログラムで何とかしてやろう」と思うのがプログラマです^^;

そこで僕が普段使ってるルーチンをご紹介します。 多分同様のものは多種存在するかとは思いますが、今のところ自作ので間に合ってます。 こんな感じ。

        :
function
_select($name, $hash, $selected = '')
{
  $ret = sprintf('<select name="%s">', $name);
  foreach ($hash AS $value => $label) {
    $ret .= sprintf('<option value="%s"', $value);
    if ($value == $selected) $ret .= ' SELECTED';
    $ret .= ">$label";
  }
  $ret .= '</select>';
  return $ret;
}
        :

使い方は実際の例を見てもらった方が早いかと思います。 フォームではこんな感じで書きます。11行目ですね。

form.html: download source

  1: <h1>計算</h1>
  2: 
  3: <?php if ($this->error): ?>
  4: <p><strong><font color="red"><?= $this->error ?></font></strong></p>
  5: <?php endif ?>
  6: 
  7: <form action="<?= MYSELF ?>" method="POST" />
  8: <input type="hidden" name="action" value="done" />
  9: X
 10: <input type="text" name="x" value="<?= $this->_x ?>" />
 11: <?= _select('operator', $this->labelOperator, $this->operator) ?>
 12: Y
 13: <input type="text" name="y" value="<?= $this->_y ?>" />
 14: =
 15: <input type="submit" value="計算" />
 16: </form>

_select()の第二引数になってる$this->labelOperatorですが、 メイン処理の方で定義しています。こんな感じです。

calc.php: download source

  1: <?php
  2: 
  3: require('framework.php');
  4: require('form.php');
  5: 
  6: class
  7: Calc extends framework
  8: {
  9:   function
 10:   Calc()
 11:   {
 12:     $this->class_vars = array(
 13:       'action',
 14: 
 15:       'x',
 16:       'y',
 17:       'operator',
 18:     );
 19:     $this->labelOperator = array(
 20:       '' => '選択⇒',
 21:        1 => '+',
 22:        2 => '-',
 23:        3 => '×',
 24:        4 => '÷',
 25:     );
 26:     $this->import($this->class_vars);
 27: 
 28:     if (!$this->action) $this->action = 'form';
 29:   }
 30: 
 31:   function
 32:   form()
 33:   {
 34:   }
 35: 
 36:   function
 37:   check()
 38:   {
 39:     if (!$this->x) {
 40:       $err[] = 'Xを入力してください';
 41:     }
 42:     if (!$this->y) {
 43:       $err[] = 'Yを入力してください';
 44:     }
 45:     if (!$this->operator) {
 46:       $err[] = '演算子を選択してください';
 47:     }
 48:     if ($err) {
 49:       $this->error = '<ul><li>'. implode('<li>', $err). '</ul>';
 50:       return 0;
 51:     }
 52:     return 1;
 53:   }
 54: 
 55:   function
 56:   done()
 57:   {
 58:     if (!$this->check() || $this->cancel) {
 59:       $this->action = 'form';
 60:       return;
 61:     }
 62: 
 63:     switch ($this->operator) {
 64:     case 1:
 65:       $this->answer = $this->x + $this->y;
 66:       break;
 67:     case 2:
 68:       $this->answer = $this->x - $this->y;
 69:       break;
 70:     case 3:
 71:       $this->answer = $this->x * $this->y;
 72:       break;
 73:     case 4:
 74:       $this->answer = $this->x / $this->y;
 75:       break;
 76:     }
 77:   }
 78: }
 79: 
 80: $calc = new Calc();
 81: $calc->main();
 82: 
 83: // vi:ts=8 sw=2
 84: ?>

おわかりいただけますでしょうか? ちょっと難しいかな? 実行例はこんな感じです。 [ 実行例 ] 計算後、「もう一度」ボタンで戻ったときに演算子が保存されているのがご確認いただけるかと思います。

あ、一応計算結果表示画面はこんな感じになってます。 $this->_operatorの使い方(表示、次画面への渡し方)にご注目ください。

done.html: download source

  1: <h1>計算結果</h1>
  2: 
  3: <p>
  4: <b><?= $this->_x ?></b>
  5: <?= $this->labelOperator[$this->operator] ?>
  6: <b><?= $this->_y ?></b>
  7: =
  8: <b><?= $this->answer ?></b><br />
  9: です。
 10: </p>
 11: 
 12: <form action="<?= MYSELF ?>" method="POST">
 13: <input type="hidden" name="action" value="form" />
 14: <input type="hidden" name="x" value="<?= $this->_x ?>" />
 15: <input type="hidden" name="y" value="<?= $this->_y ?>" />
 16: <input type="hidden" name="operator" value="<?= $this->_operator ?>" />
 17: <input type="submit" value="もう一度" />
 18: </form>

次回はこれを使って、また課題にチャレンジしてもらう予定です。


[ 前へ | 次へ ]