Here, we will make use of the L<HTML::Widget|HTML::Widget> to not only
ease form creation, but to also provide validation of the submitted
-data. The approached used by the part of the tutorial is to slowly
+data. The approached used by this part of the tutorial is to slowly
incorporate additional L<HTML::Widget|HTML::Widget> functionality in a
step-wise fashion (we start with fairly simple form creation and then
move on to more complex and "magical" features such as validation and
pulled from the Catalyst Subversion repository in one step with the
following command:
- svn checkout http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Tutorial@4627 .
+ svn co http://dev.catalyst.perl.org/repos/Catalyst/tags/examples/Tutorial/MyApp/5.7/AdvancedCRUD MyApp
=head1 C<HTML::WIDGET> FORM CREATION
return $w;
}
-This method provides a central location that builds an HTML::Widget-
-based form with the appropriate fields. The "Get Authors" code uses
-DBIC to retrieve a list of model objects and then uses C<map> to create
-a hash where the hash keys are the database primary keys from the
-authors table and the associated values are the last names of the
+This method provides a central location that builds an
+HTML::Widget-based form with the appropriate fields. The "Get authors"
+code uses DBIC to retrieve a list of model objects and then uses C<map>
+to create a hash where the hash keys are the database primary keys from
+the authors table and the associated values are the last names of the
authors.
=head2 Add Actions to Display and Save the Form
# Set a status message for the user
$c->stash->{status_msg} = 'Book created';
- # Use 'hw_create' to redisplay the form
+ # Use 'hw_create' to redisplay the form. As discussed in
+ # Part 3, 'detach' is like 'forward', but it does not return
$c->detach('hw_create');
}
# Set a status message for the user
$c->stash->{status_msg} = 'Book created';
+
+ # Redisplay an empty form for another
+ $c->stash->{widget_result} = $w->result;
}
# Set the template
single call to C<$book-E<gt>populate_from_widget>. Note that we still
have to call C<$book-E<gt>add_to_book_authors> once per author because
C<populate_from_widget> does not currently handle the relationships
-between tables.
+between tables. Also, we reset the form to an empty fields by adding
+another call to C<$w-E<gt>result> and storing the output in the stash
+(if we don't override the output from C<$w-E<gt>process($c-E<gt>req)>,
+the form values already entered will be retained on redisplay --
+although this could be desirable for some applications, we avoid it
+here to help avoid the creation of duplicate records).
=head2 Try Out the Form
Some developers my wish to use the "old-fashioned" table style of
rendering a form in lieu of the default C<HTML::Widget> rendering that
-assumes you will use CSS for formatting.
+assumes you will use CSS for formatting. This section demonstrates
+some techniques that can override the default rendering with a
+custom class.
=head2 Add a New "Element Container"
return map { $self->_build_element($_) } @{$element};
}
my $e = $element->clone;
- my $class = $e->attr('class') || '';
$e = new HTML::Element('span', class => 'fields_with_errors')->push_content($e)
if $self->error && $e->tag eq 'input';
use FormElementContainer;
+B<Note:> If you forget to C<use> your container class in your
+controller, then your form will not be displayed and no error messages
+will be generated. Don't forget this important step!
+
Then tell C<HTML::Widget> to use that class during rendering by updating
C<make_book_widget> to match the following:
=item *
-JavaScript to position the user's curson in the first field of the form.
+JavaScript to position the user's cursor in the first field of the form.
=back
Kennedy Clark, C<hkclark@gmail.com>
Please report any errors, issues or suggestions to the author. The
-most recent version of the Catlayst Tutorial can be found at
+most recent version of the Catalyst Tutorial can be found at
L<http://dev.catalyst.perl.org/repos/Catalyst/trunk/Catalyst-Runtime/lib/Catalyst/Manual/Tutorial/>.
Copyright 2006, Kennedy Clark, under Creative Commons License