Catalyst MVC使用单个表单保存多个对象

时间:2012-08-28 10:56:36

标签: perl catalyst

我使用Catalyst Perl MVC框架和HTML :: FormHandler作为表单处理器。

有没有办法创建多个对象并使用单一表单将它们保存到适当的单独表中?

2 个答案:

答案 0 :(得分:3)

花了一些时间阅读文档,最后IRC帮助我找到了如何做到这一点。这很简单。

假设我们有两个相关的表:'account'和'user'。而且“帐户”中有很多“用户”,这种关系被称为“用户”。

控制器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_id”:)

答案 1 :(得分:1)

  1. 表格提交
  2. Params已经过验证

    $形式 - >处理()

  3. 根据需要将数据插入表格中。

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

  4. 我不知道让DBIC自动执行两个插入的方法。但这并不是说一个人不存在。我只是没有在FormHandler :: DBIC文档中看到任何内容。