Doc tweaks from drewbie
Jesse Sheidlower [Wed, 6 Jul 2005 16:42:25 +0000 (16:42 +0000)]
lib/Catalyst/Manual/Cookbook.pod
lib/Catalyst/Manual/Intro.pod
lib/Catalyst/Manual/Tutorial.pod

index 2a7f3fa..573a8ff 100644 (file)
@@ -10,8 +10,8 @@ Yummy code like your mum used to bake!
 
 =head2 Force debug screen
 
-You can force Catalyst to display the debug screen at the end of the
-request by placing a C<die()> call in the C<end> action.
+You can force Catalyst to display the debug screen at the end of the request by
+placing a C<die()> call in the C<end> action.
 
      sub end : Private {
          my ( $self, $c ) = @_;
@@ -19,15 +19,9 @@ request by placing a C<die()> call in the C<end> action.
      }
 
 If you're tired of removing and adding this all the time, you
-can add a condition in the C<end> action:
+can easily add a condition. For example:
 
-    sub end : Private {
-        my ( $self, $c ) = @_;
-        die "forced debug" if $c->req->params->{dump_info};
-    }
-
-Then just add to your query string C<"&dump_info=1">, or the like,
-to force debug output.
+  die "force debug" if $c->req->params->{dump_info};
 
 =head2 Disable statistics
 
@@ -72,12 +66,10 @@ Just use Catalyst::Model::CDBI::CRUD as your base class.
 
     1;
 
-Modify the $c->form() parameters to match your needs, and don't forget
-to copy the templates into the template root. Can't find the templates?
-They were in the CRUD model distribution, so you can do B<look
-Catalyst::Model::CDBI::CRUD> from the CPAN shell to find them.
-
-Other Scaffolding modules are in development at the time of writing.
+Modify the $c->form() parameters to match your needs, and don't forget to copy
+the templates into the template root. Can't find the templates? They were in the
+CRUD model distribution, so you can do B<look Catalyst::Model::CDBI::CRUD> from 
+the CPAN shell to find them.
 
 =head2 Single file upload with Catalyst
 
@@ -90,8 +82,7 @@ this:
       <input type="submit" value="Send">
     </form>
 
-It's very important not to forget C<enctype="multipart/form-data"> in
-the form.
+It's very important not to forget C<enctype="multipart/form-data"> in form. Uploads will not work without this.
 
 Catalyst Controller module 'upload' action:
 
@@ -116,9 +107,10 @@ Catalyst Controller module 'upload' action:
 
 =head2 Multiple file upload with Catalyst
 
-Code for uploading multiple files from one form needs a few changes:
+Code for uploading multiple files from one form needs little changes compared
+to single file upload.
 
-The form should have this basic structure:
+Form goes like this:
 
     <form action="/upload" method="post" enctype="multipart/form-data">
       <input type="hidden" name="form_submit" value="yes">
@@ -128,7 +120,7 @@ The form should have this basic structure:
       <input type="submit" value="Send">
     </form>
 
-And in the Controller:
+Controller:
 
     sub upload : Local {
         my ($self, $c) = @_;
@@ -150,23 +142,22 @@ And in the Controller:
         $c->stash->{template} = 'file_upload.html';
     }
 
-C<for my $field ($c-E<gt>req->upload)> loops automatically over all file
-input fields and gets input names. After that is basic file saving code,
-just like in single file upload.
+C<for my $field ($c-E<gt>req->upload)> loops automatically over all file input
+fields and gets input names. After that is basic file saving code, just like in
+single file upload.
 
-Notice: C<die>ing might not be what you want to do, when an error
-occurs, but it works as an example. A better idea would be to store
-error C<$!> in $c->stash->{error} and show a custom error template
-displaying this message.
+Notice: C<die>ing might not be what you want to do, when an error occurs, but
+it works as an example. A better idea would be to store error C<$!> in
+$c->stash->{error} and show a custom error template displaying this message.
 
 For more information about uploads and usable methods look at
-L<Catalyst::Request::Upload> and L<Catalyst::Request>.
+C<Catalyst::Request::Upload> and C<Catalyst::Request>.
 
 =head2 Authentication with Catalyst::Plugin::Authentication::CDBI
 
 There are (at least) two ways to implement authentication with this plugin:
-1) only checking username and password
-2) checking username, password, and the roles the user has
+1) only checking username and password;
+2) checking username, password and the roles the user has
 
 For both variants you'll need the following code in your MyApp package:
 
@@ -294,19 +285,20 @@ And this is all you need to do.
 
 =head2 Pass-through login (and other actions)
 
-An easy way of having assorted actions that occur during the processing of
-a request that are orthogonal to its actual purpose - logins, silent
+An easy way of having assorted actions that occur during the processing
+of a request that are orthogonal to its actual purpose - logins, silent
 commands etc. Provide actions for these, but when they're required for
-something else fill e.g. a form variable __login and have a sub begin like so:
+something else fill e.g. a form variable __login and have a sub begin
+like so:
 
-sub begin : Private {
-  my ($self, $c) = @_;
-  foreach my $action (qw/login docommand foo bar whatever/) {
-    if ($c->req->params->{"__${action}"}) {
-      $c->forward($action);
+    sub begin : Private {
+      my ($self, $c) = @_;
+      foreach my $action (qw/login docommand foo bar whatever/) {
+        if ($c->req->params->{"__${action}"}) {
+          $c->forward($action);
+        }
+      }
     }
-  }
-}
 
 =head2 How to use Catalyst without mod_perl
 
@@ -369,155 +361,30 @@ authentication, authorization, and access check phases.
 
 For more information see the FastCGI documentation, the C<FCGI> module 
 and L<http://www.fastcgi.com/>.
+=head2 Forwarding with a parameter
 
-=head2 Serving static content
-
-Serving static content in Catalyst can be somewhat tricky; this recipe
-shows one possible solution. Using this recipe will serve all static
-content through Catalyst when developing with the built-in HTTP::Daemon
-server, and will make it easy to use Apache to serve the content when
-your app goes into production.
-
-Static content is best served from a single directory within your root
-directory. Having many different directories such as C<root/css> and
-C<root/images> requires more code to manage, because you must separately
-identify each static directory--if you decide to add a C<root/js>
-directory, you'll need to change your code to account for it. In
-contrast, keeping all static directories as subdirectories of a main
-C<root/static> directory makes things much easier to manager. Here's an
-example of a typical root directory structure:
-
-    root/
-    root/content.tt
-    root/controller/stuff.tt
-    root/header.tt
-    root/static/
-    root/static/css/main.css
-    root/static/images/logo.jpg
-    root/static/js/code.js
-
-
-All static content lives under C<root/static> with everything else being
-Template Toolkit files. Now you can identify the static content by
-matching C<static> from within Catalyst.
-
-=head3 Serving with HTTP::Daemon (myapp_server.pl)
-
-To serve these files under the standalone server, we first must load the
-Static plugin. Install L<Catalyst::Plugin::Static> if it's not already
-installed.
-
-In your main application class (MyApp.pm), load the plugin:
-
-    use Catalyst qw/-Debug FormValidator Static OtherPlugin/;
-
-You will also need to make sure your end method does I<not> forward
-static content to the view, perhaps like this:
-
-    sub end : Private {
-        my ( $self, $c ) = @_;
-
-        $c->forward( 'MyApp::V::TT' ) 
-          unless ( $c->res->body || !$c->stash->{template} );
-    }
-
-This code will only forward to the view if a template has been
-previously defined by a controller and if there is not already data in
-C<$c-E<gt>res-E<gt>body>.
-
-Next, create a controller to handle requests for the /static path. Use
-the Helper to save time. This command will create a stub controller as
-C<lib/MyApp/C/Static.pm>.
-
-    $ script/myapp_create.pl controller Static
-
-Edit the file and add the following methods:
-
-    # serve all files under /static as static files
-    sub default : Path('/static') {
-        my ( $self, $c ) = @_;
-    
-        # Optional, allow the browser to cache the content
-        $c->res->headers->header( 'Cache-Control' => 'max-age=86400' );
-
-        $c->serve_static; # from Catalyst::Plugin::Static
-    }
-
-    # also handle requests for /favicon.ico
-    sub favicon : Path('/favicon.ico') {
-        my ( $self, $c ) = @_;
-    
-        $c->serve_static;
-    }
-
-You can also define a different icon for the browser to use instead of
-favicon.ico by using this in your HTML header:
-
-    <link rel="icon" href="/static/myapp.ico" type="image/x-icon" />
-
-
-=head3 Common problems
-
-The Static plugin makes use of the C<shared-mime-info> package to
-automatically determine MIME types. This package is notoriously
-difficult to install, especially on win32 and OSX. For OSX the easiest
-path might be to install Fink, then use C<apt-get install
-shared-mime-info>. Restart the server, and everything should be fine.
-
-Make sure you are using the latest version (>= 0.16) for best
-results. If you are having errors serving CSS files, or if they get
-served as text/plain instead of text/css, you may have an outdated
-shared-mime-info version. You may also wish to simply use the following
-code in your Static controller:
-
-    if ($c->req->path =~ /css$/i) {
-        $c->serve_static( "text/css" );
-    } else {
-        $c->serve_static;
-    }
+Sometimes you want to pass along arguments when forwarding to another
+action. As of version 5.30, arguments can be passed in the call to
+C<forward>; in earlier versions, you can manually set the arguments in
+the Catalyst Request object:
 
-=head3 Serving with Apache
-
-When using Apache, you can completely bypass Catalyst and the Static
-controller by intercepting requests for the C<root/static> path at the
-server level. All that is required is to define a DocumentRoot and add a
-separate Location block for your static content. Here is a complete
-config for this application under mod_perl 1.x; variations, some of
-which could be simpler, are left as an exercise for the reader:
-
-    <Perl>
-        use lib qw(/var/www/MyApp/lib);
-    </Perl>
-    PerlModule MyApp
-    
-    <VirtualHost *>
-        ServerName myapp.example.com
-        DocumentRoot /var/www/MyApp/root
-        <Location />
-            SetHandler perl-script
-            PerlHandler MyApp
-        </Location>
-        <LocationMatch "/(static|favicon.ico)">
-            SetHandler default-handler
-        </LocationMatch>
-    </VirtualHost>
-
-=head2 Forwarding with arguments
+  # version 5.30 and later:
+  $c->forward('/wherever', [qw/arg1 arg2 arg3/]);
 
-Sometimes you want to pass along arguments when forwarding to another
-action. This can be accomplished by simply setting the arguments before
-the forward:
+  # pre-5.30
   $c->req->args([qw/arg1 arg2 arg3/]);
   $c->forward('/wherever');
 
+(See L<Catalyst::Manual::Intro#Flow_Control> for more information on
+passing arguments via C<forward>.)
+
 =head1 AUTHOR
 
 Sebastian Riedel, C<sri@oook.de>
-Danijel Milicevic, C<me@danijel.de>
-Viljo Marrandi, C<vilts@yahoo.com>
-Marcus Ramberg, C<mramberg@cpan.org>
-Andy Grundman, C<andy@hybridized.org>
+Danijel Milicevic C<me@danijel.de>
+Viljo Marrandi C<vilts@yahoo.com>
+Marcus Ramberg C<mramberg@cpan.org>
 
 =head1 COPYRIGHT
 
index 57281a1..195cc8f 100644 (file)
@@ -418,6 +418,7 @@ Called at the end of a request, after all matching actions are called.
     Package MyApp::C::Foo;
     sub begin : Private { }
     sub default : Private { }
+    sub auto : Private { }
 
 You can define built-in private actions within your controllers as
 well. The actions will override the ones in less-specific controllers,
@@ -427,13 +428,13 @@ cycle. Thus, if C<MyApp::C::Catalog::begin> exists, it will be run in
 place of C<MyApp::begin> if you're in the C<catalog> namespace, and
 C<MyApp::C::Catalog::Order::begin> would override this in turn.
 
-In addition to the normal built-ins, you have a special action for
-making chains, C<auto>. Such C<auto> actions will be run after any
+In addition to the normal built-in actions, you have a special action
+for making chains, C<auto>. Such C<auto> actions will be run after any
 C<begin>, but before your action is processed. Unlike the other
-built-ins, C<auto> actions I<do not> override each other; they will
-be called in turn, starting with the application class and going
-through to the I<most> specific class. I<This is the reverse of the
-order in which the normal built-ins override each other>.
+built-ins, C<auto> actions I<do not> override each other; they will be
+called in turn, starting with the application class and going through to
+the I<most> specific class. I<This is the reverse of the order in which
+the normal built-ins override each other>.
 
 Here are some examples of the order in which the various built-ins
 would be called:
index e26ae30..118950b 100644 (file)
@@ -209,13 +209,15 @@ for any component modules, locating and registering any actions it
 finds in those modules.
 
 Component modules have names prefixed with the application module name,
-followed by C<Model>, C<View> or C<Controller> (or the default short
-forms: C<M>, C<V> or C<C>) followed by the component name, for example:
+followed by C<M>, C<V> or C<C> (or the optional long
+forms: C<Model>, C<View> or C<Controller>) followed by the component
+name, for example:
 
+    My::App::C::ShoppingCart           # short (default) version 
     My::App::Controller::ShoppingCart  # long version
-    My::App::C::ShoppingCart           # short version 
-
 
+    My::App::M::User                   # short (default) version
+    My::App::Model::User               # long version
 
 =head2 Extending the generated code
 
@@ -231,11 +233,22 @@ You can start extending the application by adding new actions:
       $c->res->output('Congratulations, My::App is on Catalyst!');
     }
 
+    # called like '/article/2005/06'
+    sub archive_month : Regex('^article/(\d{4})/(\d{2})$') {
+      my ( $self, $c ) = @_;
+
+      my $datetime = DateTime->new(
+          year  => $c->request->snippets->[0],
+          month => $c->request->snippets->[1]
+      );
+    }
 
 TODO: explain briefly about plugins, actions, and components
 
-regex actions passed subexpression matches in $c->req->snippets
-(array ref).
+If the action is a Regex type, you can use capturing parentheses to
+extract values within the matching URL (2005, 06 in the above
+example). Those values are available in the $c->req->snippets
+anonymous array. See L<Catalyst::Manual::Intro#Actions> for details.
 
 
 =head2 Hooking in to Template Toolkit