フォームから送信されたデータのチェックをするモジュールはCPANに二つあります。Data::FormValidatorと加藤さんのFormValidator::Simpleがそれ。いままでガリガリと書いていた部分をこれを用いて楽ができないかと試し中。
メールアドレスとパスワードを入れるような以下の登録画面があって、
<form>
メールアドレス:<input name="mail" type="text" id="mail" size="20" /><br />
パスワード:<input name="password" type="password" id="password" size="20" /><br />
もう一度パスワード:<input name="password_confirmation" type="password" id="password_confirmation" size="20" /><br />
パスワードは半角英数字5文字〜32文字
</form>
この入力をチェックする場合、
Data::FormValidatorでは、
use CGI;
use Data::FormValidator;
use Data::FormValidator::Constraints qw(:matchers);#Podでは「:all」だけどそれだと動かない
my $q=CGI->new;
my $dfv_profile={
#mail passwordが必須
required=>[qw/mail password/],
#前後のスペースを除く
filters=>['trim'],
#パスワードの確認
dependency_groups=>{
password_group=>[qw/password password_confirmation/],
},
#入力確認
constraint_methods=>{
password=>qr/^[A-Za-z0-9]{5,32}$/,
#パスワードの確認
password_confirmation =>[{
constraint=>sub{
my $dfv=shift;
return ($_[0] eq $_[1]) ? 1 : 0;
},
params=>[qw/password password_confirmation/]
}],
mail=>match_email()
},
#メッセージ
msgs=>{
prefix=>'dfv_err_',
format=>'<span class="dfv_err">%s</span>',
invalid=>"入力が正しくありません",
missing=>"入力がありません"
}
};
#チェック
my $results = Data::FormValidator->check($q,$dfv_profile);
長いけど、こうなる。
FormValidator::Simpleを使うと、もうすこし短く
use CGI;
use FormValidator::Simple;
my $fvs_profile=[
mail=>['NOT_BLANK','EMAIL'],
password=>['NOT_BLANK','ASCII',['LENGTH',5,32]],
{password_confirmation=>[qw/password password_confirmation/]}=>['DUPLICATION']
];
#チェック
my $results = FormValidator::Simple->check($q,$fvs_profile);
と、書ける。上(Data::FormValidator)と比べるとコンパクトでわかりやすい。
FormValidator::SimpleはSledge::Plugin::Validatorを参考に作られている。作者が日本人という事もあって、日本語対応もプラグインでFormValidator::Simple::Plugin::Japaneseが提供されていてなかなか良さそう。プラグインの作成も簡単にできる。
ただエラーをチェックしただけでは意味がなく、それをユーザに分かりやすく伝えることが必要。この方法もData::FormValidatorとFormValidator::Simpleとで違う。
Data::FormValidatorの場合、テンプレート(Template-Toolkit)は以下のようになる。
<form>
メールアドレス:<input name="mail" type="text" id="mail" size="20" />[% results.msgs.dfv_err_mail %]<br />
パスワード:<input name="password" type="password" id="password" size="20" />[% results.msgs.dfv_err_password %]<br />
もう一度パスワード:<input name="password_confirmation" type="password" id="password_confirmation" size="20" />[% results.msgs.dfv_err_password_confirmation %]<br />
パスワードは半角英数字5文字〜32文字
</form>
エラーの場合、[% results.dfv_err_mail %]の所に、msgsオプションで指定した通り「<span
class="dfv_err">入力がありません</span>」または「<span
class="dfv_err">入力が正しくありません</span>」と入ります。メッセージの内容は、msgsオプション内で柔軟に変更可能。
FormValidator::Simpleの方はどうかと言うと、メッセージの生成機能は(まだ)なくてテンプレート中に
[% IF results.has_invalid || results.has_missing %]
<ul>
[% IF result.missing('mail') %]
<li>メールアドレスの入力がありません</li>
[% END %]
[% IF result. invalid('mail') %]
<li>メールアドレスが正しくありません</li>
[% END %]
[% IF result.missing('password') %]
<li>パスワードの入力がありません</li>
[% END %]
[% IF result. invalid('password','ASCII') %]
<li>パスワードは半角英数字のみ使用可能です</li>
[% END %]
[% IF result. invalid('password','LENGTH') %]
<li>パスワードは5文字から32文字にしてください</li>
[% END %]
...
[% END %]
<form>
...
とテンプレートに書いて行く事が必要になる。細かいメッセージ出せて良いとも思うけど、多少面倒。
「result. invalid('password')」という使い方をするあたりがTemplate-Toolkit向けです。
とりあえず一長一短。
いろいろ試してみる価値ありそうです。
参考:
Lost-Season:
CatalystでSledge風Validation
hide-k.net#blog:
Catalyst::Plugin::FormValidator::Simple