HTML::Widget::Kwalify #1

HTML::Widget::Kwalify を修正しました。動作サンプルはこちら

サンプルを触ってもらうと分かると思いますが、ポストしたデータを YAML 形式でダンプできます。また、フォームバリデーションにも対応してます。例えば、user_agent-timeout は Kwalify スキーマでは「type: int」と設定されているのですが、それに合わせてバリデーションルールも設定してあり、数字以外の文字列を入力すると「Invalid Input」と表示されます。

サンプルのソースはここに置いときます

サンプルソースのメイン部分は、

sub top {
    my $self = shift;

    my $q = $self->query;
    my $w = HTML::Widget::Kwalify->new('schema.yaml');

    my $result = $q->param ? $w->process($q) : $w->process;

    if ( $result->have_errors or !$q->param ) {
        return $self->tt_process( 'index.html', { widget => $result } );
    }
    else {
        $self->header_props( -type => 'text/plain' );
        return $w->dump;
    }
}

といった感じなのですが、たったこれだけでバリデーション、フィルイン対応のフォームを Kwalify スキーマから自動生成し、POST データを YAML にダンプ、ってなことができます。超ベンリ。

YAML はネストされたデータ構造なのに対し、HTML フォームは平坦な構造なので、この部分をどう処理するかが実装にあたって一番面倒そうだな、と思っていたのですが、宮川さんから Catalyst::Plugin::Params::Nested というモジュールを教えてもらい、これのベースクラスである CGI::Expand を使うことによって、簡単に実装できてしまいました。CGI::Expand++ 。

これで最低限やりたいことはできるようになりましたが、Kwalify スキーマのパースのしかたが適当なので、テストを書いて色んなパターンで試して調整する必要があったり、ファイルにダンプできるようにしたりとか、完成まではまだまだかかりそうです。

また、id:charsbar 氏 がおっしゃっている通り、HTML::Widget 自体が日本語が化けたりとか微妙な感じなので、こちらも手を入れないといけないですね。