Switch from 'sub base :Path :Args(0)' to 'sub index : Private' for
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Tutorial / AdvancedCRUD.pod
index 22f562b..c68d6c8 100644 (file)
@@ -2,8 +2,6 @@
 
 Catalyst::Manual::Tutorial::AdvancedCRUD - Catalyst Tutorial - Part 8: Advanced CRUD
 
-
-
 =head1 OVERVIEW
 
 This is B<Part 8 of 9> for the Catalyst tutorial.
@@ -46,12 +44,10 @@ B<AdvancedCRUD>
 
 =item 9
 
-L<Appendicies|Catalyst::Manual::Tutorial::Appendicies>
+L<Appendices|Catalyst::Manual::Tutorial::Appendices>
 
 =back
 
-
-
 =head1 DESCRIPTION
 
 This part of the tutorial explores more advanced functionality for
@@ -64,24 +60,24 @@ forms and model objects.
 In keeping with the Catalyst (and Perl) spirit of flexibility, there are
 many different ways approach advanced CRUD operations in a Catalyst
 environment.  One alternative is to use
-L<Catalyst::Helper::Controller::Scaffold|Catalyst::Helper::Controller::Scaffold>
-to instantly construct a set of Controller methods and templates for
-basic CRUD operations.  Although a popular subject in Quicktime movies
-that serve as promotional material for various frameworks, more
-real-world applications require more control.  Other options include
-L<Data::FormValidator|Data::FormValidator> and
+L<Catalyst::Helper::Controller::Scaffold|Catalyst::Helper::Controller::Scaffold> 
+to instantly construct a set of Controller methods and templates for 
+basic CRUD operations.  Although a popular subject in Quicktime 
+movies that serve as promotional material for various frameworks, 
+real-world applications generally require more control.  Other 
+options include L<Data::FormValidator|Data::FormValidator> and
 L<HTML::FillInForm|HTML::FillInForm>.
 
-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
-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
+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 
+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 
 auto-population/auto-saving).
 
-B<Note:> Part 8 of the tutorial is optional.  Users who do not which to
-use L<HTML::Widget|HTML::Widget> may skip this section.
+B<Note:> Part 8 of the tutorial is optional.  Users who do not wish to
+use L<HTML::Widget|HTML::Widget> may skip this part.
 
 B<TIP>: Note that all of the code for this part of the tutorial can be
 pulled from the Catalyst Subversion repository in one step with the
@@ -90,22 +86,18 @@ following command:
     svn checkout http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Tutorial@###
     IMPORTANT: Does not work yet.  Will be completed for final version.
 
-
-
 =head1 C<HTML::WIDGET> FORM CREATION
 
 This section looks at how L<HTML::Widget|HTML::Widget> can be used to
 add additional functionality to the manually created form from Part 3.
 
-
 =head2 Add the C<HTML::Widget> Plugin
 
 Open C<lib/MyApp.pm> in your editor and add the following to the list of
-plugins (be sure to leave the existing plugins enabled:
+plugins (be sure to leave the existing plugins enabled):
 
     HTML::Widget
 
-
 =head2 Add a Form Creation Helper Method
 
 Open C<lib/MyApp/Controller/Books.pm> in your editor and add the
@@ -119,7 +111,7 @@ following method:
     
     sub make_book_widget {
         my ($self, $c) = @_;
-
+    
         # Create an HTML::Widget to build the form
         my $w = $c->widget('book_form')->method('post');
     
@@ -134,19 +126,17 @@ following method:
         $w->element('Select',    'authors')->label('Authors')
             ->options(@authors);
         $w->element('Submit',    'submit' )->value('submit');
-
+    
         # Return the widget    
         return $w;
     }
 
 This method provides a central location (so it can be called by multiple
-actions, such as create and edit) that builds an HTML::Wiget-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 quickly 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.
-
+actions, such as C<create> and C<edit>) 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
 
@@ -214,7 +204,6 @@ so allows us to have the same form submit the data to different actions
 (e.g., C<hw_create_do> for a create operation but C<hw_update_do> to
 update an existing book object).
 
-
 =head2 Update the CSS
 
 Edit C<root/src/ttsite.css> and add the following lines to the bottom of
@@ -245,19 +234,18 @@ These changes will display form elements vertically and also show error
 messages in red.  Note that we are pulling the color scheme settings
 from the C<root/lib/config/col> file that was created by the TTSite
 helper.  This allows us to change the color used by various error styles
-in the CCS from a single location.
-
+in the CSS from a single location.
 
 =head2 Create a Template Page To Display The Form
 
-C<root/src/books/hw_form.tt2>
+Open C<root/src/books/hw_form.tt2> in your editor and enter the following:
+
     [% META title = 'Create/Update Book' %]
     
     [% widget_result.as_xml %]
     
     <p><a href="[% Catalyst.uri_for('list') %]">Return to book list</a></p>
 
-
 =head2 Add Links for Create and Update via C<HTML::Widget>
 
 Open C<root/src/books/list.tt2> in your editor and add the following to
@@ -269,7 +257,6 @@ the bottom of the existing file:
       <a href="[% Catalyst.uri_for('hw_update') %]">Update</a>
     </p>
 
-
 =head2 Test The <HTML::Widget> Create Form
 
 Press C<Ctrl-C> to kill the previous server instance (if it's still
@@ -290,7 +277,7 @@ bogus information.  Although we have constrained the authors with the
 drop-down list, 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 (you can use any number you want, and even non-numeric values
-with SQLite).  The next section seeks to address this concern.
+with SQLite).  The next section will address this concern.
 
 B<Note:> Depending on the database you are using and how you established
 the columns in your tables, the database could obviously provide various
@@ -298,7 +285,6 @@ levels of "type enforcement" on your data.  The key point being made in
 the previous paragraph is that the I<web application> itself is not
 performing any validation.
 
-
 =head1 C<HTML::WIDGET> VALIDATION AND FILTERING
 
 Although the use of L<HTML::Widget|HTML::Widget> in the previous section
@@ -310,7 +296,6 @@ form contains a valid email address).  Filtering can be used to remove
 extraneous whitespace from fields or to escape meta-characters in user
 input.
 
-
 =head2 Add Constraints and Filters to the Widget Creation Method
 
 Open C<lib/MyApp/Controller/Books.pm> in your editor and update the
@@ -319,7 +304,7 @@ been marked with a C<*** NEW:> comment):
 
     sub make_book_widget {
         my ($self, $c) = @_;
-
+    
         # Create an HTML::Widget to build the form
         my $w = $c->widget('book_form')->method('post');
             
@@ -327,7 +312,7 @@ been marked with a C<*** NEW:> comment):
         my @authorObjs = $c->model("MyAppDB::Author")->all();
         my @authors = map {$_->id => $_->last_name }
                            sort {$a->last_name cmp $b->last_name} @authorObjs;
-   
+    
         # Create the form feilds
         $w->element('Textfield', 'title'  )->label('Title')->size(60);
         $w->element('Textfield', 'rating' )->label('Rating')->size(1);
@@ -376,7 +361,6 @@ Two filters are run on every field to remove and escape unwanted input.
 
 =back
 
-
 =head2 Rebuild the Form Submission Method to Include Validation
 
 Edit C<lib/MyApp/Controller/Books.pm> and change C<hw_create_do> to
@@ -463,7 +447,6 @@ similar to the prior version of the C<hw_create_do> method.
 
 =back
 
-
 =head2 Try Out the Form
 
 Press C<Ctrl-C> to kill the previous server instance (if it's still running) and restart it:
@@ -476,7 +459,6 @@ two, and zero authors.  When you click Submit, the HTML::Widget
 C<constraint> items will validate the logic and insert feedback as
 appropriate.
 
-
 =head1 Enable C<DBIx::Class::HTMLWidget> Support
 
 In this section we will take advantage of some of the "auto-population"
@@ -488,7 +470,7 @@ model classes:
 
 =item *
 
-fill_wiget()
+fill_widget()
 
 Takes data from the database and transfers it to your form widget.
 
@@ -504,7 +486,6 @@ records in the database.
 In other words, the two methods are a mirror image of each other: one
 reads from the database while the other writes to the database.
 
-
 =head2 Add C<DBIx::Class::HTMLWidget> to DBIC Model
 
 In order to use L<DBIx::Class::HTMLWidget|DBIx::Class::HTMLWidget>, we
@@ -515,7 +496,6 @@ C<lib/MyAppDB/Book.pm> and update the C<load_components> line to match:
 
        __PACKAGE__->load_components(qw/PK::Auto Core HTMLWidget/);
 
-
 =head2 Use C<populate_from_widget> in C<hw_create_do>
 
 Edit C<lib/MyApp/Controller/Books.pm> and update C<hw_create_do> to
@@ -577,16 +557,13 @@ C<populate_from_widget> does not currently handle the relationships
 between tables.
 
 
-
 =head1 AUTHOR
 
 Kennedy Clark, C<hkclark@gmail.com>
 
-Please report any errors, issues or suggestions to the author.
-
-Copyright 2006, Kennedy Clark. All rights reserved.
-
-This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
-
-Version: .94
+Please report any errors, issues or suggestions to the author.  The
+most recent version of the Catlayst 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
+(L<http://creativecommons.org/licenses/by-nc-sa/2.5/>).