djmonta / form-php

Stylish form validation library written in PHP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

form-php

スタイリッシュなシンタックスが特徴のフォームバリデーションライブラリです。

特徴

  • チェーンメソッドを使った簡単なシンタックス
  • バリデーションのルールとフォームの HTML のロジックが分離されている
  • バリデーション用のフィルターを拡張できる
  • フォームの HTML をルールを元に自動生成
  • Ajax 対応
  • 自動返信メール対応
  • nonce 機能 (CSRF対策)
  • CAPTCHA 対応 (スパム対策)

Quick Start

ファイルの一番最初でバリデーションのルールを設定します。

<?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 <contact@example.com>',
	'bcc' => 'contact@example.com',
	'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' フォームの接頭辞。各フォームの要素の nameid の前に付きます。
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 を指定するか、引数の省略ができます。

CAPTCHAを追加する

$cf->add_captcha();

これだけです。

set_option

<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',
));

required

項目を必須にします。

$cf->add('foo')->required(true);
引数 説明
1 Bool 入力を必須にする場合は true を指定します。

なお、次の2つは全く同じ意味です。

$cf->add('foo')->required(true)
$cf->add('foo', true)

minlen / maxlen

minlenmaxlen は入力された文字列の長さの下限と上限を指定します。

例: minlen

$cf->add('foo')->minlen(40)
引数 説明
1 Number 文字列の長さの下限を指定します。入力がこの値より短いとエラーがでます。

mininum / maximum

mininummaximum は入力された値を数値として評価し、その値の下限と上限を指定します。

例: maximum

$cf->add('foo')->maximum(40)
引数 説明
1 Number 値の上限を指定します。入力がこの値より大きいとエラーがでます。

minselect / maxselect / select

mininummaximum は複数の値が選択できる項目の場合(<input type="checkbox">, <select>)に、選択できる個数の下限と上限を指定します。

select は単に、選択できる個数を設定します。

例: maxselect

$cf->add('foo+')->set_option(array(
	'aeuio',
	'kakikukeko',
	'sasisuseso',
))->maxselect(2)
引数 説明
1 Number 選択できる項目の個数の上限を指定します。選択された項目の個数がこの値より多いとエラーがでます。

filter

高度なバリデーションルールを設定します。

メールアドレス

$cf->add('foo')->filter('email')

電話番号

$cf->add('foo')->filter('tel')

URL

$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')

type

機能は filter とほとんど同じですが、フォームの要素の type 属性に値を設定する点において異なります。

例えば filter('email')filter('tel') そして filter('url') は、
こちらの type('email')type('tel')type('url') を使うようにして下さい。

メールアドレス

$cf->add('foo')->type('email')

電話番号

$cf->add('foo')->type('tel')

URL

$cf->add('foo')->type('url')

format

値を判定するのではなく、加工します。主にデータの正規化に利用します。

kana

PHP の mb_convert_kana 関数を利用して、「半角」-「全角」変換を行います。 詳しいオプションについては PHP のマニュアルを参照下さい。

$cf->add('foo')->format('kana', 'asKV')

datetime

rule のところでも出てきましたが、入力された日付についての詳細情報を連想配列で保存します。 詳しくは、PHP のマニュアルを参照下さい。

$cf->add('foo')->format('datetime', 'Y/m/d H:i')

filter / format で独自関数をつかう

関数の命名規則は validation_filter_{name} です。 関数の呼び出しには、つぎの引数が渡されます。

引数 説明
$call String どちらの関数から呼ばれたのかを取得する際に使います。値は 'filter''format' です。
$val Mixed そのまんま値、データです。
$arg Array filterformat に渡された第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);
}

HTML ヘルパー

テキスト

<?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>

CAPTCHA の画像と入力フィールド

<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 必須。メールの本文を指定します。

body 内でフォームの値を使う

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...
	}
}

About

Stylish form validation library written in PHP

License:MIT License


Languages

Language:PHP 49.0%Language:CSS 30.4%Language:JavaScript 20.5%