我使用 Catalyst Perl MVC 框架和 HTML::FormHandler 作为表单处理器。
是否有任何方法可以创建多个对象并使用单一表单将它们保存到适当的单独表中?
最佳答案
花了一些时间阅读文档并最终在 IRC 帮助下我弄清楚了如何做到这一点。这很简单。
假设我们有 2 个相关表:“帐户”和“用户”。而“账户”有很多“用户”,这种关系称为“用户”。
Controller 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;
}
我们所做的就是使用http://metacpan.org/pod/HTML::FormHandler::Field::Repeatable就像我们的 lib/MyApp/Form/Account.pm 中的那样:
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”:)
关于perl - Catalyst MVC 使用单个表单保存多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157801/