2012-02-29 11 views
5

Qualcuno ha utilizzato con successo qualcosa come DBIx::Class::WebForm o CatalystX-CRUD per creare automaticamente un webform auto-validante da una tabella di database?Quale modulo Perl dovrei usare per generare un webform CRUD validante?

Sto immaginando un modulo che legge uno schema di tabella del database, legge i vincoli per ogni colonna e genera una rappresentazione astratta di un modulo web, con campi per i messaggi di errore, ecc. Sto usando Catalyst e Plack con un grande base di codice esistente.

Non voglio codificare un modulo Web HTML né alcuna logica di convalida. Sto cercando di scrivere meno codice possibile, nello stile di Ruby on Rails. Quale modulo Perl è il migliore per questo?

AGGIORNAMENTO: Ho risolto il lato del modulo Web con HTML::FormFu, ma è ancora un po 'goffo mappare gli input del modulo sul database, ad es. date_start e date_end si riferiscono entrambe alla colonna 'created', e il commento dovrebbe corrispondere usando 'LIKE% foo%', ecc. Dov'è il 'DBICFu'?

AGGIORNAMENTO: questo è per un'applicazione Web, il modulo web non dovrebbe apparire come una tabella di database. Non sto cercando uno strumento di gestione del database.

+0

Relazionato anche: [CatalystX-Resource] (http://search.cpan.org/dist/CatalystX-Resource/) – daxim

risposta

2

È possibile utilizzare HTML::FormHandler::Moose e HTML::FormHandler::Model::DBIC e ottenere alcuni bei moduli.

Come semplice esempio:

La definizione del modulo:

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 ; 

E l'utilizzo di un controllore:

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 ; 

opere buone.

+0

Grazie, ma speravo di non dover specificare {{datetimeid}} e {{datetime }} me stesso, ma basta puntarlo verso una tabella del database e farlo leggere i campi stessi. E anche trasformare varchar (32) in un campo di immissione del testo con lunghezza 32, ecc. –

+0

@WillSheppard Non sono sicuro che esista qualcosa del genere, ma si potrebbe scrivere qualcosa per generare i file 'HTML :: FormHandler :: Moose' . – dgw

1

Ho usato HTML::FormHandler per generare forme per me in questo modo. Ha bisogno di qualche ritocco, ma fa il 90% del lavoro per te. Separatamente DBIx :: Class offre uno strumento simile.

Problemi correlati