Mojavi 初心者講座 validate
フォームのチェック
今回はフォームから与えられる値をチェックする一連の工程について解説します。
独自のバリデートメソッドを使う
バリデートには独自のバリデートメソッドを使う方法と、既定のバリデートクラスを使う方法があります。ここでは簡単な独自バリデートメソッドでのやり方を説明します。
バリデートメソッドはアクションの中に書きます。先ほどの足し算のプログラムを使って、10以下の数値を入れてはいけないという設定にしてみます。
アクション
先ほどのプログラムIndexAction.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; } }
これにvalidate()というメソッドを追加します。
public function validate(){ $request = $this->getContext()->getRequest(); if( $request->getParameter( 'value_1' ) > 10 || $request->getParameter( 'value_2' ) > 10 ){ $request->setError( 'error', '10以下の値を入れて下さい。' ); return false; } return true; }
validate()メソッドはtrue、又はfalseを返さなければなりません。エラーがあった場合はfalseを返します。
よって、上記のコードでは、value_1、またはvalue_2の値が10以上だった場合falseを返すようにしています。
$request->setError( 'error', '10以下の値を入れて下さい。' );
はrequestオブジェクトのerrorsプロパティに「error」というキーでエラーメッセージを設定しています。これは、前述のattibuteと同様の方法でビューで取得し、テンプレートHTMLへ反映させます。
エラーが無い場合は、execute()を実行します。
エラービューの作成
現時点までで、ビュー名は、
INTPUT フォーム表示 SUCCESS フォーム結果表示
を学びました。次に、エラーを表示するERRORビューを作ります。
エラーがあった場合、つまり、validate()がfalseを返した場合、自動的にビュー名はERRORになります。
よって、これから作るエラー表示ビュークラスは以下のようになります。
ファイル名: IndexErrorView.class.php クラス名: Test_IndexErrorView
実際のコード
class Test_IndexErrorView extends PHPView{ public function execute(){ $this->setDirectory( MO_WEBAPP_DIR . '/templates/Test' ); $this->setTemplate( 'IndexError.html' ); $request = $this->getContext()->getRequest(); $this->setAttribute( 'error', $request->getError( 'error' ) ); } }
フォーム表示部分と微妙に異なるのは以下の部分です。 テンプレート名がIndexError.htmlとなっています。
また、
$this->setAttribute( 'error', $request->getError( 'error' ) );
とし、先ほどRequestオブジェクトにセットしたエラーメッセージを取得し、テンプレートに渡せるようにセットします。
エラー表示テンプレートの作成
エラー表示のテンプレート名は分かりやすいように、
IndexError.html
とします。
実際のコードは
<?= $template['error'] ?>
のみで結構です。これでエラーがあった場合
10以下の値を入れて下さい。
と表示されます。
既定のバリデータクラスを使う
上記のように毎回バリデータメソッドを書いていては、作業効率が悪いので、たいていは、既に定義されているバリデータクラスを使います。
これをするには、↑ページトップへ戻る
バリデート定義ファイル
メソッド部分
[methods] get = "" post = "value_1, value_2"
これは、POSTメソッドで受け取った場合のnameを序列しています。ここで指定したnameに対応する値にバリデータをかけます。
ネーム部分
[names]
value_1.required = "Yes"
requiredは、value_1が必須項目なのかどうかを表記します。記入されないで送信した場合エラーを返す設定です。
value_1.required_msg = "一番目の数字を入力して下さい。"
required_msgは未記入でvalue_1を送信した場合のエラーメッセージです。
value_1.validators = "numValidator"
validatorsはこの値をチェックするバリデータの名前を記入します。これは、以下のバリデータ項目と対応します。
バリデータ部分
[numValidator]
上記で設定したバリデータ名をここに記入します。つまり、value_1ではnumValidator以下で設定したバリデータを使う、という意味になります。
class = "NumberValidator"
使用するバリデータクラスを設定します。バリデータクラスには、
NumberValidator: 数値チェック
StringValidator: 文字列チェック などがあります。
param.max = "10"
value_1の最大値を設定します。これを超えるとエラーになります。
param.max_error = "10以下の数字を入力して下さい。"
最大値のエラーが出た場合のエラーメッセージです。
これを書いておけば、validate()を書かなくても、自動的にバリデートをしてくれます。つまり、上記で設定した評価基準に満たない場合、エラーになり、ERRORビューを読み込みます。
成功の場合はexecute()を実行します。
あと、ビューの
$this->setAttribute( 'error', $request->getError( 'error' ) );
の部分を以下のように書き換えてください。
$this->setAttribute( 'error', join( "<br>", $request->getErrors() ) );
getErrors()はRequestオブジェクトのプロパティのerrors配列を丸ごと取得します。
バリデート設定ファイルを書いた場合はエラーが配列で”errors’に入っているので、これをテンプレートに表示するには、配列をjoinしておくか、テンプレートでforeachなどで表示する必要があります。