The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id: /local/CPAN/Mango/lib/Mango/Catalyst/Controller/Cart.pm 1644 2008-06-02T01:46:53.055259Z claco  $
package Mango::Catalyst::Controller::Cart;
use strict;
use warnings;

BEGIN {
    use base qw/Mango::Catalyst::Controller/;
    use Handel::Constants qw/:cart/;
    use Mango            ();
    use Path::Class::Dir ();

    __PACKAGE__->config(
        resource_name => 'mango/cart',
        form_directory =>
          Path::Class::Dir->new( Mango->share, 'forms', 'cart' )
    );
}

sub instance : Chained('/') PathPrefix CaptureArgs(0) {
    my ( $self, $c ) = @_;

    $c->stash->{'cart'} = $c->user->cart;

    return;
}

sub view : Chained('instance') PathPart('') Args(0) Template('cart/view') {
    my ( $self, $c ) = @_;

    return;
}

sub add : Chained('instance') Args(0) Template('cart/view') {
    my ( $self, $c ) = @_;
    my $form = $self->form;
    my $cart = $c->stash->{'cart'};
    my $product;

    $form->exists(
        'sku',
        sub {
            $product =
              $c->model('Products')->get_by_sku( $form->field('sku') );

            return $product ? 1 : 0;
        }
    );

    if ( $self->submitted && $self->validate->success ) {
        $cart->add(
            {
                sku         => $product->sku,
                description => $product->description,
                price       => $product->price,
                quantity    => $form->field('quantity')
            }
        );

        $c->res->redirect( $c->uri_for( $self->action_for('view') ) . '/' );
    }

    return;
}

sub clear : Chained('instance') Args(0) Template('cart/view') {
    my ( $self, $c ) = @_;
    my $form = $self->form;
    my $cart = $c->stash->{'cart'};

    if ( $self->submitted && $self->validate->success ) {
        $cart->clear;
    }

    $c->res->redirect( $c->uri_for( $self->action_for('view') ) . '/' );

    return;
}

sub save : Chained('instance') Args(0) Template('cart/view') {
    my ( $self, $c ) = @_;
    my $form = $self->form;
    my $cart = $c->stash->{'cart'};

    if ( !$c->user_exists ) {
        $c->stash->{'errors'} = [ $c->localize('LOGIN_REQUIRED') ];
        $c->detach;
    }

    if ( $self->submitted && $self->validate->success ) {
        my $wishlist = $c->model('Wishlists')->create(
            {
                user => $c->user->get_object,
                name => $form->field('name')
            }
        );

        foreach my $item ( $cart->items ) {
            $wishlist->add($item);
        }

        $cart->clear;

        $c->response->redirect(
            $c->uri_for_resource( 'mango/wishlists', 'list' ) . '/' );
    }

    return;
}

1;
__END__

=head1 NAME

Mango::Catalyst::Controller::Cart - Catalyst controller for cart information

=head1 SYNOPSIS

    package MyApp::Controller::Cart;
    use base 'Mango::Catalyst::Controller::Cart';

=head1 DESCRIPTION

Mango::Catalyst::Controller::Cart provides the web interface for shopping
cart information.

=head1 ACTIONS

=head2 add : /cart/add/

Adds and item to the cart.

=head2 clear : /cart/clear/

Removes all items from the cart.

=head2 view : /cart/

Displays the contents of the cart.

=head2 instance : /cart/

Loads the current users cart.

=head2 restore : /cart/restore/

Restores a wishlist into the cart.

=head1 SEE ALSO

L<Mango::Catalyst::Model::Carts>, L<Mango::Provider::Carts>

=head1 AUTHOR

    Christopher H. Laco
    CPAN ID: CLACO
    claco@chrislaco.com
    http://today.icantfocus.com/blog/