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

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

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

画面ごとの処理

前回までは画面表示して終わりでした。 今回は画面ごとに処理を組み込んでみます。 クラス定義を次のように改造します。

framework.php: download source

  1: <?php
  2: /*
  3:  * framework.php
  4:  *   Copyright (C) YAMADA Satoshi
  5:  */
  6: 
  7: define('MYSELF',  $_SERVER['PHP_SELF']);
  8: 
  9: class
 10: framework
 11: {
 12:   function
 13:   framework()
 14:   {
 15:   }
 16: 
 17:   function
 18:   import($array)
 19:   {
 20:     $this->set($_GET, $array);
 21:     $this->set($_POST, $array);
 22:   }
 23: 
 24:   function
 25:   set($hash, $array)
 26:   {
 27:     foreach ($array as $name)
 28:       if (isset($hash[$name]))
 29:         $this->$name = $hash[$name];
 30:   }
 31: 
 32:   function
 33:   main()
 34:   {
 35:     if (method_exists($this, $this->action)) $this->{$this->action}(); // 追加
 36:     include "$this->action.html";
 37:   }
 38: }
 39: 
 40: // vi:ts=8 sw=2
 41: ?>

と言っても35行目を追加しただけです。 これだけで画面ごとの処理が可能になります。

これに対応したサンプルソースはこんな感じです。

sample.php: download source

  1: <?php
  2: 
  3: require('framework.php');
  4: 
  5: class
  6: sample extends framework
  7: {
  8:   function
  9:   sample()
 10:   {
 11:     $this->class_vars = array(
 12:       'action',
 13: 
 14:       'name',
 15:       'email',
 16: 
 17:       'ok',
 18:       'cancel',
 19:     );
 20:     $this->import($this->class_vars);
 21: 
 22:     if (!$this->action) $this->action = 'form';
 23:   }
 24: 
 25:   function
 26:   form()
 27:   {
 28:     $this->name  = '名前';
 29:     $this->email = 'メールアドレス';
 30:   }
 31: 
 32:   function
 33:   check()
 34:   {
 35:     if (!$this->name) {
 36:       $err[] = '名前を入力してください';
 37:     }
 38:     if (!$this->email) {
 39:       $err[] = 'メールアドレスを入力してください';
 40:     }
 41:     if ($err) {
 42:       $this->error = '<ul><li>'. implode('<li>', $err). '</ul>';
 43:       return 0;
 44:     }
 45:     return 1;
 46:   }
 47: 
 48:   function
 49:   confirm()
 50:   {
 51:     if (!$this->check()) {
 52:       $this->action = 'form';
 53:       return;
 54:     }
 55:   }
 56: 
 57:   function
 58:   done()
 59:   {
 60:     if (!$this->check() || $this->cancel) {
 61:       $this->action = 'form';
 62:       return;
 63:     }
 64: 
 65:     // 例えば...
 66:     // ・mb_send_mail($this->email, $subject, $body);
 67:     // ・INSERT INTO member (name, email) VALUES ($this->name, $this->email);
 68:   }
 69: }
 70: 
 71: $sample = new sample();
 72: $sample->main();
 73: 
 74: // vi:ts=8 sw=2
 75: ?>

要はHTMLファイルと同じように、フォーム変数actionと同じ名前のメソッドを用意するだけです。画面遷移を変更したい場合は$this->actionの値を変更します。

各テンプレートですが、今回はフォーム画面にエラーを表示するために、その部分だけ追加しました。 それから確認画面でフォームに戻る(JavaScriptでなく)ことができるようにもしてみました。 あとは前回のと同じです。

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="confirm" />
  9: 名前: <input type="text" name="name" value="<?= $this->name ?>"><br />
 10: メールアドレス: <input type="text" name="email" value="<?= $this->email ?>"><br />
 11: <input type="submit" value="次へ" />
 12: </form>

confirm.html: download source

  1: <h1>確認</h1>
  2: 
  3: <form action="<?= MYSELF ?>" method="POST">
  4: <input type="hidden" name="action" value="done" />
  5: <input type="hidden" name="name" value="<?= $this->name ?>" />
  6: <input type="hidden" name="email" value="<?= $this->email ?>" />
  7: 名前: <strong><?= $this->name ?></strong><br />
  8: メールアドレス: <strong><?= $this->email ?></strong><br />
  9: <input type="submit" name="ok" value="次へ" />
 10: <input type="submit" name="cancel" value="戻る" />
 11: </form>

done.html: download source

  1: <h1>完了</h1>
  2: 
  3: <p>完了しました。</p>
  4: 
  5: 名前: <strong><?= $this->name ?></strong><br />
  6: メールアドレス: <strong><?= $this->email ?></strong><br />

実行例で名前やメールアドレスを空にしてみたり、戻るを選んでみたりして試してみてください。 [ 実行例 ]


[ 前へ | 次へ ]