[Catalyst] More than one form per page with C::C::FormBuilder?
Juan Camacho
jc5826 at gmail.com
Mon Feb 12 13:19:37 GMT 2007
On 2/11/07, Danny Warren <danny at io.com> wrote:
> Hey all!
>
> I am trying to figure out the most elegant way to build/include multiple
> forms in one page using Catalyst::Controller::FormBuilder.
I'm in a bit of rush right now and won't have time to respond today,
so I'm pasting a response I had previously sent to someone else.
Try setting up your own Action class. This is code I had provided
someone else trying to do something similar. You probably don't want
the extra _add_form_to method -- I was simply parroting back some code
I was provided. The general idea is to provide a top level hash key
for each form. I don't necessarily recommend the key name used in
this example -- a better one would be the $formbuilder->name. It
would be a good idea to provide a more generalized approach that can
be released to CPAN as C-C-FormBuilder-MultiForm module. Volunteers
welcome :) Let me know if this helps.
package MyApp::Controller::Base;
use strict;
use base 'Catalyst::Controller::FormBuilder';
__PACKAGE__->config(
'Controller::FormBuilder' => {
action => 'MyApp::Action::FormBuilder',
}
);
package MyApp::Controller::Company;
use base qw/MyApp::Controller::Base/;
sub edit : Local Form {
my ($self, $c) = @_;
$c->stash->{template} = 'books/edit.tt2';
my $form = $self->formbuilder;
if ($form->submitted && $form->validate) {
return $c->forward('/company/save');
}
$c->forward('/company/searchform');
}
sub searchform : Local Form('/searchform') {
my ($self, $c) = @_;
my $searchform = $self->formbuilder;
my $fields = $searchform->fields;
$c->stash->{template} = 'searchresults.tt2';
$c->stash->{search_results} = $c->model('Listings')->search($fields);
}
package MyApp::Action::FormBuilder;
use strict;
use base 'Catalyst::Controller::FormBuilder::Action::TT';
sub setup_template_vars {
my $self = shift;
my ( $controller, $c ) = @_;
$self->SUPER::setup_template_vars(@_);
my $forms = {};
my $name = $self->_attr_params->[0] || $self->reverse;
_add_form_to( $forms, split('/', $name), $c->stash->{FormBuilder} );
$c->stash->{forms} = $forms;
}
sub _add_form_to {
my $href = shift;
my $node_count = scalar @_;
return if !$node_count;
my $node_count = scalar @_;
return if !$node_count;
return shift if $node_count == 1;
my $node = shift;
$href->{$node} = _add_form_to( { }, @_ );
return $href;
}
More information about the Catalyst
mailing list