Remove TTSite in favor of manually created wrapper template and css
[catagits/Catalyst-Manual.git] / lib / Catalyst / Manual / Tutorial / AdvancedCRUD / FormFu.pod
index af75d42..4e6dba6 100644 (file)
@@ -1,5 +1,7 @@
 =head1 NAME
 
+
+
 Catalyst::Manual::Tutorial::AdvancedCRUD::FormFu - Catalyst Tutorial - Part 9: Advanced CRUD - FormFu
 
 
@@ -124,8 +126,8 @@ following method:
         # 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
@@ -203,8 +205,8 @@ following text:
           value: Submit
 
 B<NOTE:> Copying and pasting YAML from perl documentation is sometimes
-tricky.  See the L<Copy-Paste versions of the YAML Config> section of
-this document for a foolproof procedure.
+tricky.  See the L<Config::General Config for this tutorial> section of
+this document for a more foolproof config format.
 
 
 =head2 Update the CSS
@@ -239,7 +241,7 @@ Open C<root/src/books/formfu_create.tt2> in your editor and enter the following:
     [%# 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>
@@ -249,7 +251,7 @@ the bottom of the existing file:
 
     <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
@@ -315,23 +317,15 @@ to match:
           # 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
               max: 40
               # Override the default of 'Invalid input'
               message: Length must be between 5 and 40 characters
-    
+
         # Another text field for the numeric rating
         - type: Text
           name: rating
@@ -340,15 +334,17 @@ to match:
             title: Enter a rating between 1 and 5 here
           # Use Filter to clean up the input data
           filter:
-            # Remove whitespace at both ends
-            - TrimEdges
             # Remove everything except digits
             - NonNumeric
           # Add constraints to the field
           constraints:
-            - SingleValue
+            - Required
             # Make sure it's a number
             - Integer
+            message: "Digits only, please."
+            # Filters apply before constraints.
+            # If a user gives the rating "excellent", the NonNumeric filter would remove the entire string as it contains no digits. 
+            # Remove the NonNumeric filter and let the Integer constraint handle the validation and error message.
     
         # Add a select list for the author selection.  Note that we will
         # dynamically fill in all the authors from the controller but we
@@ -366,12 +362,6 @@ to match:
           # 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
@@ -382,14 +372,20 @@ to match:
           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<Copy-Paste versions of the YAML Config> section of
-this document for a foolproof procedure.
+tricky.  See the L<Config::General Config for this tutorial> section of
+this document for a more foolproof config format.
 
 The main changes are:
 
@@ -460,8 +456,8 @@ bottom:
         # 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
@@ -532,9 +528,9 @@ 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>
 
 
@@ -554,139 +550,60 @@ be returned to the book list with a "Book edited" message at the top in
 green.  Experiment with other edits to various books.
 
 
-=head2 Copy-Paste versions of the YAML Config.
-
-YAML, the config format used in formfu depends on whitespace and can
-behave strangely in perl documentation because POD is also whitespace
-dependent.  If you copy and paste the YAML below into the file
-C<root/forms/books/formfu_create.yml> and then run the following perl
-oneliner, you're pretty much guaranteed to get valid YAML:
-
- $ perl -p -i -e 's/\s+\|//g' root/forms/books/formfu_create.yml
-
-=head2 YAML for the first half of the tutorial:
-
-    |---
-    |# indicator is the field that is used to test for form submission
-    |indicator: submit
-    |# Start listing the form elements
-    |elements:
-    |    # The first element will be a text field for the title
-    |    - type: Text
-    |      name: title
-    |      label: Title
-    |      # 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
-
-
-=head2  YAML for the second part of the tutorial
-
-    |---
-    |# indicator is the field that is used to test for form submission
-    |indicator: submit
-    |# Start listing the form elements
-    |elements:
-    |    # The first element will be a text field for the title
-    |    - type: Text
-    |      name: title
-    |      label: Title
-    |      # 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
-    |          max: 40
-    |          # Override the default of 'Invalid input'
-    |          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
-    |      filter:
-    |        # Remove whitespace at both ends
-    |        - TrimEdges
-    |        # Remove everything except digits
-    |        - NonNumeric
-    |      # Add constraints to the field
-    |      constraints:
-    |        - SingleValue
-    |        # Make sure it's a number
-    |        - Integer
-    |
-    |    # 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
-    |      # 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
-    |        - Integer
-    |
-    |    # The submit button
-    |    - type: Submit
-    |      name: submit
-    |      value: Submit
-    |
-    |# Globally ensure that each field only specified one value
-    |constraints:
-    |    # The user cannot leave any fields blank
-    |    - Required
+=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