前回の日記「[FuelPHP]フォームのバリデーションとカスタムメッセージ」の続きで
自分ルールのバリデーションを作るメモです。
fuel/app/classes/myvalidation.php に記述します。
名前:no_same_chara
ルール:
「chara1」「chara2」「chara3」3つのフィールドに重複があれば false。
ただし内容が「chara_none」なら除外する。
<?php class MyValidation { public static function _validation_no_same_chara($val) { $chara1 = Input::post('chara1'); $chara2 = Input::post('chara2'); $chara3 = Input::post('chara3'); if( $chara1 == $chara2 && $chara1 != 'chara_none' ) return false; if( $chara1 == $chara3 && $chara1 != 'chara_none' ) return false; if( $chara2 == $chara3 && $chara2 != 'chara_none' ) return false; return true; } }
いきなり引数 $valを無視してますw
普通に項目の内容を検証するには下記のようにします。
public static function _validation_test_validation( $val ) { return $val == "ABC" ? true : false; }
オプションを与えることもできます。
オプションの必要なルールだと「max_length」が良い例ですね。
下記ではエラーメッセージも同時に設定しています。
public static function _validation_test_validation( $val, $option ) { Validation::active()->set_message('test_validation', ':label は「'.$option.'」じゃない。'); return $val == $option ? true : false; }
前回の記事でメッセージのカスタマイズについて書いたように
fuel/app/lang/ja/validation.php
に記述してもかまいません。
フォームから入力されたデータの検証(Validation)についてのメモです。
FuelPHPでフォームを扱うにはひとつひとつViewに記述していく方法と、
Fieldsetクラスを使ってまとめて管理する方法があるようです。
Fieldsetクラスを使うほうが FuelPHPらしいのですが、
Fieldset->build() で出力される HTMLが目的と違うので
今回はひとつひとつ書いていきました。
echo Form::open('entry/confirm'); echo Form::label('名前','name'); echo Form::input('name', Input::post('name'), array('class'=>'intput-middle')); echo Form::label('メールアドレス','email'); echo Form::input('email', Input::post('email'), array('class'=>'intput-middle')); echo Form::submit('submit', '確認'); echo Form::close();
バリデーションのやり方は簡単で、Validationクラスのインスタンスを作れば
フォームの内容は自動的に格納されます。
$validation = Validation::forge(); $validation->add( 'name', 'お名前' ) ->add_rule('required'); $validation->add( 'email', 'メールアドレス' ) ->add_rule('valid_email') ->add_rule('required');
forge()でインスタンスを作り、add()、add_rule()で
項目とバリデーションルールを設定します。
ルールはこのへんが標準で用意されています。
if( $validation->run() ) { // 問題ない時の処理 } else { // 問題ある時の処理 // エラーの項目とメッセージの連想配列を取得 $errors = $validation->error(); // エラーメッセージ用HTMLを取得 $error_html = $validation->show_errors(); // 検証に使用した入力値を項目と値の連想配列で取得 $error_input = $validation->input(); }
run()でバリデーションを行い、エラーの場合はその結果を取得します。
show_errors()の結果は HTMLなので、そのままビューに渡すとエスケープされてしまいます。
set_safe() で渡すことで HTMLのままになります。
$this->template->content = View::forge( 'entry/index', Array( 'errors' => $errors, 'error_input' => $error_input )); $this->template->content->set_safe( 'error_html', $error_html );
上記は Controllerクラスの継承ではなく Controller_Templateクラスの継承の場合です。
Controllerの場合は下記のように記述します。
$view = View::forge( 'entry/index', Array( 'errors' => $errors, 'error_input' => $error_input )); $view->set_safe('error_html', $error_html);
fuel/core/lang/en/validation.php をコピーし
fuel/app/lang/ja/validation.php に保存します。
バリデーション項目ごとに記述されているので自分の好きなように編集します。
return array( 'required' => ':label が入力されていません。', 'valid_email' => ':label の書式が正しくありません。', ~略~ );
初期状態では英語設定なので、日本語設定にします。
fuel/app/config/config.php の下記の部分を書き換えます。
'language' => 'ja', 'language_fallback' => 'ja',
以上のようにバリデーションと、メッセージのカスタマイズが行えます。
下記サイトがとても詳して大変参考にさせていただきました。