[Catalyst-commits] r8724 -
trunk/examples/CatalystAdvent/root/2008/pen
zarquon at dev.catalyst.perl.org
zarquon at dev.catalyst.perl.org
Fri Dec 5 01:39:57 GMT 2008
Author: zarquon
Date: 2008-12-05 01:39:57 +0000 (Fri, 05 Dec 2008)
New Revision: 8724
Added:
trunk/examples/CatalystAdvent/root/2008/pen/5.pod
Removed:
trunk/examples/CatalystAdvent/root/2008/pen/AdventPhotoGallery.pod
Log:
day 5
Copied: trunk/examples/CatalystAdvent/root/2008/pen/5.pod (from rev 8718, trunk/examples/CatalystAdvent/root/2008/pen/AdventPhotoGallery.pod)
===================================================================
--- trunk/examples/CatalystAdvent/root/2008/pen/5.pod (rev 0)
+++ trunk/examples/CatalystAdvent/root/2008/pen/5.pod 2008-12-05 01:39:57 UTC (rev 8724)
@@ -0,0 +1,510 @@
+=head1 Super Simple Photo Gallery
+
+Let's create an extremely simple (but fun!) photogallery.
+First things first, we need to make sure we have everything.
+
+=head2 Our packing list:
+
+=over 12
+
+=item C<DBIx::Class::InflateColumn::FS>
+
+This will be used to store our file pointer in the database, write the
+image to the file system, and later, give us a Path::Class::File
+object to manipulate our images later on.
+
+=item C<Imager>
+
+The all and the everything for our image manipulation needs. If not
+installed already, make sure you install libjpeg so that JPEG files
+can be manipulated by Imager.
+
+
+=item C<MIME::Types>
+
+=item C<File::Mimeinfo>
+
+=item C<DateTime>
+
+=item C<Catalyst::Controller::HTML::FormFu>
+
+=back
+
+Once you have installed these modules, move on to the next step.
+
+=head1 Let's get started already!
+
+Ok. So here comes the fun stuff. We're going to assume you know how
+to create a Catalyst application skeleton, controllers, and models at
+the very least. If not, you have some documentation to read first :-)
+
+Create a controller in your application called Photos as follows:
+
+ perl script/*create.pl controller Photos
+
+Next, you'll want to set up a table called Photos in your RDBMS of
+choice. Here, I've used MySQL, but you could use SQLite , Postresql
+or any other RDBMS supported by DBIx::Class. The necessary columns
+you will need are as follows:
+
+=over 12
+
+=item photoid
+
+type: INT
+size: 11
+null: no
+other: PRIMARY KEY auto_increment
+
+=item name
+
+type: VARCHAR
+size: 255
+null: no
+other:
+
+=item uploaded
+
+type: DATETIME
+size:
+null: no
+other:
+(If you want, include the InflateColumn::DateTime component to be
+able to manipulate this column as if it were a DateTime object)
+
+=item path
+
+type: TEXT
+size:
+null: no
+other:
+
+
+=item caption
+
+type: TEXT
+size:
+null: no
+other:
+
+
+=back
+
+Now, create your model:
+
+ ./script/myapp_create.pl model DB DBIC::Schema MyApp::Schema 'DBI:mysql:database=myapp' 'user' 'password'
+
+So now you have your basic tables set up. Next, we need to generate
+our Schema files so DBIx::Class can interact with our database
+objects. I use this script to update/create my schema definition from
+the database. Copy/paste this script into a file called
+myapp_update_schema.pl (replace "myapp" with whatever you named this
+application) and stick it in the script/ directory of your
+application:
+
+ #!/usr/bin/perl
+
+
+ use FindBin;
+ use DBIx::Class::Schema::Loader qw| make_schema_at |;
+ make_schema_at(
+ "MyApp::Schema",
+ {
+ debug => 1,
+ use_namespaces => 0,
+ components => [qw/ InflateColumn::DateTime InflateColumn::FS PK::Auto/],
+ dump_directory => "$FindBin::Bin/../lib"
+ },
+ [ "dbi:mysql:myapp", "user", "password" ]
+ );
+
+
+now run perl script/*update*. If there are no errors, proceed!
+
+=head2 Adding the InflateColumn::FS magic
+
+Open up lib/Schema/Photos.pm. Since we used ::Loader, there will be a
+good portion of the file that you're not supposed to manually edit.
+This is marked by these lines:
+
+ # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-12-01 02:57:02
+ # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:A/YrsvGDAWKpDaGlJ3Dwqg
+
+You can safely modify anything below this though. Add these lines to
+the file:
+
+ use MyApp;
+ __PACKAGE__->add_columns(
+ "path",
+ {
+ data_type => 'TEXT',
+ is_fs_column => 1,
+ fs_column_path => MyApp->path_to( 'root', 'static', 'photos' ) . ""
+ }
+);
+
+This tells DBIx::Class that the column "path" is now a
+Path::Class::File object and we can call Path::Class::File methods on
+it upon retrieval.
+
+Great! Now let's edit our controller.
+
+=head1 The Photos Controller
+
+Edit lib/Controller/Photos.pm to match this file:
+
+ package MyApp::Controller::Photos;
+
+ use strict;
+ use warnings;
+ use parent 'Catalyst::Controller::HTML::FormFu';
+ use DateTime;
+ use Imager;
+ use MIME::Types;
+ use File::MimeInfo ();
+ use MyApp;
+
+ __PACKAGE__->mk_accessors(qw(thumbnail_size));
+
+ =head1 NAME
+
+ MyApp::Controller::Photos - Catalyst Controller
+
+ =head1 DESCRIPTION
+
+ Catalyst Controller.
+
+ =head1 METHODS
+
+ =cut
+
+ =head2 index
+
+ display the photos
+
+ =cut
+
+ sub index : Path : Args(0) {
+ my ( $self, $c ) = @_;
+
+ my @photos = $c->model('DB::Photos')->all;
+
+ $c->stash->{photos} = \@photos;
+ $c->stash->{template} = "photos/index.tt2";
+
+ }
+
+ =head2 get_photos
+
+ set up photo stash
+
+ =cut
+
+ sub get_photos : Chained('/') PathPart('photo') CaptureArgs(1) {
+ my ( $self, $c, $photoid ) = @_;
+
+ my $photo = $c->model('DB::Photos')->find($photoid);
+
+ if ( $photo == undef ) {
+
+ $c->stash->{error_msg} = "No such photo.";
+
+ }
+ else {
+
+ $c->stash->{photo} = $photo;
+
+ }
+
+ }
+
+ =head2 add_photo
+
+ Add a photo to the database
+
+ =cut
+
+ sub add_photo : Path('/photo/add') FormConfig('photos/add.yml') {
+ my ( $self, $c ) = @_;
+
+ $c->stash->{template} = "photos/add.tt2";
+ my $form = $c->stash->{form};
+ my $mime = MIME::Types->new;
+
+ ## comment out this block if you're not using the Authorization plugin
+ unless ( $c->check_user_roles('admin') ) {
+
+ $c->flash->{error_msg} =
+ "You don't have the proper permissions to add photos here";
+ $c->res->redirect( $c->uri_for('/photos') );
+
+ }
+
+ if ( $form->submitted_and_valid ) {
+
+ my $photo = $c->model('DB::Photos')->create(
+ {
+ name => $form->param('photo_name'),
+ path => $c->req->upload('photo')->fh,
+ caption => $form->param('caption'),
+ uploaded => DateTime->now,
+ mime => $mime->mimeTypeOf( $c->req->upload('photo')->basename ),
+ }
+ );
+
+ $c->stash->{status_msg} = "Successfully uploaded!";
+ $c->stash->{photo} = $photo;
+ $c->detach;
+
+ }
+
+ }
+
+ =head2 generate_thumbnail
+
+ this method generates a thumbnail of a
+ given image
+
+ =cut
+
+ sub generate_thumbnail : Chained('get_photos') PathPart('thumbnail') Args(0) {
+ my ( $self, $c ) = @_;
+
+
+ my $photo = $c->stash->{photo};
+ my $size = $self->thumbnail_size;
+
+ my $mimeinfo = File::MimeInfo->new;
+
+ my $data = $photo->path->open('r') or die "Error: $!";
+ my $img = Imager->new;
+ $img->read( fh => $data ) or die $img->errstr;
+ my $scaled = $img->scale( xheight => $size );
+ my $out;
+ $scaled->write(
+ type => $mimeinfo->extensions( $photo->mime ),
+ data => \$out
+ )
+ or die $scaled->errstr;
+ $c->res->content_type( $photo->mime );
+ $c->res->content_length( -s $out );
+ $c->res->header( "Content-Disposition" => "inline; filename="
+ . $mimeinfo->extensions( $photo->mime ) );
+
+ binmode $out;
+ $c->res->body($out);
+
+ }
+
+ =head2 view_image
+
+ hackish method to view
+ an image full-size
+
+ =cut
+
+ sub view_image : Chained('get_photos') PathPart('generate') Args(0) {
+ my ( $self, $c ) = @_;
+
+ my $photo = $c->stash->{photo};
+
+ my $mimeinfo = File::MimeInfo->new;
+
+ my $data = $photo->path->open('r') or die "Error: $!";
+ my $img = Imager->new;
+ $img->read( fh => $data ) or die $img->errstr;
+
+ my $out;
+ $img->write(
+ type => $mimeinfo->extensions( $photo->mime ),
+ data => \$out
+ )
+ or die $img->errstr;
+ $c->res->content_type( $photo->mime );
+ $c->res->content_length( -s $out );
+ $c->res->header( "Content-Disposition" => "inline; filename="
+ . $mimeinfo->extensions( $photo->mime ) );
+
+ binmode $out;
+ $c->res->body($out);
+
+ }
+
+ =head2 view_photo
+
+ view an individual photo
+
+ =cut
+
+ sub view_photo : Chained("get_photos") PathPart('view') Args(0) {
+ my ( $self, $c ) = @_;
+
+ my $photo = $c->stash->{photo};
+
+ $c->stash->{template} = "photos/view.tt2";
+
+ }
+
+ =head2 delete_photo
+
+ delete a photo or photos
+
+ =cut
+
+ sub delete_photo : Chained("get_photos") PathPart('delete') Args(0) {
+ my ( $self, $c ) = @_;
+
+ my $photo = $c->stash->{photo};
+ $c->stash->{template} = 'photos/delete.tt2';
+
+ if ( $c->check_user_roles("admin") ) {
+
+ if ( $c->req->param('delete') eq 'yes' ) {
+
+ $photo->delete;
+ $c->stash->{status_msg} = "Photo " . $photo->photoid . " deleted!";
+ $c->detach;
+
+ }
+
+ }
+ else {
+
+ $c->flash->{error_msg} =
+ "You don't have proper permissions to delete images.";
+ $c->res->redirect("/");
+
+ }
+
+ }
+ 1;
+
+
+
+=head2 The view:
+
+=over 12
+
+=item add.tt2
+
+ <h2>Upload your photos</h2>
+ [% UNLESS form.submitted_and_valid %]
+ [% form %]
+
+ [% ELSE %]
+
+ <p>Success!</p>
+ <p>Here's your image: <img src="[% c.uri_for("/photo/$photo.photoid/thumbnail") %]" />
+
+ [% END %]
+
+=item delete.tt2
+
+ [% UNLESS c.req.param('delete') %]
+ <h2>Deleting [% photo.name %]</h2>
+ <div id="photo">
+ <img src="[% c.uri_for("/photo/$photo.photoid/generate") %]" alt="[% photo.name %]" />
+ </div>
+ <p>ARE YOU SURE YOU WANT TO DELETE THIS PHOTO?</p>
+ <p><a href="[% c.uri_for("/photo/$photo.photoid/delete", { delete=> 'yes' } ) %]">yes</a> I do</p>
+ <p><a href="[% c.uri_for("/photos") %]">no</a> I don't</p>
+ <div>«<a href="[% c.uri_for("/photos") %]">back</a>
+ [% ELSE %]
+ <p>Deleted!</p>
+ [% END %]
+
+=item index.tt2
+
+ [% USE table (photos, rows=3) %]
+ <h2>Puppy Photos</h2>
+
+ <div id="puppy-list">
+ <table>
+ [% FOREACH column = table.cols %]
+ <tr>
+ [% FOREACH photo = column %]
+ <td>
+ [% IF photo %]
+ <a href="[% c.uri_for("/photo/$photo.photoid/view") %]">
+ <img src="[% c.uri_for("/photo/$photo.photoid/thumbnail")%]" />
+ </a>
+ [% ELSE %]
+ <img src="[% c.uri_for("/static/photos/blank.gif")%]" width="150" height="100"/>
+ [% END %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+ <table>
+ </div>
+
+
+=item view.tt2
+
+ <h2>[% photo.name %]</h2>
+ <div id="photo">
+ <img src="[% c.uri_for("/photo/$photo.photoid/generate") %]" alt="[% photo.name %]" />
+ </div>
+ <p>[% photo.caption %]</p>
+ <div>«<a href="[% c.uri_for("/photos") %]">back</a>
+
+
+=head2 FormFu
+
+And last but not least, the required HTML::FormFu files:
+
+=over 12
+
+=item add.yml
+
+ ---
+ indicator: submit
+
+ elements:
+ - type: Text
+ name: photo_name
+ label: Name this photo
+ container_tag: div
+
+ - type: File
+ name: photo
+ label: Your photo
+ container_tag: div
+
+ - type: Textarea
+ name: caption
+ label: Photo caption
+ container_tag: div
+
+ - type: Submit
+ name: submit
+ value: Upload!
+
+ constraints:
+ SingleValue
+
+ filters:
+ HTMLScrubber
+
+Voila! There you have it. Go nuts.
+
+=head1 AUTHOR
+
+Devin Austin
+
+devin.austin at gmail.com
+
+http://www.codedright.net
+
+=head1 LICENSE
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+1;
+
+
+
+
Deleted: trunk/examples/CatalystAdvent/root/2008/pen/AdventPhotoGallery.pod
===================================================================
--- trunk/examples/CatalystAdvent/root/2008/pen/AdventPhotoGallery.pod 2008-12-05 00:55:26 UTC (rev 8723)
+++ trunk/examples/CatalystAdvent/root/2008/pen/AdventPhotoGallery.pod 2008-12-05 01:39:57 UTC (rev 8724)
@@ -1,500 +0,0 @@
-=head1 Super Simple Photo Gallery
-
-Let's create an extremely simple (but fun!) photogallery.
-First things first, we need to make sure we have everything.
-
-=head2 Our packing list:
-
-=over 12
-
-=item C<DBIx::Class::InflateColumn::FS>
-
-This will be used to store our file pointer in the database, write the image to the file system, and later, give us a
-Path::Class::File object to manipulate our images later on.
-
-=item C<Imager>
-
-The all and the everything for our image manipulation needs. If not installed already, make sure you install libjpeg so that
-JPEG files can be manipulated by Imager.
-
-
-=item C<MIME::Types>
-
-=item C<File::Mimeinfo>
-
-=item C<DateTime>
-
-=item C<Catalyst::Controller::HTML::FormFu>
-
-=back
-
-Once you have installed these two things with great success, move on to the next step.
-
-=head1 Let's get started already!
-
-Ok. So here comes the fun stuff. We're going to assume you know how to create a Catalyst application skeleton, controllers, and models
-at the very least. If not, you have some documentation to read first :-)
-
-Create a controller in your application called Photos. Something like this:
-
-
- perl script/*create.pl controller Photos
-
-Next, you'll want to set up a table called Photos in your RDBMS of choice. Here, we use MySQL because I've yet to learn Postgres.
-The necessary columns you will need are as follows:
-
-=over 12
-
-=item photoid
-
-type: INT
-size: 11
-null: no
-other: PRIMARY KEY auto_increment
-
-=item name
-
-type: VARCHAR
-size: 255
-null: no
-other:
-
-=item uploaded
-
-type: DATETIME
-size:
-null: no
-other:
-(If you so desire, include the InflateColumn::DateTime component to be able to manipulate this column as if it were
-a DateTime object)
-
-=item path
-
-type: TEXT
-size:
-null: no
-other:
-
-
-=item caption
-
-type: TEXT
-size:
-null: no
-other:
-
-
-=back
-
-Now, create your model:
-
- ./script/myapp_create.pl model DB DBIC::Schema MyApp::Schema 'DBI:mysql:database=myapp' 'narf' 'blarf'
-
-So now you have your basic tables set up. Next, we need to generate our Schema files so DBIx::Class can interact with our
-database objects. I use this script to update/create my schema definition from the database.
-Copy/paste this script into a file called myapp_update_schema.pl (replace "myapp" with whatever you named this application) and stick it
-in the script/ directory of your application:
-
- #!/usr/bin/perl
-
-
- use FindBin;
- use DBIx::Class::Schema::Loader qw| make_schema_at |;
- make_schema_at(
- "MyApp::Schema",
- {
- debug => 1,
- use_namespaces => 0,
- components => [qw/ InflateColumn::DateTime InflateColumn::FS PK::Auto/],
- dump_directory => "$FindBin::Bin/../lib"
- },
- [ "dbi:mysql:myapp", "narf", "blarf" ]
- );
-
-
-now run perl script/*update*. If there are no errors, proceed!
-
-=head2 Adding the InflateColumn::FS magic
-
-Open up lib/Schema/Photos.pm. Since we used ::Loader, there will be a good portion of the file that you're not supposed to manually
-edit. This is marked by these lines:
-
- # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-12-01 02:57:02
- # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:A/YrsvGDAWKpDaGlJ3Dwqg
-
-You can safely modify anything below this though. Add these lines to the file:
-
- use MyApp;
- __PACKAGE__->add_columns(
- "path",
- {
- data_type => 'TEXT',
- is_fs_column => 1,
- fs_column_path => MyApp->path_to( 'root', 'static', 'photos' ) . ""
- }
- );
-
-
-This tells DBIx::Class that the column "path" is now a Path::Class::File object and we can call Path::Class::File methods on it upon retrieval.
-
-Great! Now let's edit our controller.
-
-=head1 The Photos Controller
-
-Edit lib/Controller/Photos.pm to match this file:
-
- package MyApp::Controller::Photos;
-
- use strict;
- use warnings;
- use parent 'Catalyst::Controller::HTML::FormFu';
- use DateTime;
- use Imager;
- use MIME::Types;
- use File::MimeInfo ();
- use MyApp;
-
- __PACKAGE__->mk_accessors(qw(thumbnail_size));
-
- =head1 NAME
-
- MyApp::Controller::Photos - Catalyst Controller
-
- =head1 DESCRIPTION
-
- Catalyst Controller.
-
- =head1 METHODS
-
- =cut
-
- =head2 index
-
- display the photos
-
- =cut
-
- sub index : Path : Args(0) {
- my ( $self, $c ) = @_;
-
- my @photos = $c->model('DB::Photos')->all;
-
- $c->stash->{photos} = \@photos;
- $c->stash->{template} = "photos/index.tt2";
-
- }
-
- =head2 get_photos
-
- set up photo stash
-
- =cut
-
- sub get_photos : Chained('/') PathPart('photo') CaptureArgs(1) {
- my ( $self, $c, $photoid ) = @_;
-
- my $photo = $c->model('DB::Photos')->find($photoid);
-
- if ( $photo == undef ) {
-
- $c->stash->{error_msg} = "No such photo.";
-
- }
- else {
-
- $c->stash->{photo} = $photo;
-
- }
-
- }
-
- =head2 add_photo
-
- Add a photo to the database
-
- =cut
-
- sub add_photo : Path('/photo/add') FormConfig('photos/add.yml') {
- my ( $self, $c ) = @_;
-
- $c->stash->{template} = "photos/add.tt2";
- my $form = $c->stash->{form};
- my $mime = MIME::Types->new;
-
- ## comment out this block if you're not using the Authorization plugin
- unless ( $c->check_user_roles('admin') ) {
-
- $c->flash->{error_msg} =
- "You don't have the proper permissions to add photos here";
- $c->res->redirect( $c->uri_for('/photos') );
-
- }
-
- if ( $form->submitted_and_valid ) {
-
- my $photo = $c->model('DB::Photos')->create(
- {
- name => $form->param('photo_name'),
- path => $c->req->upload('photo')->fh,
- caption => $form->param('caption'),
- uploaded => DateTime->now,
- mime => $mime->mimeTypeOf( $c->req->upload('photo')->basename ),
- }
- );
-
- $c->stash->{status_msg} = "Successfully uploaded!";
- $c->stash->{photo} = $photo;
- $c->detach;
-
- }
-
- }
-
- =head2 generate_thumbnail
-
- this method generates a thumbnail of a
- given image
-
- =cut
-
- sub generate_thumbnail : Chained('get_photos') PathPart('thumbnail') Args(0) {
- my ( $self, $c ) = @_;
-
-
- my $photo = $c->stash->{photo};
- my $size = $self->thumbnail_size;
-
- my $mimeinfo = File::MimeInfo->new;
-
- my $data = $photo->path->open('r') or die "Error: $!";
- my $img = Imager->new;
- $img->read( fh => $data ) or die $img->errstr;
- my $scaled = $img->scale( xheight => $size );
- my $out;
- $scaled->write(
- type => $mimeinfo->extensions( $photo->mime ),
- data => \$out
- )
- or die $scaled->errstr;
- $c->res->content_type( $photo->mime );
- $c->res->content_length( -s $out );
- $c->res->header( "Content-Disposition" => "inline; filename="
- . $mimeinfo->extensions( $photo->mime ) );
-
- binmode $out;
- $c->res->body($out);
-
- }
-
- =head2 view_image
-
- hackish method to view
- an image full-size
-
- =cut
-
- sub view_image : Chained('get_photos') PathPart('generate') Args(0) {
- my ( $self, $c ) = @_;
-
- my $photo = $c->stash->{photo};
-
- my $mimeinfo = File::MimeInfo->new;
-
- my $data = $photo->path->open('r') or die "Error: $!";
- my $img = Imager->new;
- $img->read( fh => $data ) or die $img->errstr;
-
- my $out;
- $img->write(
- type => $mimeinfo->extensions( $photo->mime ),
- data => \$out
- )
- or die $img->errstr;
- $c->res->content_type( $photo->mime );
- $c->res->content_length( -s $out );
- $c->res->header( "Content-Disposition" => "inline; filename="
- . $mimeinfo->extensions( $photo->mime ) );
-
- binmode $out;
- $c->res->body($out);
-
- }
-
- =head2 view_photo
-
- view an individual photo
-
- =cut
-
- sub view_photo : Chained("get_photos") PathPart('view') Args(0) {
- my ( $self, $c ) = @_;
-
- my $photo = $c->stash->{photo};
-
- $c->stash->{template} = "photos/view.tt2";
-
- }
-
- =head2 delete_photo
-
- delete a photo or photos
-
- =cut
-
- sub delete_photo : Chained("get_photos") PathPart('delete') Args(0) {
- my ( $self, $c ) = @_;
-
- my $photo = $c->stash->{photo};
- $c->stash->{template} = 'photos/delete.tt2';
-
- if ( $c->check_user_roles("admin") ) {
-
- if ( $c->req->param('delete') eq 'yes' ) {
-
- $photo->delete;
- $c->stash->{status_msg} = "Photo " . $photo->photoid . " deleted!";
- $c->detach;
-
- }
-
- }
- else {
-
- $c->flash->{error_msg} =
- "You don't have proper permissions to delete images.";
- $c->res->redirect("/");
-
- }
-
- }
- 1;
-
-
-
-=head2 The view:
-
-=over 12
-
-=item add.tt2
-
- <h2>Upload your photos</h2>
- [% UNLESS form.submitted_and_valid %]
- [% form %]
-
- [% ELSE %]
-
- <p>Success!</p>
- <p>Here's your image: <img src="[% c.uri_for("/photo/$photo.photoid/thumbnail") %]" />
-
- [% END %]
-
-=item delete.tt2
-
- [% UNLESS c.req.param('delete') %]
- <h2>Deleting [% photo.name %]</h2>
- <div id="photo">
- <img src="[% c.uri_for("/photo/$photo.photoid/generate") %]" alt="[% photo.name %]" />
- </div>
- <p>ARE YOU SURE YOU WANT TO DELETE THIS PHOTO?</p>
- <p><a href="[% c.uri_for("/photo/$photo.photoid/delete", { delete=> 'yes' } ) %]">yes</a> I do</p>
- <p><a href="[% c.uri_for("/photos") %]">no</a> I don't</p>
- <div>«<a href="[% c.uri_for("/photos") %]">back</a>
- [% ELSE %]
- <p>Deleted!</p>
- [% END %]
-
-=item index.tt2
-
- [% USE table (photos, rows=3) %]
- <h2>Puppy Photos</h2>
-
- <div id="puppy-list">
- <table>
- [% FOREACH column = table.cols %]
- <tr>
- [% FOREACH photo = column %]
- <td>
- [% IF photo %]
- <a href="[% c.uri_for("/photo/$photo.photoid/view") %]">
- <img src="[% c.uri_for("/photo/$photo.photoid/thumbnail")%]" />
- </a>
- [% ELSE %]
- <img src="[% c.uri_for("/static/photos/blank.gif")%]" width="150" height="100"/>
- [% END %]
- </td>
- [% END %]
- </tr>
- [% END %]
- <table>
- </div>
-
-
-=item view.tt2
-
- <h2>[% photo.name %]</h2>
- <div id="photo">
- <img src="[% c.uri_for("/photo/$photo.photoid/generate") %]" alt="[% photo.name %]" />
- </div>
- <p>[% photo.caption %]</p>
- <div>«<a href="[% c.uri_for("/photos") %]">back</a>
-
-
-=head2 FormFu
-
-And last but not least, the required HTML::FormFu files:
-
-=over 12
-
-=item add.yml
-
- ---
- indicator: submit
-
- elements:
- - type: Text
- name: photo_name
- label: Name this photo
- container_tag: div
-
- - type: File
- name: photo
- label: Your photo
- container_tag: div
-
- - type: Textarea
- name: caption
- label: Photo caption
- container_tag: div
-
- - type: Submit
- name: submit
- value: Upload!
-
- constraints:
- SingleValue
-
- filters:
- HTMLScrubber
-
-Voila! There you have it. Go nuts.
-
-=head1 AUTHOR
-
-Devin Austin
-
-devin.austin at gmail.com
-
-http://www.codedright.net
-
-=head1 LICENSE
-
-This library is free software, you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
-
-1;
-
-
-
-
More information about the Catalyst-commits
mailing list