=head1 NAME
-Catalyst::Manual::Tutorial::AdvancedCRUD::FormFu - Catalyst Tutorial - Part 9: Advanced CRUD - FormFu
-NOTE: This part of the tutorial is in progress and will be ready soon.
+Catalyst::Manual::Tutorial::AdvancedCRUD::FormFu - Catalyst Tutorial - Part 9: Advanced CRUD - FormFu
+
=head1 OVERVIEW
This portion of the tutorial explores L<HTML::FormFu|HTML::FormFu> and
how it can be used to manage forms, perform validation of form input,
-as well as save and restore data to/from the database.
+as well as save and restore data to/from the database. This was written
+using HTML::FormFu version 0.03007.
See
L<Catalyst::Manual::Tutorial::AdvancedCRUD|Catalyst::Manual::Tutorial::AdvancedCRUD>
sudo apt-get install libtest-nowarnings-perl libdatetime-format-builder-perl \
libdatetime-format-strptime-perl libdatetime-locale-perl \
libhtml-tokeparser-simple-perl liblist-moreutils-perl \
- libregexp-copy-perl libregexp-common-perl libyaml-syck-perl libparams-util-perl
+ libregexp-copy-perl libregexp-common-perl libyaml-syck-perl libparams-util-perl \
+ libcrypt-des-perl libcaptcha-recaptcha-perl libcrypt-cbc-perl \
+ libreadonly-xs-perl libmoose-perl libregexp-assemble-perl
+
+ ...
+
+ sudo apt-get clean
Then use the following command to install directly from CPAN the modules
that aren't available as Ubuntu/Debian packages via C<apt-get>:
- sudo cpan File::ShareDir Task::Weaken Config::Any HTML::FormFu \
- Catalyst::Controller::HTML::FormFu
+ sudo cpan File::ShareDir Task::Weaken Config::Any Test::Harness Test::Aggregate \
+ boolean Test::MockTime DateTime::Format::Natural HTML::FormFu \
+ Catalyst::Component::InstancePerContext Catalyst::Controller::HTML::FormFu \
+ HTML::FormFu::Model::DBIC
+
+ ...
+
+ Is it OK to try to connect to the Internet? [yes] yes
+
+ ...
+
+
+B<Note:> If you are following along with the Ubuntu LiveCD, you might
+want to make sure you still have adequate free disk space in the root
+partition with the C<df> command. You can free up some space with
+C<rm -rf /root/.cpan/*>.
=head1 C<HTML::FormFu> FORM CREATION
L<Catalyst::Controller::HTML::FormFu|Catalyst::Controller::HTML::FormFu>
by changing the C<use base> line from the default of:
- use base 'Catalyst::Controller';
+ use parent 'Catalyst::Controller';
to use the FormFu base controller class:
- use base 'Catalyst::Controller::HTML::FormFu';
+ use parent 'Catalyst::Controller::HTML::FormFu';
=head2 Add Action to Display and Save the Form
# Get the form that the :FormConfig attribute saved in the stash
my $form = $c->stash->{form};
- # Check if the form as been submitted (vs. displaying the initial
- # form) and if the data based validation. "submitted_and_valid"
+ # Check if the form has been submitted (vs. displaying the initial
+ # form) and if the data passed validation. "submitted_and_valid"
# is shorthand for "$form->submitted && !$form->has_errors"
if ($form->submitted_and_valid) {
# Create a new book
name: submit
value: Submit
+B<NOTE:> Copying and pasting YAML from perl documentation is sometimes
+tricky. See the L<Config::General Config for this tutorial> section of
+this document for a more foolproof config format.
+
=head2 Update the CSS
-Edit C<root/src/ttsite.css> and add the following lines to the bottom of
+Edit C<root/static/css/main.css> and add the following lines to the bottom of
the file:
input {
[%# Render the HTML::FormFu Form %]
[% form %]
- <p><a href="[% Catalyst.uri_for('list') %]">Return to book list</a></p>
+ <p><a href="[% c.uri_for('list') %]">Return to book list</a></p>
=head2 Add Links for Create and Update via C<HTML::FormFu>
<p>
HTML::FormFu:
- <a href="[% Catalyst.uri_for('formfu_create') %]">Create</a>
+ <a href="[% c.uri_for('formfu_create') %]">Create</a>
</p>
This adds a new link to the bottom of the book list page that we can
$ script/myapp_server.pl
-Login as C<test01>. Once at the Book List page, click the new
-HTML::FormFu "Create" link at the bottom to display the form. Fill in
-the following values: Title = "Internetworking with TCP/IP Vol. II",
-Rating = "4", and Author = "Comer". Click Submit, and you will be
-returned to the Book List page with a "Book created" status message
-displayed.
+Login as C<test01> (password: mypass). Once at the Book List page,
+click the new HTML::FormFu "Create" link at the bottom to display the
+form. Fill in the following values: Title = "Internetworking with
+TCP/IP Vol. II", Rating = "4", and Author = "Comer". Click Submit,
+and you will be returned to the Book List page with a "Book created"
+status message displayed.
Also note that this implementation allows you to can create books with
bogus information. Although we have constrained the authors with the
# This is an optional 'mouse over' title pop-up
attributes:
title: Enter a book title here
- # Use Filter to clean up the input data
- filter:
- # Remove whitespace at both ends
- - TrimEdges
- # Escape HTML characters for safety
- - HTMLEscape
# Add constraints for the field
constraints:
- # The user cannot leave this field blank
- - SingleValue
# Force the length to be between 5 and 40 chars
- type: Length
min: 5
attributes:
title: Enter a rating between 1 and 5 here
# Use Filter to clean up the input data
- filter:
- # Remove whitespace at both ends
- - TrimEdges
+ # Could use 'NonNumeric' below, but since Filters apply *before*
+ # constraints, it would conflict with the 'Integer' constraint below.
+ # So let's skip this and just use the constraint.
+ #filter:
# Remove everything except digits
- - NonNumeric
+ #- NonNumeric
# Add constraints to the field
constraints:
- - SingleValue
# Make sure it's a number
- - Integer
+ - type: Integer
+ message: "Required. Digits only, please."
+ # Check the min & max values
+ - type: Range
+ min: 1
+ max: 5
+ message: "Must be between 1 and 5."
# Add a select list for the author selection. Note that we will
# dynamically fill in all the authors from the controller but we
# One could argue we don't need to do filters or constraints for
# a select list, but it's smart to do validation and sanity
# checks on this data in case a user "hacks" the input
- # Use Filter to clean up the input data
- filter:
- # Remove whitespace at both ends
- - TrimEdges
- # Escape HTML characters for safety
- - HTMLEscape
# Add constraints to the field
constraints:
# Make sure it's a number
name: submit
value: Submit
- # Globally ensure that each field only specified one value
+ # Global filters and constraints.
constraints:
- # The user cannot leave any fields blank
- - Required
+ # The user cannot leave any fields blank
+ - Required
+ # If not all fields are required, move the Required constraint to the
+ # fields that are
+ filter:
+ # Remove whitespace at both ends
+ - TrimEdges
+ # Escape HTML characters for safety
+ - HTMLEscape
+
+B<NOTE:> Copying and pasting YAML from perl documentation is sometimes
+tricky. See the L<Config::General Config for this tutorial> section of
+this document for a more foolproof config format.
The main changes are:
# Get the form that the :FormConfig attribute saved in the stash
my $form = $c->stash->{form};
- # Check if the form as been submitted (vs. displaying the initial
- # form) and if the data based validation. "submitted_and_valid"
+ # Check if the form has been submitted (vs. displaying the initial
+ # form) and if the data passed validation. "submitted_and_valid"
# is shorthand for "$form->submitted && !$form->has_errors"
if ($form->submitted_and_valid) {
# Save the form data for the book
The last E<lt>tdE<gt> cell in the book list table should look like the
following:
+ ...
<td>
[% # Add a link to delete a book %]
- <a href="[% Catalyst.uri_for('delete', book.id) %]">Delete</a>
+ <a href="[% c.uri_for('delete', book.id) %]">Delete</a>
[% # Add a link to edit a book %]
- <a href="[% Catalyst.uri_for('formfu_edit', book.id) %]">Edit</a>
+ <a href="[% c.uri_for('formfu_edit', book.id) %]">Edit</a>
</td>
+ ...
+
+B<Note:> Only add two lines (the "Add a link to edit a book" comment
+and the href for C<formfu_edit>). Make sure you add it below the
+existing C<delete> link.
=head2 Try Out the Edit/Update Feature
green. Experiment with other edits to various books.
+=head2 Config::General Config for this tutorial
+
+If you are having difficulty with YAML config above, please save the
+below into the file C<formfu_create.conf> and delete the
+C<formfu_create.yml> file. The below is in
+L<Config::General|Config::General> format which follows the syntax of
+Apache config files.
+
+ constraints Required
+ <elements>
+ <constraints>
+ min 5
+ max 40
+ type Length
+ message Length must be between 5 and 40 characters
+ </constraints>
+ filter TrimEdges
+ filter HTMLEscape
+ name title
+ type Text
+ label Title
+ <attributes>
+ title Enter a book title here
+ </attributes>
+ </elements>
+ <elements>
+ constraints Integer
+ filter TrimEdges
+ filter NonNumeric
+ name rating
+ type Text
+ label Rating
+ <attributes>
+ title Enter a rating between 1 and 5 here
+ </attributes>
+ </elements>
+ <elements>
+ constraints Integer
+ filter TrimEdges
+ filter HTMLEscape
+ name authors
+ type Select
+ label Author
+ multiple 1
+ size 3
+ </elements>
+ <elements>
+ value Submit
+ name submit
+ type Submit
+ </elements>
+ indicator submit
+
+
+
=head1 AUTHOR
Kennedy Clark, C<hkclark@gmail.com>
Please report any errors, issues or suggestions to the author. The
most recent version of the Catalyst Tutorial can be found at
-L<http://dev.catalyst.perl.org/repos/Catalyst/trunk/Catalyst-Manual/lib/Catalyst/Manual/Tutorial/>.
+L<http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Manual/5.70/trunk/lib/Catalyst/Manual/Tutorial/>.
-Copyright 20066-2008, Kennedy Clark, under Creative Commons License
-(L<http://creativecommons.org/licenses/by-nc-sa/2.5/>).
-
\ No newline at end of file
+Copyright 2006-2008, Kennedy Clark, under Creative Commons License
+(L<http://creativecommons.org/licenses/by-sa/3.0/us/>).