added cookbook example for localtime.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Cookbook.pod
CommitLineData
fc7ec1d9 1=head1 NAME
2
3Catalyst::Manual::Cookbook - Cooking with Catalyst
4
5=head1 DESCRIPTION
6
aba94964 7Yummy code like your mum used to bake!
fc7ec1d9 8
9=head1 RECIPES
10
11=head2 Force debug screen
12
13You can force Catalyst to display the debug screen at the end of the request by
14placing a die() call in the _end action.
15
16 __PACKAGE__->action(
17 '!end' => sub {
18 my ( $self, $c ) = @_;
19 die "testing";
20 }
21 );
22
23=head2 Disable statistics
24
25Just add this line to your application class if you don't want those nifty
26statistics in your debug messages.
27
28 sub Catalyst::Log::info { }
29
30=head2 Scaffolding
31
32Scaffolding is very simple with Catalyst.
33Just use Catalyst::Model::CDBI::CRUD as baseclass.
34
35 # lib/MyApp/Model/CDBI.pm
36 package MyApp::Model::CDBI;
37
38 use strict;
39 use base 'Catalyst::Model::CDBI::CRUD';
40
41 __PACKAGE__->config(
42 dsn => 'dbi:SQLite:/tmp/myapp.db',
43 relationships => 1
44 );
45
46 1;
47
48 # lib/MyApp.pm
49 package MyApp;
50
51 use Catalyst 'FormValidator';
52
53 __PACKAGE__->config(
54 name => 'My Application',
55 root => '/home/joeuser/myapp/root'
56 );
57
58 __PACKAGE__->action(
59 'table' => sub {
60 my ( $self, $c ) = @_;
61 $c->form( optional => [ MyApp::Model::CDBI::Table->columns ] );
62 $c->forward('MyApp::Model::CDBI::Table');
63 }
64 );
65
66 1;
67
68Modify the $c->form() parameters to match your needs, and don't forget to copy
69the templates. ;)
70
dd16873c 71=head2 Serving static files and CSS as text/css
aba94964 72
73If you want to serve static content (like images, txt or CSS) via Catalyst,
74then all you need is the plugin Catalyst::Plugin::Static as well as a small
75regex to set the MIME type for CSS to text/css.
76
77 # lib/MyApp.pm
78 package MyApp;
79
80 use strict;
81 use Catalyst qw/-Debug Static/;
82
83 __PACKAGE__->action(
84
85 '!default' => sub {
86 my ( $self, $c ) = @_;
87 $c->serve_static;
88 },
89
90 '/^.*\.css$/' => sub {
91 my ( $self, $c ) = @_;
92 $c->serve_static('text/css');
93 },
94 );
95
dd16873c 96=head2 Uploads with Catalyst
aba94964 97
98To implement uploads in Catalyst you need to have a HTML form similiar to
99this:
100
101 <form action="/upload" method="post" enctype="multipart/form-data">
102 <input type="hidden" name="form_submit" value="yes">
103 <input type="file" name="my_file">
104 <input type="submit" value="Send">
105 </form>
106
107It's very important not to forget enctype="multipart/form-data" in form,
108if it's not there, uploads just don't work.
109
110Catalyst Controller module 'upload' action:
111
112 MyApp->action(
113
114 'upload' => sub {
115 my ($self, $c) = @_;
116 if ($c->req->parameters->{form_submit} eq 'yes') {
117 my $filename = $c->req->parameters->{my_file};
118 if ($filename) {
119 my $fh = $c->req->uploads->{$filename}->{fh};
120 open(NEW_FILE, ">/tmp/$filename") or die
121 "Can't open file for writing: $!";
122 while ($fh->read(my $buf, 32768)) {
123 print NEW_FILE $buf;
124 }
125 close(NEW_FILE);
126 }
127 }
128 $c->stash->{template} = 'upload_form.tt';
129 $c->forward('MyApp::V::View');
130 },
131 );
132
133If you want to upload bigger files than 1MB, then just add to your Controller
134module:
135
136 $CGI::Simple::POST_MAX = 1048576000;
137
dd16873c 138
139=head2 Easily working with datetime objects.
140
141If you store datetime data in your tables, you can easily expand this column to
142a L<Time::Piece> object which lets you call useful methods like ymd, mon and
143datetime on it.
144
3e53f0cd 145In order to set it up, add something like the following to your CDBI Model Class,
146if you are storing dates as ISO timestamps:
dd16873c 147
148 __PACKAGE__->has_a(
149 mycolumn => 'Time::Piece',
150 inflate => sub { Time::Piece->strptime( shift, "%FT%H:%M:%S" ) },
151 deflate => 'datetime'
152 );
153
3e53f0cd 154or if you prefer to store dates in unix epoch time you can do something like this:
155
156 __PACKAGE__->has_a(
157 mycolumn => 'Time::Piece',
158 inflate => sub { Time::Piece->strptime( shift, "%s" ) },
159 deflate => 'epoch'
160 );
161
dd16873c 162If you want to use another format in the database, you can change the strptime call
163to fit your format, and use strftime to return it with your custom format to the
164database during deflate. See the L<Time::Piece> and L<Class::DBI> docs for more info.
165
fc7ec1d9 166=head1 AUTHOR
167
168Sebastian Riedel, C<sri@oook.de>
169
170=head1 COPYRIGHT
171
172This program is free software, you can redistribute it and/or modify it under
173the same terms as Perl itself.