HTML::Widget::Kwalify というものをつくってます。まだプロトタイプにもなってない感じだけど。
これで Kwalify スキーマから HTML::Widget オブジェクトを自動生成して、Plagger のウェブインターフェースを簡単につくっちゃおう、という目論見です。
use HTML::Widget::Kwalify; my $w = HTML::Widget::Kwalify->create_from( file => 'schema.yaml' ); print $w->process;
みたいな感じで、schema.yaml から HTML フォームを一発で生成できます。
CGI::Application ベースでサンプルをつくると、こんな感じになります。
まずはディスパッチする index.cgi 。
#!/usr/local/bin/perl use strict; use warnings; use lib './lib'; use WidgetKwalify; my $w = WidgetKwalify->new; $w->run;
本体の lib/WidgetKwalify.pm 。
package WidgetKwalify;
use strict;
use warnings;
use base qw( CGI::Application );
use HTML::Widget::Kwalify;
use CGI::Application::Plugin::TT;
our $TEMPLATE_OPTIONS = {
INCLUDE_PATH => '/path/to/template',
};
sub setup {
my $self = shift;
$self->start_mode('top');
$self->run_modes(
top => 'top',
);
$self->tt_config( TEMPLATE_OPTIONS => $TEMPLATE_OPTIONS );
}
sub top {
my $self = shift;
my $q = $self->query;
my $w = HTML::Widget::Kwalify->create_from( file => 'schema.yaml' );
return $self->tt_process(
'index.html',
{ widget => $q ? $w->process($q) : $w->process }
);
}
1;
HTML テンプレート template/index.html 。
<table>
[% FOREACH element = widget.elements %]
<tr>
<td>[% element.label.content.0 %]:</td>
<td>[% element.element.as_XML %]</td>
</tr>
[% END %]
</table>
Plagger の example にある schema.yaml の global セクションを使ってこのサンプルを動かすと、こんな感じになります。まだ type:seq の処理をちゃんとしてないので、plugin_path が変ですが、他は良い感じ。log-level もちゃんと select になってるし。
これで、Plagger ホスティングウェブアプリつくれば、bloglines2gmail とか youtube2podcast とか、目的別にスキーマファイルつくるだけで、設定用フォームが自動で生成できるし、プラグイン毎にスキーマファイル用意しておいて、利用したいプラグインを選択すると、そのプラグイン用の設定フォームが自動で生成できる、といったことが可能になりますね。
あと、
$widget->process($query)->save_to( file => 'config.yaml' );
な感じで POST したフォームの内容を YAML にしてファイルに保存、とかできるようにする予定です。(他にも type: seq の処理とか、フォームバリデーション対応とか、やること山積みですが。)