スタイリッシュなシンタックスが特徴のフォームバリデーションライブラリです。
- チェーンメソッドを使った簡単なシンタックス
- バリデーションのルールとフォームの HTML のロジックが分離されている
- バリデーション用のフィルターを拡張できる
- フォームの HTML をルールを元に自動生成
- Ajax 対応
- 自動返信メール対応
- nonce 機能 (CSRF対策)
- CAPTCHA 対応 (スパム対策)
ファイルの一番最初でバリデーションのルールを設定します。
<?php
$cf = new Form(array(
'prefix' => 'cf',
'mail' => true,
'nonce' => 'gYxfXm30Q7hruJKB',
));
/* Validation Rules
-----------------------------------------------*/
$cf->add('name', true)->minlen(3)->maxlen(12);
$cf->add('email', true)->type('email');
$cf->add('birthdate')->filter('datetime', 'Y/m/d');
$cf->add('gender')->set_option(array(
'Male',
'Female',
));
$cf->add('color+')->set_option(array(
'Red',
'Orange',
'Yellow',
'Green',
'Blue',
'Indigo',
'Violet',
))->maxselect(3);
$cf->add('message')->maxlen(1000);
/* Send Email
-----------------------------------------------*/
$cf->submit(array(
'from' => 'Contact <[email protected]>',
'bcc' => '[email protected]',
'to' => 'email',
'subject' => 'Contact',
'body' => '
----------------------------------------
Timestamp: {{DATE}}
----------------------------------------
Name: {{name}}
----------------------------------------
Email: {{email}}
----------------------------------------
Birthdate: {{birthdate}}
----------------------------------------
Gender: {{gender}}
----------------------------------------
Colors:
{{color+}}
----------------------------------------
Message:
{{message}}
----------------------------------------
',
));
?>
<form id="cf" action="form.php" method="post">
<h3>Your name (required)</h3>
<div><?php $cf->html->text('name'); ?></div>
<h3>Email (required)</h3>
<div><?php $cf->html->text('email'); ?></div>
<h3>Birthdate</h3>
<div><?php $cf->html->text('date'); ?></div>
<h3>Gender</h3>
<ul><?php $cf->html->option('gender'); ?></ul>
<h3>Colors you like (select 3 at most)</h3>
<ul><?php $cf->html->option('color+'); ?></ul>
<h3>Message</h3>
<ul><?php $cf->html->textarea('message'); ?></ul>
<?php $cf->html->nonce(); ?>
<button type="submit">Send</button>
</form>
<script>
$('#cf').ajaxForm({
dataType : 'json',
data : {
_ajax_call : 1
},
success : function (data, status, xhr, $form) {
console.log(data);
if (data.processed == true) {
// successed
return true;
} else {
// failed
return false;
}
}
});
</script>
$cf = new Form($config);
Form
に連想配列を渡して設定をします。
キー | 型 | 初期値 | 説明 |
---|---|---|---|
prefix |
String | 'form' |
フォームの接頭辞。各フォームの要素の name と id の前に付きます。 |
ajax |
Bool | true |
Ajax で POST を処理するかどうかを指定します。Ajax 側で呼び出す際は _ajax_call=1 も POST するようにして下さい。 |
mail |
Bool | false |
結果をメールで送信するかどうかを指定します。 |
nonce |
String | '' |
nonce 機能を利用する際は必ず設定してください。これは nonce の乱数値を生成する時に使用します。値は16文字のできるだけ的当なものにして下さい。こちらのサイトトを利用すると良いかもしれません。 |
例
$cf->add($name [, $required]);
引数 | 型 | 説明 |
---|---|---|
$name |
String | 項目の名前です。英数字(a-zA-Z0-9)・アンダースコア(_)・ハイフン(-)を使って下さい。<input type="checkbox"> と <select> で複数の項目を選択させる場合は、名前の語尾に + を付けます。 |
$required |
Bool | 必須であれば true を指定します。必須でないときは、false を指定するか、引数の省略ができます。 |
$cf->add_captcha();
これだけです。
<input type="checkbox">, <input type="radio">, <select> に、選択できる項目を設定します。
例
$cf->add('color')->set_option(array(
'Red',
'Orange',
'Yellow',
'Green',
'Blue',
'Indigo',
'Violet',
));
複数選択させるには、名前の語尾に +
を付けます。
$cf->add('color+')->set_option(array(
'Red',
'Orange',
'Yellow',
'Green',
'Blue',
'Indigo',
'Violet',
));
項目を必須にします。
例
$cf->add('foo')->required(true);
引数 | 型 | 説明 |
---|---|---|
1 | Bool | 入力を必須にする場合は true を指定します。 |
なお、次の2つは全く同じ意味です。
$cf->add('foo')->required(true)
$cf->add('foo', true)
minlen
と maxlen
は入力された文字列の長さの下限と上限を指定します。
例: minlen
$cf->add('foo')->minlen(40)
引数 | 型 | 説明 |
---|---|---|
1 | Number | 文字列の長さの下限を指定します。入力がこの値より短いとエラーがでます。 |
mininum
と maximum
は入力された値を数値として評価し、その値の下限と上限を指定します。
例: maximum
$cf->add('foo')->maximum(40)
引数 | 型 | 説明 |
---|---|---|
1 | Number | 値の上限を指定します。入力がこの値より大きいとエラーがでます。 |
mininum
と maximum
は複数の値が選択できる項目の場合(<input type="checkbox">, <select>)に、選択できる個数の下限と上限を指定します。
select
は単に、選択できる個数を設定します。
例: maxselect
$cf->add('foo+')->set_option(array(
'aeuio',
'kakikukeko',
'sasisuseso',
))->maxselect(2)
引数 | 型 | 説明 |
---|---|---|
1 | Number | 選択できる項目の個数の上限を指定します。選択された項目の個数がこの値より多いとエラーがでます。 |
高度なバリデーションルールを設定します。
$cf->add('foo')->filter('email')
$cf->add('foo')->filter('tel')
$cf->add('foo')->filter('url')
$cf->add('foo')->filter('hiragana')
$cf->add('foo')->filter('katakana')
第2引数にフォーマット文字列を渡します。 フォーマットについては、PHP のマニュアルを参考にして下さい。
$cf->add('foo')->filter('datetime', 'Y-m-d')
$cf->add('foo')->filter('datetime', 'H:i:s')
機能は filter
とほとんど同じですが、フォームの要素の type
属性に値を設定する点において異なります。
例えば filter('email')
や filter('tel')
そして filter('url')
は、
こちらの type('email')
と type('tel')
と type('url')
を使うようにして下さい。
$cf->add('foo')->type('email')
$cf->add('foo')->type('tel')
$cf->add('foo')->type('url')
値を判定するのではなく、加工します。主にデータの正規化に利用します。
PHP の mb_convert_kana
関数を利用して、「半角」-「全角」変換を行います。
詳しいオプションについては PHP のマニュアルを参照下さい。
$cf->add('foo')->format('kana', 'asKV')
rule
のところでも出てきましたが、入力された日付についての詳細情報を連想配列で保存します。
詳しくは、PHP のマニュアルを参照下さい。
$cf->add('foo')->format('datetime', 'Y/m/d H:i')
関数の命名規則は validation_filter_{name}
です。
関数の呼び出しには、つぎの引数が渡されます。
引数 | 型 | 説明 |
---|---|---|
$call |
String | どちらの関数から呼ばれたのかを取得する際に使います。値は 'filter' か 'format' です。 |
$val |
Mixed | そのまんま値、データです。 |
$arg |
Array | filter や format に渡された第1引数以降が配列として取得出来ます。 |
例
filter('upper')
なら英字全部かどうかを判定するformat('upper')
なら英字を大文字に変換する
ような関数をつくってみます。
function validation_filter_upper($call, $val, $args = array()) {
if ('filter' == $call)
return !!preg_match('|^[A-Z]+$|', $val);
if ('format' == $call)
return strtoupper($val);
}
<?php $cf->html->text('foo'); ?>
生成例
<input type="text" name="cf-foo" id="cf-foo" />
<?php $cf->html->textarea('foo'); ?>
生成例
<textarea name="cf-foo" id="cf-foo"></textarea>
出力がチェックボックスかラジオボタンかは、名前の語尾に +
があるかどうかで自動で判断します。
<ul><?php $cf->html->option('foo'); ?></ul>
<ul><?php $cf->html->option('bar+'); ?></ul>
生成例
<ul>
<li><label><input type="radio" name="cf-foo" value="0" /> Option A</label></li>
<li><label><input type="radio" name="cf-foo" value="1" /> Option B</label></li>
<li><label><input type="radio" name="cf-foo" value="1" /> Option C</label></li>
</ul>
<ul>
<li><label><input type="checkbox" name="cf-bar[]" value="0" /> Option A</label></li>
<li><label><input type="checkbox" name="cf-bar[]" value="1" /> Option B</label></li>
<li><label><input type="checkbox" name="cf-bar[]" value="2" /> Option C</label></li>
</ul>
名前の語尾に +
がある場合は自動で multiple
属性が追加されます。
<?php $cf->html->select('foo'); ?>
<?php $cf->html->select('bar+'); ?>
生成例
<select name="cf-foo" id="cf-foo">
<option value="0">Option A</option>
<option value="1">Option B</option>
<option value="2">Option C</option>
</select>
<select name="cf-bar" id="cf-bar[]" multiple>
<option value="0">Option A</option>
<option value="1">Option B</option>
<option value="2">Option C</option>
</select>
<div><?php $cf->html->captcha_image(); ?></div>
<?php $cf->html->captcha(); ?>
生成例
<div><img src="/path/to/captcha.php" id="captcha-image" alt="" /></div>
<input type="text" name="cf-captcha" id="cf-captcha" />
初期化の時に 'mail' => true
を設定していることを確認する。
$cf->submit($setting);
すべてのルールを記述したあとに、$cf->submit()
で連想配列を渡して設定をします。
キー | 型 | 説明 |
---|---|---|
from |
String | 必須。メールの送信アドレスを指定します。これは決まりではありませんが、「表示名 <メールアドレス>」の形式で書くことを推奨します。 |
cc |
String | Carbon copy を指定します。 |
bcc |
String | Blind carbon copy を指定します。 |
reply |
String | Reply-to を指定します。 |
to |
String | 必須。メールの受信先を指定します。メールアドレスを直接書くこともできますが、フォームの名前を入れればそれに宛てて送信することもできます。 |
subject |
String | 必須。件名を指定します。 |
body |
String | 必須。メールの本文を指定します。 |
add
のときに設定した名前を {{
と }}
で囲うと文字列内で展開されます。
例えば
$cf->add('foo')
の値を、メール本文内で使いたいときは、
Foo is {{foo}}.
のように書きます。
フォームの値以外にも特殊な {{ }}
を用意しています。
変数 | 説明 |
---|---|
{{DATE}} |
現在の日付 |
{{TIME}} |
現在の時刻 |
Form
クラスを直接使わずに、extends して新しいクラスを作って、それを使って下さい。
class MyForm extends Form {
public function save($args = array()) {
$data = $this->get_data();
// process...
}
public function post_process() {
$status = $this->last_status;
// some process...
}
}