diff --git a/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg b/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg
index 7e718f3ad..b27709a9e 100644
Binary files a/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg and b/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg differ
diff --git a/docs/upgrades/upgrade_7.5.2-7.5.3.pl b/docs/upgrades/upgrade_7.5.2-7.5.3.pl
index 93cd046a5..ce391c423 100644
--- a/docs/upgrades/upgrade_7.5.2-7.5.3.pl
+++ b/docs/upgrades/upgrade_7.5.2-7.5.3.pl
@@ -65,6 +65,8 @@ sub addAddressBook {
phoneNumber varchar(35),
index addressBookId_addressId (addressBookId,addressId)
)");
+ $session->setting->add('shopAddressBookTemplateId','3womoo7Teyy2YKFa25-MZg');
+ $session->setting->add('shopAddressTemplateId','XNd7a_g_cTvJVYrVHcx2Mw');
}
#-------------------------------------------------
@@ -106,8 +108,8 @@ sub createSkuAsset {
description mediumtext,
sku varchar(35) binary not null,
salesAgentId varchar(22) binary,
- displayTitle int not null default 1,
- overrideTaxRate int not null default 0,
+ displayTitle bool not null default 1,
+ overrideTaxRate bool not null default 0,
taxRateOverride float not null default 0.00,
primary key (assetId, revisionDate),
unique key sku (sku),
@@ -137,7 +139,7 @@ sub migrateToNewCart {
index cartId_assetId (cartId,assetId)
)");
$session->db->write("drop table shoppingCart");
- $session->db->write("insert into settings values ('shopCartTemplateId','aIpCmr9Hi__vgdZnDTz1jw')");
+ $session->setting->add('shopCartTemplateId','aIpCmr9Hi__vgdZnDTz1jw');
}
#-------------------------------------------------
diff --git a/lib/WebGUI/Form/YesNo.pm b/lib/WebGUI/Form/YesNo.pm
index 989278790..577613bb4 100644
--- a/lib/WebGUI/Form/YesNo.pm
+++ b/lib/WebGUI/Form/YesNo.pm
@@ -73,7 +73,7 @@ sub definition {
defaultValue=>1
},
dbDataType => {
- defaultValue => "INT(1)",
+ defaultValue => "bool",
},
});
return $class->SUPER::definition($session, $definition);
diff --git a/lib/WebGUI/Shop/Address.pm b/lib/WebGUI/Shop/Address.pm
index 25ef86387..f434fcc32 100644
--- a/lib/WebGUI/Shop/Address.pm
+++ b/lib/WebGUI/Shop/Address.pm
@@ -114,7 +114,7 @@ sub getHtmlFormatted {
my $address = $self->get("name") . "
" . $self->get("address1") . "
";
$address .= $self->get("address2") . "
" if ($self->get("address2") ne "");
$address .= $self->get("address3") . "
" if ($self->get("address3") ne "");
- $address .= $self->get("city") . ",";
+ $address .= $self->get("city") . ", ";
$address .= $self->get("state") . " " if ($self->get("state") ne "");
$address .= $self->get("code") if ($self->get("code") ne "");
$address .= '
' . $self->get("country");
diff --git a/lib/WebGUI/Shop/AddressBook.pm b/lib/WebGUI/Shop/AddressBook.pm
index 2f9a27af2..61006464e 100644
--- a/lib/WebGUI/Shop/AddressBook.pm
+++ b/lib/WebGUI/Shop/AddressBook.pm
@@ -5,6 +5,7 @@ use strict;
use Class::InsideOut qw{ :std };
use WebGUI::Asset::Template;
use WebGUI::Exception::Shop;
+use WebGUI::Form;
use WebGUI::International;
use WebGUI::Shop::Address;
@@ -290,6 +291,177 @@ sub update {
$self->session->db->setRow("addressBook","addressBookId",$properties{$id});
}
+#-------------------------------------------------------------------
+
+=head2 www_deleteAddress ( )
+
+Deletes an address from the book.
+
+=cut
+
+sub www_deleteAddress {
+ my $self = shift;
+ $self->getAddress($self->session->form->get("addressId"))->delete;
+ return $self->www_view;
+}
+
+#-------------------------------------------------------------------
+
+=head2 www_editAddress ()
+
+Allows a user to edit an address in their address book.
+
+=cut
+
+sub www_editAddress {
+ my ($self, $error) = @_;
+ my $session = $self->session;
+ my $form = $session->form;
+ my $address = eval{$self->getAddress($form->get("addressId"))};
+ if (WebGUI::Error->caught) {
+ $address = undef;
+ }
+ my %base = ();
+ if (defined $address) {
+ %base = %{$address->get};
+ }
+ my %var = (
+ %base,
+ error => $error,
+ formHeader => WebGUI::Form::formHeader($session)
+ .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"})
+ .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddressSave"})
+ .WebGUI::Form::hidden($session, {name=>"addressId", value=>$form->get("addressId")})
+ .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}),
+ saveButton => WebGUI::Form::submit($session),
+ formFooter => WebGUI::Form::formFooter($session),
+ address1Field => WebGUI::Form::text($session, {name=>"address1", maxlength=>35, defaultValue=>($form->get("address1") || ((defined $address) ? $address->get('address1') : undef))}),
+ address2Field => WebGUI::Form::text($session, {name=>"address2", maxlength=>35, defaultValue=>($form->get("address2") || ((defined $address) ? $address->get('address2') : undef))}),
+ address3Field => WebGUI::Form::text($session, {name=>"address3", maxlength=>35, defaultValue=>($form->get("address3") || ((defined $address) ? $address->get('address3') : undef))}),
+ labelField => WebGUI::Form::text($session, {name=>"label", maxlength=>35, defaultValue=>($form->get("label") || ((defined $address) ? $address->get('label') : undef))}),
+ nameField => WebGUI::Form::text($session, {name=>"name", maxlength=>35, defaultValue=>($form->get("name") || ((defined $address) ? $address->get('name') : undef))}),
+ cityField => WebGUI::Form::text($session, {name=>"city", maxlength=>35, defaultValue=>($form->get("city") || ((defined $address) ? $address->get('city') : undef))}),
+ stateField => WebGUI::Form::text($session, {name=>"state", maxlength=>35, defaultValue=>($form->get("state") || ((defined $address) ? $address->get('state') : undef))}),
+ countryField => WebGUI::Form::country($session, {name=>"country", defaultValue=>($form->get("country") || ((defined $address) ? $address->get('country') : undef))}),
+ codeField => WebGUI::Form::zipcode($session, {name=>"code", defaultValue=>($form->get("code") || ((defined $address) ? $address->get('code') : undef))}),
+ phoneNumberField => WebGUI::Form::phone($session, {name=>"phoneNumber", defaultValue=>($form->get("phoneNumber") || ((defined $address) ? $address->get('phoneNumber') : undef))}),
+ );
+ my $template = WebGUI::Asset::Template->new($session, $session->setting->get("shopAddressTemplateId"));
+ $template->prepare;
+ return $session->style->userStyle($template->process(\%var));
+}
+
+
+
+#-------------------------------------------------------------------
+
+=head2 www_editAddressSave ()
+
+Saves the address. If there is a problem generates www_editAddress() with an error message. Otherwise returns www_view().
+
+=cut
+
+sub www_editAddressSave {
+ my $self = shift;
+ my $form = $self->session->form;
+ my $i18n = WebGUI::International->new($self->session,"Shop");
+ if ($form->get("label") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('label')));
+ }
+ if ($form->get("name") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('name')));
+ }
+ if ($form->get("address1") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('address')));
+ }
+ if ($form->get("city") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('city')));
+ }
+ if ($form->get("code") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('code')));
+ }
+ if ($form->get("country") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('country')));
+ }
+ if ($form->get("phoneNumber") eq "") {
+ return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('phone number')));
+ }
+ my %addressData = (
+ label => $form->get("label"),
+ name => $form->get("name"),
+ address1 => $form->get("address1"),
+ address2 => $form->get("address2"),
+ address3 => $form->get("address3"),
+ city => $form->get("city"),
+ state => $form->get("state"),
+ code => $form->get("code","zipcode"),
+ country => $form->get("country","country"),
+ phoneNumber => $form->get("phoneNumber","phone"),
+ );
+ if ($form->get('addressId') eq '') {
+ $self->addAddress(\%addressData);
+ }
+ else {
+ $self->getAddress($form->get('addressId'))->update(\%addressData);
+ }
+ return $self->www_view;
+}
+
+
+#-------------------------------------------------------------------
+
+=head2 www_view
+
+Displays the current user's address book.
+
+=cut
+
+sub www_view {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $session->form;
+ my $i18n = WebGUI::International->new($session, "Shop");
+ my @addresses = ();
+ foreach my $address (@{$self->getAddresses}) {
+ push(@addresses, {
+ %{$address->get},
+ address => $address->getHtmlFormatted,
+ deleteButton => WebGUI::Form::formHeader($session)
+ .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"})
+ .WebGUI::Form::hidden($session, {name=>"method", value=>"deleteAddress"})
+ .WebGUI::Form::hidden($session, {name=>"addressId", value=>$address->getId})
+ .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")})
+ .WebGUI::Form::submit($session, {value=>$i18n->get("delete")})
+ .WebGUI::Form::formFooter($session),
+ editButton => WebGUI::Form::formHeader($session)
+ .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"})
+ .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddress"})
+ .WebGUI::Form::hidden($session, {name=>"addressId", value=>$address->getId})
+ .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")})
+ .WebGUI::Form::submit($session, {value=>$i18n->get("edit")})
+ .WebGUI::Form::formFooter($session),
+ useButton => WebGUI::Form::formHeader($session)
+ .WebGUI::Form::hidden($session, {name=>"shop", value=>"cart"})
+ .WebGUI::Form::hidden($session, {name=>"method", value=>"setShippingAddress"})
+ .WebGUI::Form::hidden($session, {name=>"shippingAddressId", value=>$address->getId})
+ .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")})
+ .WebGUI::Form::submit($session, {value=>$i18n->get("use this address")})
+ .WebGUI::Form::formFooter($session),
+ });
+ }
+ my %var = (
+ addresses => \@addresses,
+ addButton => WebGUI::Form::formHeader($session)
+ .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"})
+ .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddress"})
+ .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")})
+ .WebGUI::Form::submit($session, {value=>$i18n->get("add a new address")})
+ .WebGUI::Form::formFooter($session),
+ );
+ my $template = WebGUI::Asset::Template->new($session, $session->setting->get("shopAddressBookTemplateId"));
+ $template->prepare;
+ return $session->style->userStyle($template->process(\%var));
+}
1;
diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm
index ecaf5600e..9d7a67a6e 100644
--- a/lib/WebGUI/Shop/Cart.pm
+++ b/lib/WebGUI/Shop/Cart.pm
@@ -5,6 +5,7 @@ use strict;
use Class::InsideOut qw{ :std };
use WebGUI::Asset::Template;
use WebGUI::Exception::Shop;
+use WebGUI::Form;
use WebGUI::International;
use WebGUI::Shop::AddressBook;
use WebGUI::Shop::CartItem;
@@ -195,6 +196,23 @@ sub getId {
#-------------------------------------------------------------------
+=head2 getItem ( itemId )
+
+Returns a reference to a WebGUI::Cart::Item object.
+
+=head3 itemId
+
+The id of the item to retrieve.
+
+=cut
+
+sub getItem {
+ my ($self, $itemId) = @_;
+ return WebGUI::Shop::CartItem->new($self, $itemId);
+}
+
+#-------------------------------------------------------------------
+
=head2 getItems ( )
Returns an array reference of WebGUI::Asset::Sku objects that are in the cart.
@@ -206,7 +224,7 @@ sub getItems {
my @itemsObjects = ();
my $items = $self->session->db->read("select itemId from cartItems where cartId=?",[$self->getId]);
while (my ($itemId) = $items->array) {
- push(@itemsObjects, WebGUI::Shop::CartItem->new($self, $itemId));
+ push(@itemsObjects, $self->getItem($itemId));
}
return \@itemsObjects;
}
@@ -310,11 +328,31 @@ Remove an item from the cart and then display the cart again.
sub www_removeItem {
my $self = shift;
- my $item = WebGUI::Shop::CartItem->new($self, $self->session->form->get("itemId"));
- $item->remove;
+ my $item = $self->getItem($self->session->form->get("itemId"))->remove;
return $self->www_view;
}
+#-------------------------------------------------------------------
+
+=head2 www_setShippingAddress ()
+
+Sets the shipping address for the cart or for a cart item if itemId is one of the form params.
+
+=cut
+
+sub www_setShippingAddress {
+ my $self = shift;
+ my $form = $self->session->form;
+ if ($form->get("itemId") ne "") {
+ $self->getItem($form->get("itemId"))->update({shippingAddressId=>$form->get('shippingAddressId')});
+ }
+ else {
+ $self->update({shippingAddressId=>$form->get('shippingAddressId')});
+ }
+ return $self->www_view;
+}
+
+
#-------------------------------------------------------------------
=head2 www_update ( )
@@ -421,7 +459,7 @@ Displays the configured item.
sub www_viewItem {
my $self = shift;
my $itemId = $self->session->form->get("itemId");
- my $item = eval { WebGUI::Shop::CartItem->new($self, $itemId) };
+ my $item = eval { $self->getItem($itemId) };
if (WebGUI::Error->caught()) {
return $self->www_view;
}
diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm
index e70dcc0a8..7ee64a7af 100644
--- a/lib/WebGUI/i18n/English/Shop.pm
+++ b/lib/WebGUI/i18n/English/Shop.pm
@@ -3,6 +3,90 @@ package WebGUI::i18n::English::Shop;
use strict;
our $I18N = {
+ 'is a required field' => {
+ message => q|%s is a required field.|,
+ lastUpdated => 0,
+ context => q|an error message|
+ },
+
+ 'label' => {
+ message => q|Label|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'label help' => {
+ message => q|eg: 'Home' or 'Work'|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'name' => {
+ message => q|Name|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'address' => {
+ message => q|Address|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'city' => {
+ message => q|City|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'state' => {
+ message => q|State / Province|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'code' => {
+ message => q|Postal / Zip Code|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'country' => {
+ message => q|Country|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'phone number' => {
+ message => q|Phone Number|,
+ lastUpdated => 0,
+ context => q|a label in the address editor|
+ },
+
+ 'add a new address' => {
+ message => q|Add A New Address|,
+ lastUpdated => 0,
+ context => q|a button in the address book|
+ },
+
+ 'delete' => {
+ message => q|Delete|,
+ lastUpdated => 0,
+ context => q|a button in the address book|
+ },
+
+ 'edit' => {
+ message => q|Edit|,
+ lastUpdated => 0,
+ context => q|a button in the address book|
+ },
+
+ 'use this address' => {
+ message => q|Use This Address|,
+ lastUpdated => 0,
+ context => q|a button in the address book|
+ },
+
'too many of this item' => {
message => q|Can't add that many %s to your cart.|,
lastUpdated => 0,