Sledge用のバリデータを
作ろうと決めてから結構たってしまいましたが、ようやくそれっぽいものができました。
Sledge::Plugin::FormValidator::Simple-0.01今のところ
FormValidator::Simple::Extensionが必要です。
Sledge::Plugin::FormValidator::Simpleを使う場合にはあらかじめこれをインストールしておく必要があります。
このバリデータの特徴は以下のとおりです。
- プロファイルをYAMLで定義できる
- 1つのYAMLファイルにすべてのプロファイルを記述でき、バリデーション時には自動で選択される
- 使用するプロファイルを手動で選択することも可能
- エラー時の挙動も定義可能
- エラーメッセージもYAMLで記述可能。テンプレート側でメッセージを選択可能
以下使い方の説明です。
まずPagesクラスでSledge::Plugin::FormValidator::Simpleをuseします。
>
package Your::Proj::Pages;
use Sledge::Plugin::FormValidator::Simple;
<
Sledge::Plugin::FormValidator::Simpleをuseすると、validatorメソッドがPagesクラスに
追加されます。
次にコンフィグにバリデーションに関する設定を追加します。
>
package Your::Config::_common;
$C{VALIDATOR_OPTIONS} = {
profile => '/path/to/profiles.yml',
messages => '/path/to/messages.yml',
messages_decode_parms => 'utf-8',
plugins => [
'FormValidator::Simple::Plugin::Japanese',
'Your::Original::Validation',
],
loader => 'YAML::Syck',
};
<
さらにプロファイル、エラーメッセージを定義したYAMLを用意します。
>
# profiles.yml
"Your::Pages::Root" :
contact :
- name
- [ [NOT_BLANK], [LENGTH, 0, 30] ]
- email
- [ [NOT_BLANK], [EMAIL_LOOSE], [LENGTH, 0, 100] ]
- tel
- [ [NOT_BLANK], [NUMBER_PHONE_JP], [LENGTH, 0, 30] ]
- content
- [ [NOT_BLANK], [LENGTH, 0, 5000] ]
login :
- userid
- [ [NOT_BLANK], [ASCII] ]
- password
- [ [NOT_BLANK] ]
"Your::Pages::Signup" :
input :
step1 :
- userid
- [ [NOT_BLANK], [ASCII] ]
- password
- [ [NOT_BLANK] ]
- name
- [ [NOT_BLANK], [LENGTH, 0, 30] ]
- email
- [ [NOT_BLANK], [EMAIL_LOOSE], [LENGTH, 0, 100] ]
step2 :
- tel
- [ [NOT_BLANK], [NUMBER_PHONE_JP], [LENGTH, 0, 30] ]
- address
- [ [NOT_BLANK], [LENGTH, 0, 200] ]
# messages.yml
DEFAULT:
name:
DEFAULT: name is invalid!!
action1:
name:
NOT_BLANK: input name!
LENGTH: input name(length should be between 0 and 10)!
email:
DEFAULT: input correct email address!
action2:
name:
DEFAULT: hoge.
<
バリデーション実行時、Pagesクラス名とdispatch名に対応したプロファイルが自動で選択されます。
対応したプロファイルがない場合、バリデーションは実行されません。
使用するプロファイルを手動で変更したい場合は、valid_profile_$pageメソッドを定義します。
>
package Your::Pages::Signup;
use strict;
sub valid_profile_foo {
my $self = shift;
if ( $self->r->param('step') == 2 ) {
return ('step2');
}else {
return ('step1');
}
}
sub dispatch_foo {
...
}
sub post_dispatch_foo {
...
}
<
valid_profile_$pageメソッドは使用するプロファイルのキー名を返すようにします。
上記の例ではクエリー内のstepが2の場合はYAML内の定義のうち、 Your::Pages::Signup -> foo -> step2 が使用されます。
バリデーションでエラーがみつかると、セッションにvalid_pageとvalid_resultがセットされます。
それぞれの値はの下記のとおりです。
バリデーション結果をセットした後、デフォルトでは、current_urlで取得されるURLへのリダイレクトを行います。
もしリダイレクト先を手動で設定したい場合は、valid_redirect_url_$pageを定義します。
>
sub valid_redirect_url_foo {
return '/foo/error';
}
<
また、リダイレクト以外の処理をさせたい場合はvalid_error_$pageを定義します。
>
sub valid_error_foo {
my ($self, $result) = @_;
$self->tmpl->param(result => $result);
$self->load_template('/bar/error');
$self->output_content;
}
<
valid_error_$pageを定義すると、リダイレクトする代わりにこのメソッドが呼び出されます。
上記の例はテンプレートに結果をセットしエラーテンプレートをロードしています。
valid_error_$pageはvalid_redirect_url_$pageより優先されます。
Sledge::Plugin::FormValidator::SimpleがuseされたPagesクラスおよびそのサブクラスでは、
dispatch前にセッションからバリデーションエラーの際にセッションにセットされた
valid_result、valid_pageを取得しようと試みます。(取得の際、セッションからこれらのキーは削除されます。)
valid_resultを取得できた場合、valid_result、valid_pageをテンプレートのパラメータとしてセットし、
さらにfillin_formをloadし、バリデーションに通った値をfillinします。