加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

我应该使用哪个Perl模块来生成验证CRUD网络表单?

发布时间:2020-12-16 06:26:01 所属栏目:大数据 来源:网络整理
导读:有没有人成功使用像 DBIx::Class::WebForm或 CatalystX-CRUD这样的东西从数据库表中自动构建自我验证的webform? 我正在想象一个模块,它读取数据库表模式,读取每列的约束,生成一些webform的抽象表示,带有错误消息的字段等.我正在使用Catalyst和Plack,它有一
有没有人成功使用像 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’?

更新:这是一个Web应用程序,webform看起来不应该像数据库表.我不是在寻找数据库管理工具.

解决方法

您可以使用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 ;

效果很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读