Merge from depluralization branch
[catagits/Catalyst-Manual.git] / lib / Catalyst / Manual / Tutorial / AdvancedCRUD / FormFu.pod
index be90d17..1c7176d 100644 (file)
@@ -1,13 +1,11 @@
 =head1 NAME
 
-
-
-Catalyst::Manual::Tutorial::AdvancedCRUD::FormFu - Catalyst Tutorial - Part 9: Advanced CRUD - FormFu
+Catalyst::Manual::Tutorial::AdvancedCRUD::FormFu - Catalyst Tutorial - Chapter 9: Advanced CRUD - FormFu
 
 
 =head1 OVERVIEW
 
-This is B<Part 9 of 10> for the Catalyst tutorial.
+This is B<Chapter 9 of 10> for the Catalyst tutorial.
 
 L<Tutorial Overview|Catalyst::Manual::Tutorial>
 
@@ -69,7 +67,7 @@ for additional form management options other than
 L<HTML::FormFu|HTML::FormFu>.
 
 
-=head1 Install C<HTML::FormFu>
+=head1 Install HTML::FormFu
 
 If you are following along in Debian 5, it turns out that some of the 
 modules we need are not yet available as Debian packages at the time 
@@ -93,13 +91,13 @@ that aren't available as Debian packages:
     sudo cpan Catalyst::Component::InstancePerContext Catalyst::Controller::HTML::FormFu
 
 
-=head1 C<HTML::FormFu> FORM CREATION
+=head1 HTML::FormFu FORM CREATION
 
 This section looks at how L<HTML::FormFu|HTML::FormFu> can be used to 
-add additional functionality to the manually created form from Part 4.
+add additional functionality to the manually created form from Chapter 4.
 
 
-=head2 Inherit From C<Catalyst::Controller::HTML::FormFu>
+=head2 Inherit From Catalyst::Controller::HTML::FormFu
 
 First, change your C<lib/MyApp/Controller/Books.pm> to inherit from
 L<Catalyst::Controller::HTML::FormFu|Catalyst::Controller::HTML::FormFu>
@@ -123,7 +121,7 @@ following method:
     
     =cut
     
-    sub formfu_create :Chained('base) :PathPart('formfu_create') :Args(0) :FormConfig {
+    sub formfu_create :Chained('base') :PathPart('formfu_create') :Args(0) :FormConfig {
         my ($self, $c) = @_;
     
         # Get the form that the :FormConfig attribute saved in the stash
@@ -134,7 +132,7 @@ following method:
         # is shorthand for "$form->submitted && !$form->has_errors"
         if ($form->submitted_and_valid) {
             # Create a new book
-            my $book = $c->model('DB::Books')->new_result({});
+            my $book = $c->model('DB::Book')->new_result({});
             # Save the form data for the book
             $form->model->update($book);
             # Set a status message for the user
@@ -144,7 +142,7 @@ following method:
             $c->detach;
         } else {
             # Get the authors from the DB
-            my @author_objs = $c->model("DB::Authors")->all();
+            my @author_objs = $c->model("DB::Author")->all();
             # Create an array of arrayrefs where each arrayref is an author
             my @authors;
             foreach (sort {$a->last_name cmp $b->last_name} @author_objs) {
@@ -263,7 +261,7 @@ This adds a new link to the bottom of the book list page that we can
 use to easily launch our HTML::FormFu-based form.
 
 
-=head2 Test The <HTML::FormFu> Create Form
+=head2 Test The HTML::FormFu Create Form
 
 Press C<Ctrl-C> to kill the previous server instance (if it's still
 running) and restart it:
@@ -272,17 +270,21 @@ running) and restart it:
 
 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.
+form.  Fill in the following values:
+
+    Title  = "Internetworking with TCP/IP Vol. II"
+    Rating = "4"
+    Author = "Comer"
+    
+Click the Submit button, 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 
+Also note that this implementation allows you to create books with any
 bogus information.  Although we have constrained the authors with the 
 drop-down list (note that this isn't bulletproof because we still have 
 not prevented a user from "hacking" the form to specify other values), 
 there are no restrictions on items such as the length of the title (for 
-example, you can create a one-letter title) and value for the rating 
+example, you can create a one-letter title) and the value of the rating 
 (you can use any number you want, and even non-numeric values with 
 SQLite).  The next section will address this concern.
 
@@ -293,7 +295,7 @@ the previous paragraph is that the I<web application> itself is not
 performing any validation.
 
 
-=head1 C<HTML::FormFu> VALIDATION AND FILTERING
+=head1 HTML::FormFu VALIDATION AND FILTERING
 
 Although the use of L<HTML::FormFu|HTML::FormFu> in the previous section 
 did provide an automated mechanism to build the form, the real power of 
@@ -452,10 +454,10 @@ bottom:
     
     sub formfu_edit :Chained('object') :PathPart('formfu_edit') :Args(0) 
             :FormConfig('books/formfu_create.yml') {
-        my ($self, $c, $id) = @_;
+        my ($self, $c) = @_;
     
-        # Get the specified book
-        my $book = $c->model('DB::Books')->find($id);
+        # Get the specified book already saved by the 'object' method
+        my $book = $c->stash->{object};
     
         # Make sure we were able to get a book
         unless ($book) {
@@ -480,10 +482,10 @@ bottom:
             $c->detach;
         } else {
             # Get the authors from the DB
-            my @author_objs = $c->model("DB::Authors")->all();
+            my @author_objs = $c->model("DB::Author")->all();
             # Create an array of arrayrefs where each arrayref is an author
             my @authors;
-            foreach (sort {$a->last_name cmp $b->last_name} @author_bjs) {
+            foreach (sort {$a->last_name cmp $b->last_name} @author_objs) {
                 push(@authors, [$_->id, $_->last_name]);
             }
             # Get the select added by the config file
@@ -506,17 +508,25 @@ the common code in separate methods).  The main differences are:
 
 =item *
 
-We accept C<$id> as an argument via the URL.
+We have to manually specify the name of the FormFu .yml file as an 
+argument to C<:FormConfig> because the name can no longer be 
+automatically deduced from the name of our action/method (by default,
+FormFu would look for a file named C<books/formfu_edit.yml>).
 
 =item *
 
-We use C<$id> to look up the existing book from the database.
+We load the book object from the stash (found using the $id passed to 
+the Chained object method)
 
 =item *
 
-We make sure the C<$id> and book lookup returned a valid book.  If not, 
-we set the error message and return to the book list.
+We use C<$id> to look up the existing book from the database.
+
+=item *
 
+We make sure the book lookup returned a valid book.  If not, we set 
+the error message and return to the book list.
 =item *
 
 If the form has been submitted and passes validation, we skip creating a 
@@ -566,6 +576,7 @@ Stevens as a co-author (control-click), and click Submit.  You will then
 be returned to the book list with a "Book edited" message at the top in 
 green.  Experiment with other edits to various books.
 
+
 =head2 More Things to Try
 
 You are now armed with enough knowledge to be dangerous.  You can keep
@@ -597,6 +608,7 @@ Support the CRUD cycle for authors.
 Or you can proceed to write your own application, which is probably the
 real reason you worked through this Tutorial in the first place.
 
+
 =head2  Config::General Config for this tutorial
 
 If you are having difficulty with YAML config above, please save the
@@ -651,7 +663,6 @@ Apache config files.
    indicator   submit
    
 
-
 =head1 AUTHOR
 
 Kennedy Clark, C<hkclark@gmail.com>