On Oct 14, 2008, at 1:32 PM, Carl Franks wrote:
2008/10/14 Andreas Marienborg <[EMAIL PROTECTED]>:
On Oct 13, 2008, at 9:10 PM, Matija Grabnar wrote:
Andreas Marienborg wrote:
Something like that?
If no-one objects, I'll commit it tomorrow
- andreas
That looks very nice, but, if you'll permit me an observation, it
only
covers the part with the rendering of the two forms.
Would it be possible for you to document the other part of the
usage, too?
(I mean the part where you decide which form was submitted, and
then process
it). It may seem obvious to you, and I **think** I can see how it
would be
done, but having it spelled out would certainly make it easier for
people
who are just coming to catalyst/form-fu.
More like this? this is untested, and written by memory :p someone
might
wanna write a test-application based on it?
- andreas
Personally, I would set an 'action' for the login form
---
action: __c.uri_for('/login')__
and only check if the login form is submitted in a login() action,
rather than doing it for every request.
I usually handle it like I did in the example, but an unless ($c-
>user_exists) { } around might be a good idea to not process and auth
every request.
=head2 Multiple forms using Catalyst::Controller::HTML::FormFu
Sometimes you need to display multiple forms on a single page. If you
try to use FormConfig on several actions in a chain, or similar, they
all use $c->stash->{form} to store the form, hence you only get the last
form.
One way to work around such problems is to do a little of the work
yourself:
In this example we have a login_form that we want on every page
# root/forms/login.yml:
---
indicator: username
elements:
-
type: Text
name: username
constraints:
- Required
...
We also have an edit-form
# root/forms/foo/edit.yml
---
indicator: name
elements:
-
type: Text
name: name
constraints:
- Required
-
type: Password
name: password
constraints:
- Required
...
We load this in the top-most auto action:
package MyApp::Controller::Root;
use parent 'Catalyst::Controller::HTML::FormFu';
sub auto : Private {
my ($self, $c) = @_;
# We want to utilize alot of the magic that the controller
# gives us, so therefore we call $self->form like this
my $login_form = $self->form;
$login_form->load_config('forms/login.yml');
# Notice how we put it into another stash var, not 'form'
$c->stash->{login_form} = $login_form;
unless ($c->user_exists) {
$login_form->process();
if ($login_form->submitted_and_valid) {
# Since we set indicator, we should only end up here
if we
# have a username in the form
$c->authenticate({
username => $login_form->field_value('username'),
password => $login_form->field_value('password'),
});
}
}
}
Any other page that wants to load another form, can now do so freely:
package MyApp::Controller::Foo;
sub edit : Local FormConfig {
my ( $self, $c, $id ) = @_;
my $form = $c->stash->{form};
my $item = $c->model('DBIC::Foo')->find($id);
if ($form->submitted_and_valid) {
# Do whatever you want with it :p
$form->model->update($item);
}
}
In the view-land we now have two stash-variables:
root/foo/edit.tt
[% login_form %]
<h2>edit</h2>
[% form %]
_______________________________________________
HTML-FormFu mailing list
HTML-FormFu@lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu