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 自体が日本語が化けたりとか微妙な感じなので、こちらも手を入れないといけないですね。