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出力を自動化できますが、
レイアウトの自由度が低くなるので、個人的にはあまり好きではありません。
コメントする