HTML::Widgetの(いい加減な)使い方

詳細かつ適切なマニュアルはそのうちどなたかが書いてくれるでしょうが、とりあえずCGI::Application環境でテストしてみたのでコードをさらしてみる。

  • WidgetTest.cgi
#!/usr/bin/perl
use strict;
use warnings;
use lib '.';

use WidgetTest;

my $app = WidgetTest->new;
$app->run;
  • WidgetTest.pm
package WidgetTest;
{
  use strict;
  use warnings;
  use CGI::Carp;
  use base qw/CGI::Application/;
  use HTML::Widget;

  our $VERSION = '0.01';

  sub setup {
    my $this = shift;
    $this->start_mode('start');
    $this->run_modes(
      start => 'start',
    );
  }

  sub cgiapp_postrun {
    my ($this, $output) = @_;

    $$output =<<"EOH";
<html>
<head>
<style type="text/css">
<!--
form#widget div {
  line-height: 150%;
  width: 500px;
  margin: 10px;
  padding: 10px;
  border: dotted 1px #000;
  background-color: #eee;
}
span.error_messages {
  color: #f00;
  font-weight: bold;
  font-size: .8em;
}
-->
</style>
</head>
<body>
$$output
</body>
</html>
EOH
  }

  sub start {
    my $this = shift;

    my $q = $this->query;

    my $w = HTML::Widget->new->method('post')->action('/WidgetTest.cgi');

    $w->element('Textfield', 'name')->label('Name')->size(20);
    $w->element('Textfield', 'email')->label('E-Mail')->size(20);
    $w->element('Password',  'pass')->label('Pass')->size(20);
    $w->element('Submit',    'login')->value('OK: ');

    $w->constraint('ASCII', 'name')->message('(Not Ascii)');
    $w->constraint('All',   'email')->message('(Missing Value)');
    $w->constraint('All',   'pass')->message('(Missing Value)');

    $w->filter('Whitespace');
    $w->subcontainer('div');

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

    $output =~ s|</label>|</label>\n|g;
    $output =~ s|</span>|</span>\n|g;
    $output =~ s| />| />\n|g;
    $output =~ s|<input |<br><input |g;
    $output =~ s|<label |<br><label |g;
    $output =~ s|<div><br>|<div>|g;

  }
}

1;

なんだかバッドなにおいがぷんぷんですが、とりあえずこんな感じのコードでヴァリデーションとかフィルインとかがひとそろい揃ったフォームができる、と。

まだ内部をきちんと見ていないので、日本語を使うとてきめん文字化けするとか、吐き出すXMLをもうちょっとなんとかしておいてほしいとか、ありますが、その辺はおいおい調べてみましょう。ここでは process したものを吐き出させていますが、テンプレエンジン使う人はparam持ちのオブジェクトとして渡してやれば期待通りの動作をするものと思われ。

いまの段階で便利かってというといささか微妙な感じもしますが、マニュアルともどもそのうち整備されることでしょう。