3

HTML::FormHandler をフォーム プロセッサとして使用する Catalyst Perl MVC フレームワークを使用しています。

複数のオブジェクトを作成し、単一のフォームを使用して適切な個別のテーブルに保存する方法はありますか?

4

2 に答える 2

3

しばらくドキュメントを読み、最終的に IRC の助けを借りて、その方法を理解しました。とても簡単です。

「アカウント」と「ユーザー」という 2 つの関連テーブルがあるとします。そして「アカウント」には多くの「ユーザー」がいて、この関係を「ユーザー」と呼びます。

コントローラー Account.pm のコードは同じままです (フォームを処理して新しいオブジェクトを作成するために HTML::FormHandler を使用していることを思い出してください):

sub register : Chained('base') :PathPart('register') :Args(0) {
    my ($self, $c ) = @_;
    my $account = $c->model('DB::Account')->new_result({});
    return $self->form_create($c, $account);
}
sub form_create {
    my ( $self, $c, $account ) = @_;
    my $form = MyApp::Form::Account->new();
    $c->stash( template => 'account/form.tt2', form => $form );
    $form->process( item => $account, params => $c->req->params );
    return unless $form->validated;
}

lib/MyApp/Form/Account.pm でhttp://metacpan.org/pod/HTML::FormHandler::Field::Repeatableを使用するだけです。

package MyApp::Form::Account;

use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
use namespace::autoclean;

has '+item_class' => ( default => 'Account' );
has_field 'organization';
# other fields ...

# User Part Form
has_field 'users' => ( type => 'Repeatable' ); # 'users' is our relationship name!
has_field 'users.first';
has_field 'users.last';
# and so on...
has_field 'submit' => ( type => 'Submit', value => 'Submit' );
__PACKAGE__->meta->make_immutable;
1;

送信後、新しく作成された 'account' および 'user' オブジェクトを取得します。ここで、'user' には対応する 'account_id' が既に挿入されています:)

于 2012-08-29T21:56:45.203 に答える
1
  1. フォーム送信
  2. パラメータが検証されます

    $ form-> process()

  3. データは必要に応じてテーブルに挿入されます。

    $ rec = $ c-> model(table_1)-> create(valid_data);
    $ rec-> create_related('relationship_name'、related_data);

DBICに両方の挿入を自動的に実行させる方法を知りません。しかし、それは存在しないということではありません。FormHandler::DBICのドキュメントに何も表示されませんでした。

于 2012-08-28T17:23:08.513 に答える