XoopsLiveValidator
※ 17:22 に(3-1) を追記しました。
※ 10/31 11:15 コードの書き方をちょっと変えました。
最近のフォームは javascript でチェックすることが多く、確かに個人的に使っていてもその方が快適。送信ボタンを押して、読み込み中表示がぐるぐる回って、その結果「どっか足りません」とか言われると「あーもう!」と、ちらっと思ってしまいます。
なので、自分の作るモジュールにも javascript を使ってその場でチェック、とかやりたいのですが、フォームチェックのライブラリは幾つかあって目移りする上、時間がたつと前はどれを使っていたか、どうやって使っていたか、を忘れてしまったりします(^ ^;。また、チェックのルールを書くのが面倒!だったりします。
そんな情けない事情もあって、大々的に導入していなかったのですが、LiveValidation というライブラリがなかなかよさそうだなあ、と目をつけました。
さらに、このライブラリを php から制御できる php クラスも作られていて、これだっ!と思いました。
一方で、XOOPS(Cubson)でも ActionForm に FieldProperties を設定して、サーバ側でフィールド値の妥当性をチェックする仕組みがすでにあります。
そこで、サーバ側、クライアント側両方でチェックルールを記述するのは面倒なので、XOOPS の FieldProperties のチェックルールを元に javascript のチェックルールを生成するようなクラスを作ってみました。
(仮置き場)
注1:ActionForm に FieldProperties を使ってチェックをしていないと、使ってもあまり良いことはありません(普通に LiveValidationPHP を使えばいい)。
注2:まだ作りかけの試作品なので、「よし、わかった。後は自分でやる」という人か、「とりあえずどんな物か試してやろう」という人以外にはお勧めしません。
使い方の例(Cubson のモジュールで説明)
(1) 以下の4ファイルを適当なフォルダに置きます
(modules/{モジュール}/include/ など)。
上の3つのファイルは LiveValidationPHP のファイルそのままです。
(2) actions/{table}EditAction.class.php を以下の様に修正します。
(2-1) 必要なファイルを require
require_once "./include/livevalidationphp.class.php"; require_once "./include/XoopsLiveValidator.class.php";
(2-2) executeViewInput メソッドに以下を追加*1。
$xoopsLiveValidator = new XoopsLiveValidator(); $xoopsLiveValidator->setupValidationRule($this->mActionForm); $ValidatePHP = new LiveValidationMassValidatePHP("BmEdit", $_POST); $ValidatePHP->addRules($xoopsLiveValidator->mRules); $liveValidator = $ValidatePHP->generateAll(); $render->setAttribute('liveValidator', $liveValidator); $render->setAttribute('xoops_module_header', '<link href="include/livevalidation.css" rel="stylesheet" type="text/css" media="screen"> <script language="javascript" type="text/javascript" src="include/livevalidation.js"> </script>');
(3) テンプレートファイルの修正
(3-1) form の id を設定
以下の様に、id を追加する。id 名は (2-2) の LiveValidationMassValidatePHP 生成時のオプションで指定した名前
<form action="index.php?action=BmEdit" id="BmEdit" method="post">
(3-2) 生成した javascript を挿入
一番最後にでも、以下を追加
<script> <{$liveValidator}> </script>
以上です。
オプション
もし javascript ではチェックからはずしたいフィールドがあれば(hidden など)、
$xoopsLiveValidator->removeRule('uid');
の様に、removeRule メソッドでチェックから外したいフィールドを指定します(例では uid)。
反対に、追加したいチェックがあれば、addRule メソッドで追加できますが、詳細はまた今度。LiveValidation の方が多様なチェックを行えますので、追加したい要望はあるんじゃないかと。