# $Id: /local/CPAN/Mango/lib/Mango/Catalyst/Controller/Admin/Products.pm 1644 2008-06-02T01:46:53.055259Z claco $ package Mango::Catalyst::Controller::Admin::Products; use strict; use warnings; BEGIN { use base qw/Mango::Catalyst::Controller/; use Set::Scalar (); use Mango (); use Path::Class (); __PACKAGE__->config( resource_name => 'mango/admin/products', form_directory => Path::Class::Dir->new( Mango->share, 'forms', 'admin', 'products' ) ); } sub index : Template('admin/products/index') { my ( $self, $c ) = @_; my $page = $c->request->param('page') || 1; my $products = $c->model('Products')->search( undef, { page => $page, rows => 10 } ); $c->stash->{'products'} = $products; $c->stash->{'pager'} = $products->pager; $c->stash->{'delete_form'} = $self->form('delete'); return; } sub load : Chained('/') PathPrefix CaptureArgs(1) { my ( $self, $c, $id ) = @_; my $product = $c->model('Products')->get_by_id($id); if ($product) { $c->stash->{'product'} = $product; } else { $c->response->status(404); $c->detach; } return; } sub create : Local Template('admin/products/create') { my ( $self, $c ) = @_; my $form = $self->form; $form->unique( 'sku', sub { return !$c->model('Products') ->search( { sku => $form->field('sku') } )->count; } ); if ( $self->submitted && $self->validate->success ) { my $product = $c->model('Products')->create( { sku => $form->field('sku'), name => $form->field('name'), description => $form->field('description'), price => $form->field('price') } ); if ( my $tags = $form->field('tags') ) { $product->add_tags( split /,\s*/, $tags ); } $c->response->redirect( $c->uri_for( $self->action_for('edit'), [ $product->id ] ) . '/' ); } return; } sub edit : Chained('load') PathPart Args(0) Template('admin/products/edit') { my ( $self, $c ) = @_; my $product = $c->stash->{'product'}; my @tags = $product->tags; my $form = $self->form; $form->unique( 'sku', sub { if ( $product->sku eq $form->field('sku') ) { return 1; } my $existing = $c->model('Products')->search( { sku => $form->field('sku') } ) ->first; if ( $existing && $existing->id != $product->id ) { return; } else { return 1; } } ); $form->values( { id => $product->id, sku => $product->sku, name => $product->name, description => $product->description, price => $product->price->value, tags => join( ', ', map { $_->name } @tags ), created => $product->created . '', updated => $product->updated . '' } ); if ( $self->submitted && $self->validate->success ) { $product->name( $form->field('name') ); $product->sku( $form->field('sku') ); $product->description( $form->field('description') ); $product->price( $form->field('price') ); $product->update; $form->values( { updated => $product->updated . '' } ); if ( my $tags = $form->field('tags') ) { my $current_tags = Set::Scalar->new( map { $_->name } @tags ); my $selected_tags = Set::Scalar->new( split /,\s*/, $tags ); my $deleted_tags = $current_tags - $selected_tags; my $added_tags = $selected_tags - $current_tags; if ( $added_tags->size ) { $product->add_tags( $added_tags->members ); } if ( $deleted_tags->size ) { $product->delete_tags( { name => [ $deleted_tags->members ] } ); } } } return; } sub delete : Chained('load') PathPart Args(0) Template('admin/products/delete') { my ( $self, $c ) = @_; my $form = $self->form; my $product = $c->stash->{'product'}; if ( $self->submitted && $self->validate->success ) { if ( $form->field('id') == $product->id ) { $product->destroy; $c->response->redirect( $c->uri_for( $self->action_for('index') ) . '/' ); } else { $c->stash->{'errors'} = ['ID_MISTMATCH']; } } return; } 1; __END__ =head1 NAME Mango::Catalyst::Controller::Admin::Products - Catalyst controller for product admin =head1 SYNOPSIS package MyApp::Controllers::Admin::Products; use base qw/Mango::Catalyst::Controllers::Admin::Products/; =head1 DESCRIPTION Mango::Catalyst::Controller::Admin::Products is the controller used to edit products. =head1 ACTIONS =head2 index : /admin/products/ Displays the list of products. =head2 create : /admin/products/create/ Creates a new product. =head2 delete : /admin/products//delete/ Deletes the specified product. =head2 edit : /admin/products//edit/ Updates the specified product. =head2 load : /admin/products// Loads a specific product. =head1 SEE ALSO L, L =head1 AUTHOR Christopher H. Laco CPAN ID: CLACO claco@chrislaco.com http://today.icantfocus.com/blog/