2012-02-29 8 views
5

DBIx::Class::WebFormまたはCatalystX-CRUDのようなものを使用して、自動的にデータベーステーブルから自己検証型Webフォームを作成した人はいますか?有効なCRUDウェブフォームを生成するために使用するPerlモジュールはどれですか?

データベーステーブルのスキーマを読み込み、各列の制約を読み取り、エラーメッセージなどのフィールドを含むWebフォームの抽象表現を生成するモジュールを想像しています。CatalystとPlackを大きな既存のコードベース。

HTML Webフォームや検証ロジックをコード化したくありません。 Ruby on Railsのスタイルでできるだけ小さなコードを書くことを目指しています。どのPerlモジュールがこれに最適ですか?

更新:私はHTML::FormFuでウェブフォームの側面を解決しましたが、それでもフォーム入力をデータベースに格好よくマッピングしています。 date_startとdate_endは両方とも 'created'列に関連し、コメントは 'LIKE%foo%'などを使用して一致する必要があります。 'DBICFu'はどこですか?

更新:これはWebアプリケーション向けです。ウェブフォームはデータベーステーブルのように見えません。私はデータベース管理ツールを探していません。

+0

関連項目:[Catalyst X-Resource](http://search.cpan.org/dist/CatalystX-Resource/) – daxim

答えて

2

HTML::FormHandler::MooseHTML::FormHandler::Model::DBICを使用して、素晴らしいフォームを作成できます。

フォーム定義:

package MyStats::Form::Datetime ; 

use HTML::FormHandler::Moose ; 
extends 'HTML::FormHandler::Model::DBIC' ; 

use Date::Calc qw(Today_and_Now) ; 

has_field 'datetimeid' => (label  => 'ID') ; 
has_field 'datetime' => (type  => 'Text', 
          apply  => [ { transform => \&transform_dt } ] , 
          deflation => \&deflation_dt , 
          required => 1) ; 
has_field 'submit'  => (type => 'Submit' , 
          value => 'Speichern') ; 
# These are the fields of the table datetime 

sub transform_dt { 
    my ($dt) = @_ ; 

    my @d = ($dt =~ m/(\d{1,2})\.(\d{1,2})\.(\d{4})\s+(\d{1,2}):(\d{1,2})/) ; 
    return sprintf('%04d-%02d-%02d %02d:%02d:00' , @d[2,1,0,3,4]) ; 
} 

sub deflation_dt { 
    my ($dt) = @_ ; 

    my @d = ($dt =~ m/(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2}):(\d{1,2})/) ; 
    if(! @d) { 
    @d = Today_and_Now() ; 
    } 
    return sprintf('%02d.%02d.%04d %02d:%02d:00' , @d[2,1,0,3,4]) ; 
} 

1 ; 

コントローラでの使用:単純な例として

package MyStats::Controller::Datetime ; 
use Moose ; 
use namespace::autoclean ; 

BEGIN { extends 'Catalyst::Controller' ; } 

use MyStats::Form::Datetime ; 

has 'form' => (isa  => 'MyStats::Form::Datetime' , 
       is  => 'rw' , 
       lazy => 1 , 
       default => \&new_datetime_form) ; 

sub new_datetime_form { 
    MyStats::Form::Datetime->new(css_class => 'datetimeform' , 
           name => 'datetimeform') ; 
} 

... 

sub add :Local :Args(0) { 
    my ($self , $ctx) = @_ ; 

    my $data = $ctx->model('MyStatsDB::Datetime')->new_result({}) ; 
    $ctx->stash(template => 'datetime/add.tt2' , 
       form  => $self->form) ; 
    $ctx->bread_crumb({ name => 'Datum/Zeit eingeben' , 
         location => '/datetime/add' }) ; 

    $ctx->req->param('datetimeid' , undef) if $ctx->req->param('datetimeid') ; 
    return unless $self->form->process(item => $data , 
             params => $ctx->req->params) ; 
    $ctx->flash(message => 'Neuer Datensatz ' . $data->datetimeid . 
          ' angelegt.' , 
       id_add => $data->datetimeid) ; 
    $ctx->res->redirect($ctx->uri_for('/datetime')) ; 
} 

... 

__PACKAGE__->meta->make_immutable ; 

1 ; 
良い作品

+0

ありがとうございますが、私は{datetimeid}と{datetime }}自分自身ではなく、データベーステーブルをポイントし、フィールド自体を読み込ませるだけです。また、varchar(32)を32などの長さのテキスト入力フィールドに変更してください。 –

+0

@WillSheppardこのようなものが存在するかどうかはわかりませんが、HTML :: FormHandler :: Mooseファイル。 – dgw

1

私はHTML::FormHandlerを使って、このような形で私のフォームを生成しました。それはいくつかの調整が必要ですが、それはあなたの仕事の90%を行います。別に、DBIx :: Classも同様のツールを提供します。

関連する問題