ユーザー「入力値」の妥当性を、システム側で「検証」し、適切に処理すること。
バリデーションとは【validation】(バリデート) - IT用語辞典
別名 :validate
検証(する)、実証(する)、認可(する)、妥当性確認、などの意味を持つ英単語。
ITの分野では、対象がその仕様や文法などに照らして適切に記述・構築されているか否かを検証すること、という意味で使われる。
CodeIgniterで用意されているバリデーションクラスを利用して、ユーザーの入力値をチェックします。
データを受け取るページで、入力値のチェック処理を行います。
次の3つのファイルを用意します。
ファイル | 内容 |
入力ページのビュー | 入力フォームを設置したビューファイル |
結果ページのビュー | 送信が成功したときに、「成功」"メッセージを表示するビューファイル |
コントローラー | 送信されたデータを受け取り、処理できるようにしたコントローラ内のメソッド |
入力フォームのビューファイルを用意する。
applications/views/myform.php
#code(html){{
html>
<head> <title>マイフォーム</title> </head> <body> <?php echo validation_errors(); ?> <?php echo form_open('form'); ?> <h5>ユーザ名</h5> <input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" /> <h5>パスワード</h5> <input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" /> <h5>パスワードの確認</h5> <input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" /> <h5>メールアドレス</h5> <input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" /> <div><input type="submit" value="送信" /></div> </form> </body>/html>
}}
バリデーションの結果を表示するビューファイルを用意する。
applications/views/formsuccess.php
#code(html){{
html>
<head> <title>マイフォーム</title> </head> <body> <h3>フォームは正しく送信されました!</h3> <p><?php echo anchor('form', 'もう一度!'); ?></p> </body>/html>
}}
入力ページを制御するコントローラーファイルを用意する。
applications/controllers/form.php
#code(php){{
?php
class Form extends CI_Controller {
function index() { $this->load->helper(array('form', 'url')); $this->load->library('form_validation');
$this->form_validation->set_rules('username', 'ユーザ名', 'required'); $this->form_validation->set_rules('password', 'パスワード', 'required'); $this->form_validation->set_rules('passconf', 'パスワードの確認', 'required'); $this->form_validation->set_rules('email', 'メールアドレス', 'required'); if ($this->form_validation->run() == FALSE) { $this->load->view('myform'); } else { $this->load->view('formsuccess'); } }
}
?>
}}
バリデーションクラスのset_rules()メソッドを使って検証ルールを設定します。
$this->form_validation->set_rules();
set_rules()メソッドに、3つの引数を指定します。
引数 | 引数の順番 | 内容 |
フォーム名 | 1番目 | フォームの name 属性に指定した値 |
フォームの表示名 | 2番目 | 「user」という入力フィールドの表示名として「名前」等 |
フォームに設定する検証ルール | 3番目 | 'required', 'max_length[12]'等、CodeIgniterで用意されている値 |
コントローラ (form.php) の中で、バリデーションクラスを初期化(ロード)した後、set_rules()メソッドを使います。
#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'required');
$this->form_validation->set_rules('password', 'パスワード', 'required');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
$this->form_validation->set_rules('email', 'メールアドレス', 'required');
}}
一回で全ての検証ルールを設定したい場合、set_rules()メソッドの引数を配列にします。
引数の配列は、検証ルール設定メソッドを通る配列の形式で記述しなければいけません。
#code(php){{
$config = array(
array( 'field' => 'username', 'label' => 'ユーザ名', 'rules' => 'required' ), array( 'field' => 'password', 'label' => 'パスワード', 'rules' => 'required' ), array( 'field' => 'passconf', 'label' => 'パスワードの確認', 'rules' => 'required' ), array( 'field' => 'email', 'label' => 'メールアドレス', 'rules' => 'required' ) );
$this->form_validation->set_rules($config);
}}
set_rules()メソッドの、3番目の引数である「検証ルール」は、複数のルールを指定できます。
各ルールは「|」でつなげて記述します。
#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'パスワード', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
$this->form_validation->set_rules('email', 'メールアドレス', 'required|valid_email');
}}
上記の例では、
バリデーションの機能は、データの整形をすることもできます。
たとえば、以下のように、ルールを追加することができます。
#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'trim|required|min_length[5]|max_length[12]|xss_clean');
$this->form_validation->set_rules('password', 'パスワード', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'trim|required');
$this->form_validation->set_rules('email', 'メールアドレス', 'trim|required|valid_email');
}}
上記の例では、
コールバックメソッドを作ると、独自の検証ルールを設定できます。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#callbacks
プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。
呼び出し先の関数の引数としてコールバック関数への参照情報を渡すことで、呼び出し先から任意のコールバック関数を実行させ、コールバック関数に実行制御を移すことができる。
電話を相手に一度かけて電話番号のみを伝え、いったん電話を切って折り返し相手からかけなおしてもらう様子(これを「コールバック」という)に似ているためこの名前がついた。コールバック関数は、呼び出し先で何らかのイベントが発生した場合の処理を指定する目的で使われることが多い。
コールバック関数を使うと、イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる。
CodeIgniterのバリデーションクラスは、検証ルールを設定するset_rules()メソッドの第3引数によって、他のメソッド(=コールバックメソッド)を呼び出す仕組みになっており、いろいろな検証作業をさせることができます。
system/libraries/Form_validation.php
のソースコードを見ると、仕組みの詳細が分かります。
以下は、ユーザーが独自に定義できる検証作業(=コールバックメソッドを自前で用意する方法)の説明になります。
ユーザ定義の検証メソッドへのコールバックが、CodeIgniterでサポートされています。
この機能を使えば、検証ルールを拡張することができます。
例えば、ユーザー名の登録において、固有の名前かどうかを調べるためにデータベースを参照する必要がある場合など、コールバックメソッドを作って調べることができます。
これは、次のような方法でできます。
#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'callback_username_check');
}}
#code(php){{
?php
class Form extends CI_Controller {
function index() { $this->load->helper(array('form', 'url')); $this->load->library('form_validation');
$this->form_validation->set_rules('username', 'ユーザ名', 'callback_username_check'); $this->form_validation->set_rules('password', 'パスワード', 'required'); $this->form_validation->set_rules('passconf', 'パスワードの確認', 'required'); $this->form_validation->set_rules('email', 'メールアドレス', 'required');
if ($this->form_validation->run() == FALSE) { $this->load->view('myform'); } else { $this->load->view('formsuccess'); } }
// callback method for original validation rules function username_check($str) { if ($str == 'test') { $this->form_validation->set_message('username_check', 'フィールド %s に、"test"は使えません'); return FALSE; } else { return TRUE; } }
}
?>
}}
set_rules()メソッドの第3引数で、自前で用意したコールバックメソッドを呼び出すには、「callback_」+「コールバックメソッド名」という値を指定すればOKと。
CodeIgniterのバリデーションクラスで用意されている既存の検証ルールではチェックできない条件も、自前でコールバックメソッドを用意すればチェックできるようになります。
正規表現を使った細かいチェック等をやりたい場合に便利な機能ですね!
例:郵便番号の形式「123-4567」に合致しているかチェックする等。
バリデーションクラスのrun()メソッドで、ユーザー入力値の検証を実行します。
$this->form_validation->run();
run()メソッドは、ユーザー入力値の検証を実行し、
成功時は、入力値に基づいて、必要な処理を行う。
失敗時は、ユーザーに再入力させる → 入力フォームを再表示する。
run()メソッドは、検証ルールの「グループ名」を引数として渡せます。
検証ルールのグループ名とは、複数の検証ルールを配列の形(=グループ)で設定してある場合の、個別のルールの名前です。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#savingtoconfig
コントローラーの記述例:
#code(php){{
$config = array(
'signup' => array( array( 'field' => 'username', 'label' => 'ユーザ名', 'rules' => 'required' ), array( 'field' => 'password', 'label' => 'パスワード', 'rules' => 'required' ), array( 'field' => 'passconf', 'label' => 'パスワードの確認', 'rules' => 'required' ), array( 'field' => 'email', 'label' => 'メールアドレス', 'rules' => 'required' ) ), 'email' => array( array( 'field' => 'emailaddress', 'label' => 'メールアドレス', 'rules' => 'required|valid_email' ), array( 'field' => 'name', 'label' => '名前', 'rules' => 'required|alpha' ), array( 'field' => 'title', 'label' => 'タイトル', 'rules' => 'required' ), array( 'field' => 'message', 'label' => 'メッセージ本文', 'rules' => 'required' ) )
);
if ($this->form_validation->run('signup') == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}}
Formヘルパーのvalidation_errors()関数を使って、入力値の検証結果(エラーメッセージ)を表示させることができます。
validation_errors()
validation_errors()関数は、Formヘルパーをロードしないと使えないので注意!
$this->load->helper('form');
validation_errors()関数は、バリデーションクラスのバリデータが返すエラーメッセージを取得して、出力します。
メッセージがなければ、何も出力しません。
(注意:run()メソッドを実行して、検証した後じゃないと、バリデーションクラスからエラーメッセージを取得できません。)
入力ページで、エラーメッセージを表示させる場所に、以下のように記述します。
#code(php){{
?php echo validation_errors(); ?>
}}
validation_errors()は、以下の場所で定義されています。
ファイル:
system/helpers/form_helper.php
関数定義:
#code(php){{
/**
* Validation Error String * * Returns all the errors associated with a form submission. This is a helper * function for the form validation class. * * @access public * @param string * @param string * @return string */
if ( ! function_exists('validation_errors'))
{
function validation_errors($prefix = '', $suffix = '') { if (FALSE === ($OBJ =& _get_validation_object())) { return ''; }
return $OBJ->error_string($prefix, $suffix); }
}
}}
Formヘルパーのset_value()関数を使って、ユーザーの入力値を、入力ページで、再表示させることができます。
set_value()
set_value()関数は、Formヘルパーをロードしないと使えないので注意!
$this->load->helper('form');
set_value()関数は、バリデーションクラスのバリデータが返すユーザーの入力値を取得して、出力します。
元々の入力値がなければ、何も出力しません。
(注意:run()メソッドを実行して、検証した後じゃないと、バリデーションクラスから入力値を取得できません。)
入力ページで、ユーザーの入力値を再表示させる場所に、以下のように記述します。
#code(php){{
?php echo set_value('username'); ?>
}}
具体的には、
#code(html){{
h5>ユーザ名</h5>
input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
}}
set_value()は、以下の場所で定義されています。
ファイル:
system/helpers/form_helper.php
関数定義:
#code(php){{
/**
* Form Value * * Grabs a value from the POST array for the specified field so you can * re-populate an input field or textarea. If Form Validation * is active it retrieves the info from the validation class * * @access public * @param string * @return mixed */
if ( ! function_exists('set_value'))
{
function set_value($field = '', $default = '') { if (FALSE === ($OBJ =& _get_validation_object())) { if ( ! isset($_POST[$field])) { return $default; }
return form_prep($_POST[$field], $field); }
return form_prep($OBJ->set_value($field, $default), $field); }
}
}}
フォームの名前には、配列を使うことができます。
フォームの名前に配列を使う場合、set_value()関数の引数も、配列の形で指定します。
#code(html){{
input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />
}}
※詳しくは、CodeIgniterのマニュアルを見てください。\(手抜き)/
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#arraysasfields
$this->load->library('form_validation'); $this->load->helper('form');
CodeIgniterは、便利だな~!(・∀・)