2012-02-29 9 views
5

¿Alguien ha utilizado con éxito algo como DBIx::Class::WebForm o CatalystX-CRUD para construir automágicamente un formulario web de autovalidación de una tabla de base de datos?¿Qué módulo de Perl debería usar para generar un formulario web de CRUD válido?

Estoy imaginando un módulo que lee un esquema de tabla de base de datos, lee las restricciones para cada columna y genera alguna representación abstracta de un formulario web, con campos para mensajes de error, etc. Estoy usando Catalyst y Plack con un gran base de código existente.

No quiero codificar un formulario web HTML, ni ninguna lógica de validación. Mi objetivo es escribir el menor código posible, al estilo de Ruby on Rails. ¿Qué módulo de Perl es mejor para esto?

ACTUALIZACIÓN: He resuelto el lado del formulario web con HTML::FormFu, pero todavía es complicado mapear las entradas del formulario en la base de datos, p. date_start y date_end se relacionan con la columna 'created', y el comentario debe coincidir usando 'LIKE% foo%', etc. ¿Dónde está 'DBICFu'?

ACTUALIZACIÓN: Esto es para una aplicación web, el formulario web no debe verse como una tabla de base de datos. No estoy buscando una herramienta de administración de base de datos.

+0

También relacionado: [CatalystX-Resource] (http://search.cpan.org/dist/CatalystX-Resource/) – daxim

Respuesta

2

Puede utilizar el uso de HTML::FormHandler::Moose y HTML::FormHandler::Model::DBIC y obtener algunos buenos formularios.

Como un simple ejemplo:

La definición del formulario:

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 ; 

Y el uso de un controlador:

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 ; 

funciona bien.

+0

Gracias, pero esperaba no tener que especificar {{datetimeid}} y {{datetime }} mismo, pero solo apúntalo a una tabla de base de datos y haz que lea los campos. Y también convierta varchar (32) en un campo de entrada de texto con longitud 32, etc. –

+0

@WillSheppard No estoy seguro de si algo como esto existe, pero se podría escribir algo para generar los archivos 'HTML :: FormHandler :: Moose' . – dgw

1

He usado HTML::FormHandler para generar formularios para mí de esta manera. Necesita algunos ajustes, pero hace el 90% del trabajo por usted. Por separado, DBIx :: Class ofrece una herramienta similar.

Cuestiones relacionadas