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=f261950cab69f19309e52c0a1bb1ee2006c35a11;hp=c492ccc5779490f4bc9ca7d7b8ed7283e896c9b4;hb=4b4d38842b2383a70a54bcadb493505950b469dd;hpb=cf582e91b80f0002a576fd6c01cb571311cb609f diff --git a/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod b/lib/Catalyst/Manual/Tutorial/AdvancedCRUD/FormFu.pod index c492ccc..f261950 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 =head1 OVERVIEW -This is B for the Catalyst tutorial. +This is B for the Catalyst tutorial. L @@ -71,55 +69,39 @@ 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: - - 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 \ - libcrypt-des-perl libcaptcha-recaptcha-perl libcrypt-cbc-perl \ - libreadonly-xs-perl libmoose-perl libregexp-assemble-perl - - ... - - sudo apt-get clean +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: -Then use the following command to install directly from CPAN the modules -that aren't available as Ubuntu/Debian packages via C: +we need to install the +L package: - 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 - + 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 Debian packages: -B 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 command. You can free up some space with -C. + 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 parent 'Catalyst::Controller'; @@ -139,7 +121,7 @@ following method: =cut - sub formfu_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 @@ -152,18 +134,18 @@ following method: # 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 @@ -233,6 +215,7 @@ this document for a more foolproof config format. Edit C and add the following lines to the bottom of the file: + ... input { display: block; } @@ -260,7 +243,7 @@ Open C in your editor and enter the following: [%# Render the HTML::FormFu Form %] [% form %] -

Return to book list

+

Return to book list

=head2 Add Links for Create and Update via C @@ -268,9 +251,10 @@ 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 @@ -464,7 +448,8 @@ bottom: =cut - sub formfu_edit :Local :FormConfig('books/formfu_create.yml') { + sub formfu_edit :Chained('object') :PathPart('formfu_edit') :Args(0) + :FormConfig('books/formfu_create.yml') { my ($self, $c, $id) = @_; # Get the specified book @@ -473,7 +458,7 @@ bottom: # Make sure we were able to get a book unless ($book) { $c->flash->{error_msg} = "Invalid book -- Cannot edit"; - $c->response->redirect($c->uri_for('list')); + $c->response->redirect($c->uri_for($self->action_for('list'))); $c->detach; } @@ -485,18 +470,18 @@ bottom: # is shorthand for "$form->submitted && !$form->has_errors" if ($form->submitted_and_valid) { # 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 edited'; # 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_bjs) { push(@authors, [$_->id, $_->last_name]); } # Get the select added by the config file @@ -504,7 +489,7 @@ bottom: # Add the authors to it $select->options(\@authors); # Populate the form with existing values from DB - $form->defaults_from_model($book); + $form->model->default_values($book); } # Set the template @@ -533,14 +518,14 @@ 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 -new book and just use C<$form-Esave_to_model> to update the existing +new book and just use C<$form-Emodel-Eupdate> to update the existing book. =item * If the form is being displayed for the first time (or has failed validation and it being redisplayed), we use - C<$form-Edefault_from_model> to populate the form with data from the + C<$form-Emodel-Edefault_values> to populate the form with data from the database. =back @@ -553,9 +538,9 @@ following: ... [% # Add a link to delete a book %] - Delete + Delete [% # Add a link to edit a book %] - Edit + Edit ... @@ -579,6 +564,36 @@ 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 +tweaking the example application; some things you might want to do: + +=over 4 + +=item * + +Add an appropriate authorization check to the new Edit function. + +=item * + +Cleanup the List page so that the Login link only displays when the user +isn't logged in and the Logout link only displays when a user is logged +in. + +=item * + +Add a more sensible policy for when and how users and admins can do +things in the CRUD cycle. + +=item * + +Support the CRUD cycle for authors. + +=back + +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