2012-02-29 36 views
5

Có ai đã sử dụng thành công một cái gì đó như DBIx::Class::WebForm hoặc CatalystX-CRUD để tự động xây dựng biểu mẫu web tự xác thực từ bảng cơ sở dữ liệu không?Tôi nên sử dụng mô-đun Perl nào để tạo biểu mẫu web CRUD xác thực?

Tôi đang tưởng tượng một mô-đun đọc lược đồ bảng cơ sở dữ liệu, đọc các ràng buộc cho mỗi cột và tạo một số biểu diễn trừu tượng của biểu mẫu web, với các trường cho thông báo lỗi, v.v. lớn codebase hiện có.

Tôi không muốn mã hóa biểu mẫu web HTML, cũng như bất kỳ logic xác thực nào. Tôi đang cố viết ít mã nhất có thể, theo phong cách của Ruby on Rails. Mô-đun Perl nào là tốt nhất cho điều này?

CẬP NHẬT: Tôi đã giải quyết mặt biểu mẫu web với HTML::FormFu, nhưng nó vẫn lập bản đồ clunky biểu mẫu đầu vào vào cơ sở dữ liệu, ví dụ: date_start và date_end đều liên quan đến cột 'được tạo' và nhận xét phải khớp với 'LIKE% foo%', v.v. 'DBICFu' ở đâu?

CẬP NHẬT: Đây là một ứng dụng web, biểu mẫu web sẽ không giống như bảng cơ sở dữ liệu. Tôi không tìm kiếm một công cụ quản lý cơ sở dữ liệu.

+0

Cũng liên quan: [CatalystX-Resource] (http://search.cpan.org/dist/CatalystX-Resource/) – daxim

Trả lời

2

Bạn có thể sử dụng HTML::FormHandler::MooseHTML::FormHandler::Model::DBIC và nhận một số biểu mẫu đẹp.

Là một ví dụ đơn giản:

Các hình thức định nghĩa:

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 ; 

Và việc sử dụng trong một bộ điều khiển:

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 ; 

Làm việc tốt.

+0

Cảm ơn, nhưng tôi đã hy vọng không phải chỉ định {{datetimeid}} và {{datetime }} bản thân mình, nhưng chỉ cần trỏ nó vào một bảng cơ sở dữ liệu và nó đọc chính các trường đó. Và cũng có thể biến varchar (32) thành trường nhập văn bản có độ dài 32, v.v. –

+0

@WillSheppard Tôi không chắc liệu có cái gì như thế này không, nhưng người ta có thể viết cái gì đó để tạo ra các tệp HTML HTML :: FormHandler :: Moose' . – dgw

1

Tôi đã sử dụng HTML::FormHandler để tạo biểu mẫu cho tôi theo cách này. Nó cần một số tinh chỉnh, nhưng nó làm 90% công việc cho bạn. Riêng DBIx :: Class cung cấp một công cụ tương tự.