added item and sku caching to cart

ribbon discounts now work
checklist form control works more like you'd expect
added badge groups
This commit is contained in:
JT Smith 2008-04-02 22:46:40 +00:00
parent 6edce95ba4
commit 50a4b564e5
10 changed files with 401 additions and 40 deletions

View file

@ -37,6 +37,7 @@ These subroutines are available from this package:
readonly session => my %session;
private properties => my %properties;
private error => my %error;
private itemCache => my %itemCache;
#-------------------------------------------------------------------
@ -114,6 +115,7 @@ sub delete {
$self->empty;
$self->session->db->write("delete from cart where cartId=?",[$self->getId]);
undef $self;
%itemCache{ref $self} = {};
return undef;
}
@ -129,7 +131,8 @@ sub empty {
my ($self) = @_;
foreach my $item (@{$self->getItems}) {
$item->remove;
}
}
%itemCache{ref $self} = {};
}
#-------------------------------------------------------------------
@ -238,7 +241,13 @@ sub getItem {
unless (defined $itemId && $itemId =~ m/^[A-Za-z0-9_-]{22}$/) {
WebGUI::Error::InvalidParam->throw(error=>"Need an itemId.");
}
return WebGUI::Shop::CartItem->new($self, $itemId);
my $id = ref $self;
if (exists $itemCache{$id}{$itemId}) {
return $itemCache{$id}{$itemId};
}
my $item = WebGUI::Shop::CartItem->new($self, $itemId);
$itemCache{$id}{$itemId} = $item;
return $item;
}
#-------------------------------------------------------------------
@ -261,6 +270,28 @@ sub getItems {
#-------------------------------------------------------------------
=head2 getItemsByAssetId ( assetIds )
Returns an array reference of WebGUI::Asset::Sku objects that have a specific asset id that are in the cart.
=head3 assetIds
An array reference of assetIds to look for.
=cut
sub getItemsByAssetId {
my ($self, $assetIds) = @_;
my @itemsObjects = ();
my $items = $self->session->db->read("select itemId from cartItem where cartId=? and assetId in (".$self->session->db->quoteAndJoin($assetIds).")",[$self->getId]);
while (my ($itemId) = $items->array) {
push(@itemsObjects, $self->getItem($itemId));
}
return \@itemsObjects;
}
#-------------------------------------------------------------------
=head2 getShipper ()
Returns the WebGUI::Shop::ShipDriver object that is attached to this cart for shipping.
@ -461,6 +492,7 @@ Remove an item from the cart and then display the cart again.
sub www_removeItem {
my $self = shift;
my $item = $self->getItem($self->session->form->get("itemId"))->remove;
delete $itemCache{ref $self}{$item->getId};
return $self->www_view;
}

View file

@ -28,7 +28,7 @@ These subroutines are available from this package:
readonly cart => my %cart;
private properties => my %properties;
private skuCache => my %skuCache;
#-------------------------------------------------------------------
@ -174,7 +174,15 @@ Returns an instanciated WebGUI::Asset::Sku object for this cart item.
sub getSku {
my ($self) = @_;
my $asset = WebGUI::Asset->newByDynamicClass($self->cart->session, $self->get("assetId"));
my $id = ref $self;
my $asset = '';
if (exists $skuCache{$id}{$self->get("assetId")}) {
$asset = $skuCache{$id}{$self->get("assetId")};
}
else {
$asset = WebGUI::Asset->newByDynamicClass($self->cart->session, $self->get("assetId"));
$skuCache{$id}{$self->get("assetId")} = $asset;
}
$asset->applyOptions($self->get("options"));
return $asset;
}