[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