有没有人成功使用像
DBIx::Class::WebForm或
CatalystX-CRUD这样的东西从数据库表中自动构建自我验证的webform?
我正在想象一个模块,它读取数据库表模式,读取每列的约束,生成一些webform的抽象表示,带有错误消息的字段等.我正在使用Catalyst和Plack,它有一个很大的现有代码库.
我不想编写HTML webform,也不想编写任何验证逻辑.我的目标是以Ruby on Rails的风格编写尽可能少的代码.哪个Perl模块最适合这个?
更新:我已经用HTML::FormFu解决了webform方面的问题,但它仍然很笨拙地将表单输入映射到数据库,例如date_start和date_end都与’created’列相关,并且注释应该使用’LIKE%foo%’等匹配.其中’DBICFu’?
解决方法
您可以使用HTML :: FormHandler :: Moose和HTML :: 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,3,4] ) ; } sub deflation_dt { my ( $dt ) = @_ ; my @d = ( $dt =~ m/(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2})/ ) ; if( ! @d ) { @d = Today_and_Now() ; } return sprintf( '%02d.%02d.%04d %02d:%02d:00',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 ;
效果很好.
@H_502_44@