Other Scaffolding modules are in development at the time of writing.
-=head2 Single file upload with Catalyst
+=head2 File uploads
+
+=head3 Single file upload with Catalyst
To implement uploads in Catalyst you need to have a HTML form similiar to
this:
$c->stash->{template} = 'file_upload.html';
}
-=head2 Multiple file upload with Catalyst
+=head3 Multiple file upload with Catalyst
Code for uploading multiple files from one form needs a few changes:
$c->session_login($c->req->params->{username},
$c->req->params->{password} );
if ($c->req->{user}) {
- $c->forward('?restricted_area');
+ $c->forward('/restricted_area');
}
}
}
sub add : Local {
my ($self, $c) = @_;
if ($c->roles(qw/admin/)) {
- $c->req->output("Your account has the role 'admin.'");
+ $c->res->output("Your account has the role 'admin.'");
} else {
- $c->req->output("You're not allowed to be here.");
+ $c->res->output("You're not allowed to be here.");
}
}
One thing you might need is to forward non-authenticated users to a login
form if they try to access restricted areas. If you want to do this
controller-wide (if you have one controller for your admin section) then it's
-best to add a user check to a '!begin' action:
+best to add a user check to a 'begin' action:
sub begin : Private {
my ($self, $c) = @_;
unless ($c->req->{user}) {
$c->req->action(undef); ## notice this!!
- $c->forward('?login');
+ $c->forward('/user/login');
}
}
just too slow. There's also an alternative to mod_perl that gives
reasonable performance named FastCGI.
-B<Using FastCGI>
+=head3 Using FastCGI
To quote from L<http://www.fastcgi.com/>: "FastCGI is a language
independent, scalable, extension to CGI that provides high performance
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:
+config for this application under mod_perl 1.x:
<Perl>
use lib qw(/var/www/MyApp/lib);
</LocationMatch>
</VirtualHost>
+And here's a simpler example that'll get you started:
+
+ Alias /static/ "/my/static/files/"
+ <Location "/static">
+ SetHandler none
+ </Location>
+
=head2 Forwarding with arguments
Sometimes you want to pass along arguments when forwarding to another
(See L<Catalyst::Manual::Intro#Flow_Control> for more information on
passing arguments via C<forward>.)
+=head2 Configure your application
+
+You configure your application with the C<config> method in your
+application class. This can be hard-coded, or brought in from a
+separate configuration file.
+
+=head3 Using YAML
+
+YAML is a method for creating flexible and readable configuration
+files. It's a great way to keep your Catalyst application configuration
+in one easy-to-understand location.
+
+In your application class (e.g. C<lib/MyApp.pm>):
+
+ use YAML;
+ # application setup
+ __PACKAGE__->config( YAML::LoadFile(__PACKAGE__->config->{'home'} . '/myapp.yml') );
+ __PACKAGE__->setup;
+
+Now create C<myapp.yml> in your application home:
+
+ --- #YAML:1.0
+ # DO NOT USE TABS FOR INDENTATION OR label/value SEPARATION!!!
+ name: MyApp
+
+ # authentication; perldoc Catalyst::Plugin::Authentication::CDBI
+ authentication:
+ user_class: 'MyApp::M::MyDB::Customer'
+ user_field: 'username'
+ password_field: 'password'
+ password_hash: 'md5'
+ role_class: 'MyApp::M::MyDB::Role'
+ user_role_class: 'MyApp::M::MyDB::PersonRole'
+ user_role_user_field: 'person'
+
+ # session; perldoc Catalyst::Plugin::Session::FastMmap
+ session:
+ expires: '3600'
+ rewrite: '0'
+ storage: '/tmp/myapp.session'
+
+ # emails; perldoc Catalyst::Plugin::Email
+ # this passes options as an array :(
+ email:
+ - SMTP
+ - localhost
+
+This is equivalent to:
+
+ # configure base package
+ __PACKAGE__->config( name => MyApp );
+ # configure authentication
+ __PACKAGE__->config->{authentication} = {
+ user_class => 'MyApp::M::MyDB::Customer',
+ ...
+ };
+ # configure sessions
+ __PACKAGE__->config->{session} = {
+ expires => 3600,
+ ...
+ };
+ # configure email sending
+ __PACKAGE__->config->{email} = [qw/SMTP localhost/];
+
+See also L<YAML>.
+
+=head2 Using existing CDBI (etc.) classes with Catalyst
+
+Many people have existing Model classes that they would like to use with
+Catalyst (or, conversely, they want to write Catalyst models that can be
+used outside of Catalyst, e.g. in a cron job). It's trivial to write a
+simple component in Catalyst that slurps in an outside Model:
+
+ package MyApp::M::Catalog;
+ use base qw/Catalyst::Base Some::Other::CDBI::Module::Catalog/;
+ 1;
+
+and that's it! Now C<Some::Other::CDBI::Module::Catalog> is part of your
+Cat app as C<MyApp::M::Catalog>.
+
+=head2 Delivering a Custom Error Page
+
+By default, Catalyst will display its own error page whenever it
+encounters an error in your application. When running under C<-Debug>
+mode, the error page is a useful screen including the error message and
+a full Data::Dumper output of the C<$c> context object. When not in
+C<-Debug>, users see a simple "Please come back later" screen.
+
+To use a custom error page, use a special C<end> method to short-circut
+the error processing. The following is an example; you might want to
+adjust it further depending on the needs of your application (for
+example, any calls to C<fillform> will probably need to go into this
+C<end> method; see L<Catalyst::Plugin::FillInForm>).
+
+ sub end : Private {
+ my ( $self, $c ) = @_;
+
+ if ( scalar @{ $c->error } ) {
+ $c->stash->{errors} = $c->error;
+ $c->stash->{template} = 'errors.tt';
+ $c->forward('MyApp::View::TT');
+ $c->{error} = [];
+ }
+
+ return 1 if $c->response->status =~ /^3\d\d$/;
+ return 1 if $c->response->body;
+
+ unless ( $c->response->content_type ) {
+ $c->response->content_type('text/html; charset=utf-8');
+ }
+
+ $c->forward('MyApp::View::TT');
+ }
+
+You can manually set errors in your code to trigger this page by calling
+
+ $c->error( 'You broke me!' );
+
=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>
+Marcus Ramberg, C<mramberg@cpan.org>
+Jesse Sheidlower, C<jester@panix.com>
Andy Grundman, C<andy@hybridized.org>
-Marcus Ramberg C<mramberg@cpan.org>
+Chisel Wright, C<pause@herlpacker.co.uk>
=head1 COPYRIGHT