Mojavi初心者講座 フォームの入力
今回はフォームの入力をやってみましょう。フォームを使った簡単な足し算をしてみます。
ディレクトリ構造は以下のようになります。
【modules】 【Test】 【actions】IndexAction.class.php 【views】 IndexInputView.class.php IndexSuccessView.class.php 【config】 module.ini 【template】 IndexInput.html IndexSuccess.html
まず最初にフォームを表示する部分
index.php?module=Test
を作成します。
テンプレートの作成
ビュー名にはINPUTというものもあり、これは主にフォームを表示する時に使います。今回はこれを使います。
よって「フォーム表示」のテンプレートの名前は
IndexInput.html
とします。Successの部分がInputに変わった点に注意が必要です。
テンプレートは以下のようになります。
<form action="index.php?module=Test" method="post"> <input type="text" name="value_1" value=""> + <input type="text" name="value_2" value=""> <input type="submit" value="send"> </form>
value_1とvalue_2を足すだけの単純なプログラムです。
ビューの作成
今回はビュー名がINPUTなので、ビューの名前を
IndexInputView.class.php
とします。
class Test_IndexInputView extends PHPView { public function execute(){ $this->setDirectory( MO_WEBAPP_DIR . '/templates/Test' ); $this->setTemplate( 'IndexInput.html' ); } }
フォーム表示部分ではテンプレートHTMLで変数を使わないので、execute()の中には、ディレクトリとテンプレートの設定以外何も書かなくて結構です。
アクションの作成 – ロジックの実行
今回は、execute()内にフォームの値を計算するロジックを書く必要があります。
ところで、テンプレートのフォームで
<form action="index.php?module=Test" method="post">
と書きました。つまり、アクションはデフォルトのIndexなので、計算のロジックにも、フォーム表示と同じアクション(IndexAction.class.php)のファイルを使用します。もちろん、違うファイルを使用しても結構です。
実際のコードは前回とかなり変わります。部品に分けて考えてみましょう。
まず重要なのは、execute()というメソッドの意味です。execute()は主にフォームの入力があった場合にロジックを実行するためのメソッドです。よって、フォームから値を受け取った時のみexecute()を実行するように設定する必要があります。
そこで、フォームから値を受け取ったということを感知するための手法が必要です。それは下記のようにします。
class Test_IndexAction extends Action{ public function getRequestMethods(){ return Request::POST; }
こう書くと、フォームからPOSTで値を受け取った場合、execute()を実行し、何も受け取っていない場合は、execute()を実行せずに、ビュー名がINPUTのビューを実行します。
つまり、フォームの送信ボタンを押さない限り、
index.php?module=Test
にアクセスすると
IndexInputView.class.php
が実行され、
IndexInput.html
が表示されることになります。
一方、execute()を通った場合はたいてい、ビュー名がSUCCESSのビューを実行することになります。これは次の項目で説明します。
アクションの作成 – フォームの値の取得
フォームから渡された値を取得して加工するロジックはexecute()の中に書きます。
public function execute(){ $context = $this->getContext();
まず、$contextというオブジェクトを取得します。このオブジェクトには、
Request GET/POSTなどの値 User ユーザー情報 Storage セッション
などが含まれています。次に、
$request = $context->getRequest();
と書き、上記のうちのRequestの値、つまりGET/POSTのフォームから渡された値を持つオブジェクトを取得します。
この一連のコードは、
$request = $this->getContext()->getRequest();
で一文で書く事ができます。
Requestオブジェクトはフォームで渡された値をフォームのnameをキーとしたparametersという連想配列で保持しています。
次に、
$value_1 = $request->getParameter( 'value_1' ); $value_2 = $request->getParameter( 'value_2' );
と書きます。getParameter( ‘ ‘ )はリクエストオブジェクトから特定のパラメータを取得します。上記では、value_1とvalue_2として渡された値をそれぞれ取得しています。
アクションの作成 – ビューへの連結
次にこの二つを足します。
$result = $value_1 + $value_2;
さて、この値をビューに渡さなければなりません。そうしないと、ビューからテンプレートHTMLに変数として渡すことはできません。
$request->setAttribute( 'result', $result );
これで、リクエストオブジェクトのattributesプロパティに結果をセットしました。
最後に、どのビューを返すかを書きます。
return View::SUCCESS;
これは、SUCCESSというビューを返すという意味です。つまり、フォーム値の入力があった場合は
ビュー名がSUCCESSである
IndexSuccessView.class.php
に飛ぶという意味です。
以下が一連のコードです。
class Test_IndexAction extends Action{ public function getRequestMethods(){ return Request::POST; } public function execute(){ $request = $this->getContext()->getRequest(); $value_1 = $request->getParameter( 'value_1' ); $value_2 = $request->getParameter( 'value_2' ); $result = $value_1 + $value_2; $request->setAttribute( 'result', $result ); return View::SUCCESS; } }
ビューの作成 – 結果表示のビュー
上記の通り、フォームから値を受け取った場合に使うビュー名は、
IndexSuccessView.class.php
となります。
では実際のコードを書いてみましょう。
まずディレクトリとテンプレートを設定します。
class Test_IndexSuccessView extends PHPView{ public function execute(){ $this->setDirectory( MO_WEBAPP_DIR.'/templates/Test' ); $this->setTemplate( 'IndexSuccess.html' );
アクション同様にRequestオブジェクトを取得します。
$request = $this->getContext()->getRequest();
次に、先ほどアクションでRequestオブジェクトに入れたAttributeを取得します。
$result = $request->getAttribute( 'result' );
これを、テンプレートで変数として使えるようにします。
$this->setAttribute( 'result', $result ); }
あとはディレクトリとテンプレートファイル名を設定します。
結果表示のテンプレートのファイル名は
IndexSuccess.html
とすると分かり易いでしょう。
以下が一連のコードです。
class Test_IndexSuccessView extends PHPView{ public function execute(){ $this->setDirectory( MO_WEBAPP_DIR.'/templates/Test' ); $this->setTemplate( 'IndexSuccess.html' ); $request = $this->getContext()->getRequest(); $result = $request->getAttribute( 'result' ); $this->setAttribute( 'result', $result ); } }
これでビューは終了です。回りくどいやり方のような気もしますが、コードの分離と機能による分割は保守性の点において重要なので、これは必要なプロセスです。
テンプレートHTMLの作成 – 結果表示
結果表示のテンプレートは以下のようになります。
<?= $template['result'] ?>
これでフォームに入力した数値の足した数が表示されます。