From 0b437f85c36d9cf5825ff98bfbc2c4ddda197b9c Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Mon, 26 Apr 2010 10:56:38 -0700 Subject: [PATCH] Make all address form variables sticky. Build address choosers for shipping and billing. Begin form processing for address forms. --- .../default-shopping-cart-template.wgpkg | Bin 3861 -> 3984 bytes lib/WebGUI/Shop/AddressBook.pm | 14 +++-- lib/WebGUI/Shop/Cart.pm | 54 +++++++++++++++++- lib/WebGUI/i18n/English/Shop.pm | 6 ++ 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/docs/upgrades/packages-7.9.4/default-shopping-cart-template.wgpkg b/docs/upgrades/packages-7.9.4/default-shopping-cart-template.wgpkg index 045ead438c0fca913977d5f8aee697940b21b021..ea1c4339e3fda178cc336ae9638205cea59a9b11 100644 GIT binary patch literal 3984 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 + my $form = $session->form; $properties ||= {}; $prefix ||= ''; $var ||= {}; @@ -84,28 +85,28 @@ sub appendAddressFormVars { $var->{ $prefix . $_ . 'Field' } = WebGUI::Form::text( $session, { name => $prefix . $_, maxlength => 35, - defaultValue => $properties->{ $_ } + defaultValue => $properties->{ $_ } || $form->get($prefix . $_), } ); } $var->{ $prefix . 'countryField' } = WebGUI::Form::country( $session,{ name => $prefix . 'country', - defaultValue => $properties->{ country } + defaultValue => $properties->{ country } || $form->get($prefix . 'country' ), } ); $var->{ $prefix . 'codeField' } = WebGUI::Form::zipcode( $session, { name => $prefix . 'code', - defaultValue => $properties->{ code } + defaultValue => $properties->{ code } || $form->get($prefix . 'code' ), } ); $var->{ $prefix . 'phoneNumberField' } = WebGUI::Form::phone( $session, { name => $prefix . 'phoneNumber', - defaultValue => $properties->{ phoneNumber } + defaultValue => $properties->{ phoneNumber } || $form->get($prefix . 'phoneNumber' ), } ); $var->{ $prefix . 'emailField' } = WebGUI::Form::email( $session, { name => $prefix . 'email', - defaultValue => $properties->{ email } + defaultValue => $properties->{ email } || $form->get($prefix . 'email' ), } ); } @@ -400,13 +401,14 @@ sub processAddressForm { organization => $form->get($prefix . "organization"), ); my $i18n = WebGUI::International->new($self->session, "Shop"); - foreach my $field (qw/label firstName lastName address1 city code country phoneNumber/) { + FIELD: foreach my $field (qw/label firstName lastName address1 city code country phoneNumber/) { my $label = $field eq 'address1' ? 'address' : $field eq 'phoneNumber' ? 'phone number' : $field ; if ($addressData{$field} eq "") { $addressData{error} = sprintf($i18n->get('is a required field'), $i18n->get($label)); + last FIELD; } } return %addressData; diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm index 6e6421b89..cebf6b231 100644 --- a/lib/WebGUI/Shop/Cart.pm +++ b/lib/WebGUI/Shop/Cart.pm @@ -270,6 +270,25 @@ sub getAddressBook { #------------------------------------------------------------------- +=head2 getBillingAddress () + +Returns the WebGUI::Shop::Address object that is attached to this cart for billing. + +=cut + +sub getBillingAddress { + my $self = shift; + my $book = $self->getAddressBook; + if (my $addressId = $self->get("billingAddressId")) { + return $book->getAddress($addressId); + } + my $address = $book->getDefaultAddress; + $self->update({billingAddressId=>$address->getId}); + return $address; +} + +#------------------------------------------------------------------- + =head2 getId () Returns the unique id for this cart. @@ -622,7 +641,18 @@ sub updateFromForm { my $i18n = WebGUI::International->new($self->session, "Shop"); $error{id $self} = $i18n->get('mixed items warning'); } - my $book = $self->getAddressBook; + my $book = $self->getAddressBook; + + my %billingData = $book->processAddressForm('billing_'); + my $billingAddressId = $form->process('billingAddressId'); + if ($billingAddressId eq 'new_address' && ! exists $billingData{'error'}) { + my $billingAddress = $book->addAddress(\%billingData); + $self->update({billingAddressId => $billingAddress->get('addressId'), }); + } + elsif ($billingAddressId ne 'new_address') { + $self->update({billinbAddressId => $billingAddressId}); + } + #$book->processAddressForm() my $cartProperties = {}; $cartProperties->{ shipperId } = $form->process( 'shipperId' ) if $form->process( 'shipperId' ); @@ -925,8 +955,26 @@ sub www_view { else { ##Address form variables my $addressBook = $self->getAddressBook; - $addressBook->appendAddressFormVars(\%var, 'shipping_', {}); - $addressBook->appendAddressFormVars(\%var, 'billing_', {}); + my $addresses = $addressBook->getAddresses; + tie my %addressOptions, 'Tie::IxHash'; + $addressOptions{'new_address'} = $i18n->get('Add new address'); + foreach my $address (@{ $addresses }) { + $addressOptions{$address->get('addressId')} = $address->get('label'); + } + $var{'shippingAddressChooser'} = WebGUI::Form::selectBox($session, { + name => 'shipping_addressId', + options => \%addressOptions, + value => $self->get('shippingAddressId') ? $self->get('shippingAddressId') : 'new_address', + }); + $var{'billingAddressChooser'} = WebGUI::Form::selectBox($session, { + name => 'billing_addressId', + options => \%addressOptions, + value => $self->get('billingAddressId') ? $self->get('billingAddressId') : 'new_address', + }); + my $shippingAddressData = $self->get('shippingAddressId') ? $self->getShippingAddress->get() : {}; + my $billingAddressData = $self->get('billingAddressId') ? $self->getBillingAddress->get() : {}; + $addressBook->appendAddressFormVars(\%var, 'shipping_', $shippingAddressData); + $addressBook->appendAddressFormVars(\%var, 'billing_', $billingAddressData); $var{sameShippingAsBilling} = WebGUI::Form::yesNo($session, {name => 'sameShippingAsBilling', value => $form->get('sameShippingAsBilling','yesNo')}); } diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm index 1b790a9ca..bec2072fe 100644 --- a/lib/WebGUI/i18n/English/Shop.pm +++ b/lib/WebGUI/i18n/English/Shop.pm @@ -1749,6 +1749,12 @@ our $I18N = { context => q|template label for the cart| }, + 'Add new address' => { + message => q|Add new address.|, + lastUpdated => 0, + context => q|form label for the cart. Allows user to build a new address.| + }, + }; 1;