Какой модуль Perl мне следует использовать для создания проверочной веб-формы CRUD? - PullRequest
5 голосов
/ 29 февраля 2012

Кто-нибудь успешно использовал что-то вроде DBIx :: Class :: WebForm или CatalystX-CRUD для автоматического создания самопроверяющейся веб-формы из таблицы базы данных?

Я представляю себе модуль, который читает схему таблицы базы данных, считывает ограничения для каждого столбца и генерирует некоторое абстрактное представление веб-формы с полями для сообщений об ошибках и т. Д. Я использую Catalyst и Plack с большим существующая кодовая база.

Я не хочу кодировать веб-форму HTML или какую-либо логику проверки. Я стремлюсь написать как можно меньше кода в стиле Ruby on Rails. Какой модуль Perl лучше для этого?

ОБНОВЛЕНИЕ: Я решил сторону веб-формы с помощью HTML :: FormFu , но все еще неуклюже отображает входные данные формы в базу данных, например, И date_start, и date_end относятся к столбцу «create», и комментарий должен совпадать с использованием «LIKE% foo%» и т. д. Где находится «DBICFu»?

ОБНОВЛЕНИЕ: это для веб-приложения, веб-форма не должна выглядеть как таблица базы данных. Я не ищу инструмент управления базами данных.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Вы можете использовать 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,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 ;

Хорошо работает.

2 голосов
/ 20 марта 2012

Существует несколько вариантов crud в вики Catalyst .

Звучит так, как будто AutoCrud будет соответствовать вашим потребностям.

2 голосов
/ 29 февраля 2012

Я использовал HTML :: FormHandler для создания форм для меня таким способом.Это требует некоторой настройки, но это делает 90% работы для вас.Отдельно DBIx :: Class предлагает аналогичный инструмент.

...