« CSSボタンあれこれ | メイン | Rails プラグイン acts_as_taggable_redux でタグクラウドを作ろう »

軽量なバリデーションライブラリはてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加 イザ!ブックマーク ニフティクリップに追加

こんにちは、 PHP 担当の高杉です。


みなさんは入力値のチェックをどのようにしていますか?サーバ側で一括に行ったり
JavaScript で一括で行ったり、または、両方でチェックを行ったり。
結構、どのように実装するか悩みます。

そこで、今回は LiveValidationPHP を紹介したいとおもいます。

この LiveValidationPHP は、「LiveValidation」という JavaScript のライブバリデーションライブラリをラッピングした PHP のバリデーションライブラリです。

これを用いると、 JavaScript を(ほぼ)全く用いずに、 PHP を記述するだけでライブバリデーションとサーバサイドのバリデーションをまとめて実装することができます。


インストール

インストール方法は、ダウンロードして展開するだけです。
ダウンロードページはこちら:
http://livevalidationphp.leihitu.nl/index.php?page=downloads

サンプル

JS ライブラリの livevalidation.js と、 livevalidation.js から使用されるサンプル CSS も同梱されています。
展開したライブラリの中から
  1. livevalidationphp.class.php
  2. livevalidation/livevalidation.js
  3. livevalidation/livevalidation.css

をコピーして、同階層に以下のようなサンプルスクリプトを作成します。

testValidation.php:

<?php
require_once "livevalidationphp.class.php";
require_once "validateRule.php";

 
$testLiveForm = new LiveValidationMassValidatePHP("testForm", $_POST);
$testLiveForm->addRules($formRules["formTest"]);

$html = $testLiveForm->generateAll();

$testFormErrors = array();

if (isset($_POST["action"]) && $_POST["action"] == "send_test_form") {
  $testFormErrors = $testLiveForm->validate();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <meta http-equiv="Content-Style-Type" content="text/css" />

  <title>LiveValidationPHP サンプル</title>

  <link href="livevalidation/livevalidation.css" rel="stylesheet" type="text/css" />

  <script type="text/javascript" src="livevalidation/livevalidation.js"></script>

  <script type="text/javascript"><!--

window.onload = function() {
<?php print $html; ?>
}
  //-->
  </script>
</head>

<body>
  <h1>LiveValidationPHP サンプル</h1>

<?php
if (count($testFormErrors)) {
  foreach ($testFormErrors as $errorMessage) {
    print "<p>Error=> $errorMessage </p>\n";
  }
}
?>  <form name="formTest" id="formTest" action="testValidation.php" method="post">

  <p>「あいうえお」と入力してください。: <input type="text" name="aiueo" id="aiueo" value="" /></p>

  <p>メールアドレスを入力してください。: <input type="text" name="email" id="email" value="" /></p>

  <p><input type="hidden" name="action" value="send_test_form" /></p>

  <p><input type="submit" value=" 登録 " /></p>

  </form>
 
</body>
</html>

最初にインクルードしている validateRule.php は下記に掲載したバリデーション条件を記述したファイルです。
内部で使用している $formRules 変数は、この validateRule.php で定義されています。

validateRule.php:


<?php
$formRules["formTest"] = array(

  "aiueo" => array(
    "args" => array("validMessage" => "あいうえお"),
    "rules" => array(
      array(
        "method" => "Validate.Presence",
        "args" => array("failureMessage" => "空")
      ),
      array(
        "method" => "Validate.Format",
        "args" => array("pattern" => "/^あいうえお$/i", "failureMessage" => "入力値が違います")
      )
    )
  ),
  "email" => array(
    "args" => array("validMessage" => "正しいEmailアドレス"),
    "display" => "Email",
    "rules" => array(
      array(
        "method" => "Validate.Presence",
        "args" => array()
      ),
      array(
        "method" => "Validate.Email",
        "args" => array()
      )
    )
  )
)
?>

これでtestValidation.phpにアクセスすると、入力値とメールアドレスのチェックが行われます。

validateRule.phpで定義されているバリデーションルールは、$formRules["formTest"]内で、

・第1階層にフォーム名
・第2階層に、 valid になる条件と valid 時のメッセージなどの引数
・rules が設定された場合、第3階層にバリデーションメソッドとエラーメッセージや条件など

となります。

バリデーションメソッドに指定できるのは、 livevalidation.js で用意されているバリデーションクラスと同じものです。詳細はそちらを参照ください。


使ってみると、ほとんど何も書いていないにもかかわらず、さっとライブバリデーションが実装できてしまいます。結構いい感じで利用可能となります。

必要となるのは最初のインスタンス生成などの、少数の定型処理の記述だけです。


JavaScript は、window.onload しか書く必要がありません。これも、付属サンプルのように タグを HTML の body 下部に記述すれば、まさに JavaScript を一切記述する必要がありません。



また、 ブラウザ側の JavaScript が OFF にされていたとしても、サーバサイドでのバリデーションが実装されているのでチェックが行われることになります。

単純にサーバサイドのバリデーションライブラリとして見ても、最低限必要な機能はちゃんと実装されているようです。

そして、JavaScript と PHP で同じ条件のバリデーションを2度書かなくてよくなります。

array を書きつづるルールは見づらいですが、構造は単純なので spyc 等と組み合わせて YAML やJSON で記述するようにしてやれば、扱いやすくなりす。