我正在使用带有 HTML::FormHandler 作为表单处理器的 Catalyst Perl MVC 框架。
有什么方法可以创建多个对象并使用单一表单将它们保存到适当的单独表中?
在花了一些时间阅读文档和 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' :)
参数已验证
$form->进程()
数据会根据需要插入到表中。
$rec = $c->model(table_1)->create(valid_data);
$rec->create_related('relationship_name', related_data);
我不知道让 DBIC 自动执行两个插入的方法。但这并不是说不存在。我只是在 FormHandler::DBIC 文档中没有看到任何内容。