チェック機能を実装する
最初の例では、名前、郵便番号、電話番号、そして携帯電話のメールアドレスを登録するようにしてみたいと思います。
入力フォーム用のアクションとしてinput1を実装します。
sub input1 :Local { my ( $self, $c ) = @_; # POSTの場合のみエラーチェックを行う if ($c->req->method eq 'POST') { # 各パラメータ毎のチェック設定 $c->form( name => ['NOT_BLANK', ['JLENGTH', 2, 10]], name_kana => ['NOT_BLANK', 'KATAKANA', ['JLENGTH', 2, 30]], zip => ['NOT_BLANK', 'ZIP_JP'], phone => ['NOT_BLANK', 'NUMBER_PHONE_JP'], email => ['EMAIL_MOBILE_JP'], ); } }
プラグインによってコンテキストに追加された$c->formメソッドに対して、各パラメータごとのチェック項目を設定します。ここでは次のような意味になります。
設定名 | 説明 |
NOT_BLANK | 値が必須の場合にエラーとする |
JLENGTH | 日本語文字列の長さチェック。最小と最大の文字列超を設定する |
KATAKANA | 日本語のカタカナ以外の場合にエラーとする |
ZIP_JP | 日本の郵便番号以外の場合にはエラーとする |
NUMBER_PHONE_JP | 日本の電話番号以外の場合にはエラーとする |
EMAIL_MOBILE_JP | 日本の主要携帯電話キャリアのメールアドレス以外の場合にはエラーとする |
input1のテンプレートは次のようになります。
<html> <body> <h1>FormValidatorサンプル</h1> [% IF c.form.has_error %] <div style="color:#ff0000;">エラー</div> <ul> [% FOREACH message IN c.form.messages('input1') %] <li>[% message %]</li> [% END %] </ul> [% END %] <form method="post" action="input1"> 氏名:<input type="text" name="name" /><br /> 氏名(フリガナ):<input type="text" name="name_kana" /><br /> 郵便番号:<input type="text" name="zip" /><br /> 電話番号:<input type="text" name="phone" /><br /> 携帯メールアドレス:<input type="text" name="email" /><br /> <input type="submit" name="submit" value="登録" /><br /> </form> </body> </html>
c.form.has_errorでフォームの内容にエラーがあったかどうかを判定し、c.form.messagesでエラーメッセージの一覧を取得しています。
それぞれのチェック項目に対応するエラーメッセージは次のように登録します。
input1: name: NOT_BLANK: 名前を入力してください! JLENGTH: 名前は2から10文字で入力してください name_kana: NOT_BLANK: 名前(フリガナ)を入力してください! JLENGTH: 名前(フリガナ)は2から30文字で入力してください KATAKANA: 名前(フリガナ)はカタカナで入力してください zip: NOT_BLANK: 郵便番号を入力してください! ZIP_JP: 不正な郵便番号です phone: NOT_BLANK: 電話番号を入力してください! NUMBER_PHONE_JP: 不正な電話番号です email: EMAIL_MOBILE_JP: 不正な携帯電話メールアドレスです
実行例
このFormValidatorサンプルを実行してみましょう。次のURLをブラウザで表示させます。
http://<ホスト名またはIPアドレス><:Port>/input1
入力フィールドに何も設定せずにSubmitした場合には、次のような画面が表示されます。
それぞれの入力フィールドにさまざまな値を入力して、どのような結果が表示されるかを試してみてください。
今回の例では、アクション内でパラメータのチェックを行っていますが、Catalyst::Plugin::FormValidator::Simple::Autoを使用すると、検証ルールを外部ファイルに分離できます。
検証ルールの外部ファイルは、「profiles」により指定できます。
# 省略 use Catalyst qw/ -Debug ConfigLoader Static::Simple FormValidator::Simple`` FormValidator::Simple::Auto Unicode::Encoding /; # 省略 __PACKAGE__->config( # 省略 # Validator::Simple関連のパラメータ登録 'validator' => { plugins => ['Japanese'], options => {charset => 'utf8'}, messages => 'conf/messages.yml', message_format => '<span style="color:#ff0000;">%s</span>', profiles => 'conf/profiles.yml', }, );
検証ルールはYAML形式で記述します。例えばinput1アクションを外部ファイルに定義すると次のようになります。
input1: name: - NOT_BLANK - ['JLENGTH', 2, 10] name_kana: - NOT_BLANK - ['JLENGTH', 2, 10] - KATAKANA zip: - NOT_BLANK - ZIP_JP phone: - NOT_BLANK - NUMBER_PHONE_JP email: - EMAIL_MOBILE_JP
Catalyst::Plugin::FormValidator::Simple::Autoを使用する場合には、アクション実行前に$c->formの実行が自動的に行われているため、アクションの実装部分では検証エラーが発生したかどうかだけのロジックを記述するだけですむようになります。
sub input1 :Local { my ( $self, $c ) = @_; # $c->form()はすでに呼び出されている if ($c->form->has_error) { # validationエラー発生時の処理 } }