X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Manual.git;a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2FAdvancedCRUD%2FFormFu.pod;h=03414614046ece1f2e8adfd2eed86d3e0ef065fb;hp=66d95a7af1f603cfd6c36e91cc67837de6cceaf6;hb=faa6f5bc58eb607bc9737b290f2d84847d499d0c;hpb=9cb64a37c49966511f9435ac99c7473b287cae79 diff --git a/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod b/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod index 66d95a7..0341461 100644 --- a/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod +++ b/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod @@ -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 -NOTE: This part of the tutorial is in progress and will be ready soon. - =head1 OVERVIEW -This is B for the Catalyst tutorial. +This is B for the Catalyst tutorial. L @@ -47,7 +45,7 @@ L =item 9 -B +B =item 10 @@ -60,7 +58,8 @@ L This portion of the tutorial explores L 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 @@ -70,41 +69,45 @@ L. =head1 Install C -If you are following along in Ubuntu, it turns out that C -is not yet available as a package at the time this was written. To -install it with a combination of C packages and traditional -CPAN modules, first use C to install most of the modules -required by C: +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 +this was written. To install it with a combination of Debian packages +and traditional CPAN modules, first use C to install most of +the modules: + +we need to install the +L package: - 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 + sudo aptitude -y install libhtml-formfu-perl libmoose-perl \ + libregexp-assemble-perl libhtml-formfu-model-dbic-perl + + ... + + sudo aptitude clean Then use the following command to install directly from CPAN the modules -that aren't available as Ubuntu/Debian packages via C: +that aren't available as Debian packages: - sudo cpan File::ShareDir Task::Weaken Config::Any HTML::FormFu \ - Catalyst::Controller::HTML::FormFu + sudo cpan Catalyst::Component::InstancePerContext Catalyst::Controller::HTML::FormFu =head1 C FORM CREATION This section looks at how L 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 First, change your C to inherit from L -by changing the C line from the default of: +by changing the C 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 @@ -112,37 +115,37 @@ to use the FormFu base controller class: Open C in your editor and add the following method: - =head2 fu_form_create + =head2 formfu_create - Build an HTML::FormFu form for book creation and updates + Use HTML::FormFu to create a new book =cut - sub fu_form_create :Local :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 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 my $book = $c->model('DB::Books')->new_result({}); # Save the form data for the book - $form->save_to_model($book); + $form->model->update($book); # Set a status message for the user $c->flash->{status_msg} = 'Book created'; # Return to the books list - $c->response->redirect($c->uri_for('list')); + $c->response->redirect($c->uri_for($self->action_for('list'))); $c->detach; } else { # Get the authors from the DB - my @authorObjs = $c->model("DB::Authors")->all(); + my @author_objs = $c->model("DB::Authors")->all(); # Create an array of arrayrefs where each arrayref is an author my @authors; - foreach (sort {$a->last_name cmp $b->last_name} @authorObjs) { + foreach (sort {$a->last_name cmp $b->last_name} @author_objs) { push(@authors, [$_->id, $_->last_name]); } # Get the select added by the config file @@ -152,7 +155,7 @@ following method: } # Set the template - $c->stash->{template} = 'books/fu_form_create.tt2'; + $c->stash->{template} = 'books/formfu_create.tt2'; } @@ -164,7 +167,7 @@ create a directory to hold your form configuration files: mkdir -p root/forms/books -Then create the file C and enter the +Then create the file C and enter the following text: --- @@ -179,49 +182,68 @@ following text: # This is an optional 'mouse over' title pop-up attributes: title: Enter a book title here + + # Another text field for the numeric rating - type: Text name: rating label: Rating attributes: title: Enter a rating between 1 and 5 here + + # Add a drop-down list for the author selection. Note that we will + # dynamically fill in all the authors from the controller but we + # could manually set items in the drop-list by adding this YAML code: + # options: + # - [ '1', 'Bastien' ] + # - [ '2', 'Nasseh' ] + - type: Select + name: authors + label: Author + # The submit button - type: Submit name: submit value: Submit +B Copying and pasting YAML from perl documentation is sometimes +tricky. See the L section of +this document for a more foolproof config format. + =head2 Update the CSS -Edit C and add the following lines to the bottom of +Edit C and add the following lines to the bottom of the file: - label { + ... + input { display: block; } - .submit { + select { display: block; } - .error_messages { - color: [% site.col.error %]; + .submit { + padding-top: .5em; + display: block; } -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 file that was created by the TTSite -helper. This allows us to change the color used by various error styles -in the CSS from a single location. +These changes will display form elements vertically. Note that the +existing definition of the C<.error> class is pulling the color scheme +settings from the C file that was created by the +TTSite helper. This allows control over the CSS color settings from a +single location. =head2 Create a Template Page To Display The Form -Open C in your editor and enter the following: +Open C in your editor and enter the following: [% META title = 'Create/Update Book' %] [%# Render the HTML::FormFu Form %] [% form %] -

Return to book list

+

Return to book list

=head2 Add Links for Create and Update via C @@ -229,32 +251,38 @@ Open C in your editor and enter the following Open C in your editor and add the following to the bottom of the existing file: + ...

HTML::FormFu: - Create + Create

+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 Create Form +=head2 Test The Create Form Press C to kill the previous server instance (if it's still running) and restart it: $ script/myapp_server.pl -Login as C. Once at the Book List page, click the HTML::FormFu -"Create" link to display for form produced by C. Fill -out the form with 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 -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 will address this concern. +Login as C (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 +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 +(you can use any number you want, and even non-numeric values with +SQLite). The next section will address this concern. B Depending on the database you are using and how you established the columns in your tables, the database could obviously provide various @@ -265,19 +293,19 @@ performing any validation. =head1 C VALIDATION AND FILTERING -Although the use of L in the previous section -did provide an automated mechanism to build the form, the real power of -this module stems from functionality that can automatically validate and -filter the user input. Validation uses constraints to be sure that -users input appropriate data (for example, that the email field of a -form contains a valid email address). Filtering can be used to remove -extraneous whitespace from fields or to escape meta-characters in user -input. +Although the use of L in the previous section +did provide an automated mechanism to build the form, the real power of +this module stems from functionality that can automatically validate and +filter the user input. Validation uses constraints to be sure that +users input appropriate data (for example, that the email field of a +form contains a valid email address). Filtering can also be used to +remove extraneous whitespace from fields or to escape meta-characters in +user input. -=head2 Add Constraints +=head2 Add Constraints -Open C in your editor and update it +Open C in your editor and update it to match: --- @@ -294,32 +322,341 @@ to match: title: Enter a book title here # Add constraints for the field constraints: - # The user cannot leave this field blank - - Required - # Force the length to be between 2 and 30 chars + # Force the length to be between 5 and 40 chars - type: Length - min: 2 - max: 30 + min: 5 + max: 40 # Override the default of 'Invalid input' - message: Length must be between 2 and 30 characters + message: Length must be between 5 and 40 characters + + # Another text field for the numeric rating - type: Text name: rating label: Rating attributes: title: Enter a rating between 1 and 5 here + # Use Filter to clean up the input data + # 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 + # Add constraints to the field + constraints: + # Make sure it's a number + - 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 + # could manually set items in the select by adding this YAML code: + # options: + # - [ '1', 'Bastien' ] + # - [ '2', 'Nasseh' ] + - type: Select + name: authors + label: Author + # Convert the drop-down to a multi-select list + multiple: 1 + # Display 3 entries (user can scroll to see others) + size: 3 + # 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 + # Add constraints to the field constraints: - - Required # Make sure it's a number - Integer + # The submit button - type: Submit name: submit value: Submit - # Globally ensure that each field only specified one value + + # Global filters and constraints. constraints: - - SingleValue + # 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 Copying and pasting YAML from perl documentation is sometimes +tricky. See the L section of +this document for a more foolproof config format. + +The main changes are: + +=over 4 + +=item * + +The C