WEB/システム/IT技術ブログ

FuelPHPのValidationクラスを使ってフォームの項目チェックを実装する

FuelPHPのValidationクラスを使ってフォームの項目チェックを実装します

例えば、フォームで入力された「ユーザ名」の入力必須をチェックします。

ユーザ名:<input type="text" name="username" value="">

「投稿する」などsubmitボタン押下時に、コントローラ内でValidationを実行します。
上記のHTMLからポストされた「ユーザ名」の必須チェックを行う場合、以下のように記述します。

$val = Validation::forge();
$val->add('username', 'ユーザ名')
	->add_rule('required');
if($val->run()){
	// チェックOK
}else{
	// 入力エラー
}

関数「add」の第1引数に要素名、第2引数に要素のラベルを設定します。ラベルはエラーメッセージの表示の際などに利用されます。
「add_rule」に「required」を設定することで必須チェックをします。
「run」でValidationを実行し、入力内容に問題がなければtrueが返されます。この判定で、DBへのデータの入出力や、どのviewで画面を表示するかなどの処理を分岐させることができます。

その他にも、「max_length」で最大文字数チェック、「valid_email」で有効メールアドレスチェックなど、デフォルトで基本的なバリデーションルールが用意されています。複数のチェックを適用するためには、数珠つなぎでルールを設定します。

$val->add('username', 'ユーザ名')
	->add_rule('required');
	->add_rule('max_length', 16);

エラーメッセージを制御する

「$val->run()」でfalseだった場合に、「$val->error()」でエラーメッセージを取得することができます。
エラーの際にはこれをビューに渡して、エラーメッセージを画面に表示させればよいのです。
例えば上記の例で、必須チェックエラーの場合、以下のように配列で格納されます。

print_r($val->error());
Array(["username"] = "「ユーザ名」は必須入力です。")

さて、本家のFuelPHPでは日本語のエラーメッセージは用意されていません。
エラーメッセージについては、ファイル「/fuel/app/lang/ja/validation.php」で設定することができます。
以下のようにValidationルールごとにメッセージを設定できます。

return array(
	'required'      => '「:label」は必須入力です。',
	'min_length'    => '「:labe」は、:param:1 文字以上で入力して下さい。',
	'max_length'    => '「:label」は、:param:1 文字以下で入力して下さい。',
(略)

「:label」の部分が関数「add」で設定したラベル名、「:param:1」部分が関数「add_rule」の第2引数以降で設定した値に置き換わり、エラーメッセージとしてセットされます。

独自のバリデーションルールを設定する

先ほども述べたように、本家のFuelPHPは日本語が用意されていないため「半角/全角チェック」などのValicationルールがありません。
そこで独自で作成してみます。
まず、任意のクラス「fuel/app/classes/myvalidation.php」を用意します。

class MyValidation{
	public static function _validation_onebyte($val){
		if (preg_match("/^[0-9A-Za-z]+$/", $val)) {
			return true;
		} else {
			return false;
		}
	}
}

上記は文字列が半角かどうかチェックするルールです。
関数名「_validation_onebyte」の「_validation_」は固定で、「onebyte」は任意のValidationルール名となります。

これを先ほどのユーザ名にチェックに適用するためには、以下のように記述します。

$val = Validation::forge();
$val->add_callable('MyValidation');
$val->add('username', 'ユーザ名')
	->add_rule('required')
	->add_rule('onebyte');

関数「add_callable」で、追加するValidationルールのクラス名を指定します。

先ほどと同様に、エラーメッセージもルール名を指定して設定できます。

	'onebyte'      => '「:label」は半角で入力してください。',

クラスMyValidation内でモデルをロードすれば、DBにINSERTする際のレコード重複チェックなどもできます。

以上、Validationクラスの基本的な使い方です。
うまく使えば、チェック処理をきれいに整理することができると思います。
さらにValidationクラスを継承しているFieldsetクラスを使えば、ビューへのフォームやエラーメッセージのHTML出力を自動化できますが、
レイアウトの自由度が低くなるので、個人的にはあまり好きではありません。

B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives