[英]Which Perl module should I use to generate a validating CRUD webform?
有沒有人成功使用DBIx :: Class :: WebForm或CatalystX-CRUD之 類的東西來從數據庫表中自動構建自驗證Web表單?
我正在想象一個模塊,該模塊可以讀取數據庫表架構,讀取每一列的約束,並生成Webform的抽象表示形式,以及用於錯誤消息的字段等。我將Catalyst和Plack與現有的大型代碼庫一起使用。
我既不想編寫HTML Web表單,也不想編寫任何驗證邏輯。 我的目標是以Ruby on Rails的樣式編寫盡可能少的代碼。 哪個Perl模塊最適合?
更新:我已經用HTML :: FormFu解決了Webform方面,但是將表單輸入映射到數據庫上仍然很笨拙,例如date_start和date_end都與'created'列相關,並且注釋應該使用'LIKE%foo% ”等。“ DBICFu”在哪里?
更新:這是針對Web應用程序的,Web表單不應看起來像數據庫表。 我不是在尋找數據庫管理工具。
我已經使用HTML :: FormHandler以這種方式為我生成表單。 它需要進行一些調整,但它可以為您完成90%的工作。 另外,DBIx :: Class提供了類似的工具。
您可以使用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,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 ;
效果不錯。
在Catalyst Wiki上有許多選項 。
聽起來AutoCrud可以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.