HTML::AutoForm (フォームビルダー&バリデータの話)

NanoA 用に作ったフォームビルダー&バリデータを HTML::AutoForm (svn link) として独立させました。

フォームを定義したり

     my $form = HTML::AutoForm->new(
         fields => [
             username  => {
                 type       => 'text',
                 required   => 1,
                 min_length => 6,
                 max_length => 8,
                 regexp     => qr/^[0-9a-z_]+$/,
             },
     ...
         ],
     );

フォームを検証したり

     # validate form
     my $ok = $form->validate(
         $query,                # any object that support $query->param('name')
         sub { ... },           # callback to check if csrf token is valid
     );

フォームを描画したり (必要に応じてエラーメッセージ等が埋め込まれます)

     # render form
     $html .= $form->render(
         $query,
         $csrf_token,
     );

こんな感じです。デフォルトの描画が気に食わない場合は、

    for my $field (@{$form->fields}) {
        $html .= join(
            '',
            '<div class="form_field">',
            $field->render();
            '</div>',
            sub {
                my $err = $field->validate($query)
                    or return ();
                return (
                    '<div class="form_error">',
                    $err->message,
                    '</div>',
                );
            }->($field),
        );
    }

みたくして手動で定義すればいいので、CSS でがんばってレンダリングする必要もありません。

なお、

$HTML::AutoForm::DEFAULT_LANG = 'ja';

としておくと、標準のエラーメッセージが全部日本語になります。

そういえば MENTA と NanoA には、既にバンドルされてるらしいよ。