2012-02-29 1 views
5

DBIx::Class::WebForm 또는 CatalystX-CRUD과 같은 것을 성공적으로 사용해 데이터베이스 테이블에서 자동 검증 웹 폼을 작성한 사람이 있습니까?유효성 검사 CRUD 웹 폼을 생성하려면 어떤 Perl 모듈을 사용해야합니까?

데이터베이스 테이블 스키마를 읽고, 각 열에 대한 제약 조건을 읽고, 오류 메시지 등에 대한 필드가있는 웹 폼의 추상 표현을 생성하는 모듈을 상상하고 있습니다. Catalyst 및 Plack을 큰 기존 코드베이스.

HTML 웹 폼이나 유효성 검사 로직을 코딩하고 싶지 않습니다. 루비 온 레일즈 (Ruby on Rails)의 스타일로 가능한 한 적은 코드로 작성하려고합니다. 어떤 Perl 모듈이 가장 좋습니까?

업데이트 : HTML::FormFu으로 웹 폼 측면을 해결했지만 형식 입력을 여전히 데이터베이스에 매핑하는 것이 어렵습니다. date_start와 date_end는 모두 'created'열과 관련이 있으며 'LIKE % foo %'등을 사용하여 주석이 일치해야합니다. 'DBICFu'는 어디에 있습니까?

업데이트 : 이것은 웹 응용 프로그램 용이며 웹 폼은 데이터베이스 테이블처럼 보이면 안됩니다. 나는 데이터베이스 관리 도구를 찾고 있지 않다.

+0

관련 항목 : [CatalystX-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는 비슷한 도구를 제공합니다.

관련 문제