diff --git a/lib/WebGUI/Content/Shop.pm b/lib/WebGUI/Content/Shop.pm index 65921ac70..7b77426f2 100644 --- a/lib/WebGUI/Content/Shop.pm +++ b/lib/WebGUI/Content/Shop.pm @@ -18,7 +18,7 @@ use strict; use WebGUI::AdminConsole; use WebGUI::Shop::AddressBook; use WebGUI::Shop::Cart; -#use WebGUI::Shop::Pay; +use WebGUI::Shop::Pay; use WebGUI::Shop::Ship; use WebGUI::Shop::Tax; diff --git a/lib/WebGUI/Form.pm b/lib/WebGUI/Form.pm index a1a941fc9..d297bc61b 100644 --- a/lib/WebGUI/Form.pm +++ b/lib/WebGUI/Form.pm @@ -136,9 +136,9 @@ sub formHeader { croak "Second parameter must be hash reference" if ref $params ne "HASH"; - my $action = exists $params->{ action } ? $params->{ action } : $session->url->page(); - my $method = exists $params->{ method } ? $params->{ method } : "post"; - my $enctype = exists $params->{ enctype } ? $params->{ enctype } : "multipart/form-data"; + my $action = (exists $params->{action} && $params->{action} ne "") ? $params->{action} : $session->url->page(); + my $method = (exists $params->{method} && $params->{method} ne "") ? $params->{method} : "post"; + my $enctype = (exists $params->{enctype} && $params->{enctype} ne "") ? $params->{enctype} : "multipart/form-data"; # Fix a query string in the action URL my $hidden; diff --git a/lib/WebGUI/Shop/Admin.pm b/lib/WebGUI/Shop/Admin.pm index 429001755..8bde135b5 100644 --- a/lib/WebGUI/Shop/Admin.pm +++ b/lib/WebGUI/Shop/Admin.pm @@ -97,6 +97,7 @@ sub www_editSettings { my $ac = $self->getAdminConsole; my $setting = $self->session->setting; my $form = WebGUI::HTMLForm->new($self->session); + $form->submit; $form->hidden(name=>"shop", value=>"admin"); $form->hidden(name=>"method", value=>"editSettingsSave"); $form->template( diff --git a/lib/WebGUI/Shop/Ship.pm b/lib/WebGUI/Shop/Ship.pm index 570a6b10d..21a5419eb 100644 --- a/lib/WebGUI/Shop/Ship.pm +++ b/lib/WebGUI/Shop/Ship.pm @@ -190,6 +190,8 @@ Returns a reference to the current session. =head2 www_addDriver () +Adds a ship driver to the shop, then displays it's edit screen. + =cut sub www_addDriver { @@ -202,18 +204,34 @@ sub www_addDriver { #------------------------------------------------------------------- +=head2 www_deleteDriver () + +Deletes a ship driver from the shop. + +=cut + +sub www_deleteDriver { + my $self = shift; + my $form = $self->session->form; + WebGUI::Error::InvalidParam->throw(error => q{must have a form var called driverId with guid }) if ($form->get("driverId") eq ""); + $self->getShipper($form->get("driverId"))->delete; + return $self->www_manage; +} + +#------------------------------------------------------------------- + =head2 www_do ( ) -Let's ship drivers do method calls. Requires a driver param in the post form vars which contains the id of the driver to load. +Let's ship drivers do method calls. Requires a driverId param in the post form vars which contains the id of the driver to load. =cut sub www_do { my ($self) = @_; my $form = $self->session->form; - WebGUI::Error::InvalidParam->throw(error => q{must have a form var called driver with a driver id }) if ($form->get("driver") eq ""); + WebGUI::Error::InvalidParam->throw(error => q{must have a form var called driverId with a driver id }) if ($form->get("driverId") eq ""); WebGUI::Error::InvalidParam->throw(error => q{must have a form var called do with a method name in the driver }) if ($form->get("do") eq ""); - my $driver = $self->getShipper($form->get("driver")); + my $driver = $self->getShipper($form->get("driverId")); my $output = undef; my $method = "www_". ( $form->get("do")); if ($driver->can($method)) { @@ -243,7 +261,23 @@ sub www_manage { .WebGUI::Form::submit($session, {value=>$i18n->get("add shipper")}) .WebGUI::Form::formFooter($session); foreach my $shipper (@{$self->getShippers}) { - + $output .= '
' + .WebGUI::Form::formHeader($session, {extras=>'style="float: left;"'}) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"ship"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"deleteDriver"}) + .WebGUI::Form::hidden($session, {name=>"driverId", value=>$shipper->getId}) + .WebGUI::Form::submit($session, {value=>$i18n->get("delete"), extras=>'class="backwardButton"'}) + .WebGUI::Form::formFooter($session) + .WebGUI::Form::formHeader($session, {extras=>'style="float: left;"'}) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"ship"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"do"}) + .WebGUI::Form::hidden($session, {name=>"do", value=>"edit"}) + .WebGUI::Form::hidden($session, {name=>"driverId", value=>$shipper->getId}) + .WebGUI::Form::submit($session, {value=>$i18n->get("edit"), extras=>'class="normalButton"'}) + .WebGUI::Form::formFooter($session) + .' ' + .$shipper->get("label") + .'
'; } my $console = $admin->getAdminConsole; return $console->render($output, $i18n->get("shipping methods")); diff --git a/lib/WebGUI/Shop/ShipDriver.pm b/lib/WebGUI/Shop/ShipDriver.pm index d0d45f842..fe4ae6f6c 100644 --- a/lib/WebGUI/Shop/ShipDriver.pm +++ b/lib/WebGUI/Shop/ShipDriver.pm @@ -32,34 +32,8 @@ These subroutines are available from this package: =cut readonly session => my %session; -readonly className => my %className; -readonly shipperId => my %shipperId; -readonly options => my %options; - -#------------------------------------------------------------------- - -=head2 _buildObj ( ) - -Private method used to build objects, shared by new and create. - -=cut - -sub _buildObj { - my ($class, $session, $requestedClass, $shipperId, $options) = @_; - my $self = {}; - bless $self, $requestedClass; - register $self; - - my $id = id $self; - - $session{ $id } = $session; - $shipperId{ $id } = $shipperId; - $options{ $id } = $options; - $className{ $id } = $requestedClass; - - return $self; -} - +private options => my %options; +private shipperId => my %shipperId; #------------------------------------------------------------------- @@ -76,15 +50,6 @@ sub calculate { #------------------------------------------------------------------- -=head2 className ( ) - -Accessor for the className of the object. This is the name of the driver that is used -to do calculations. - -=cut - -#------------------------------------------------------------------- - =head2 create ( $session, $options ) Constructor for new WebGUI::Shop::ShipperDriver objects. Returns a WebGUI::Shop::ShipperDriver object. @@ -109,11 +74,9 @@ sub create { WebGUI::Error::InvalidParam->throw(error => q{Must provide a hashref of options}) unless ref $options eq 'HASH' and scalar keys %{ $options }; my $shipperId = $session->id->generate; - my $self = WebGUI::Shop::ShipDriver->_buildObj($session, $class, $shipperId, $options); - $session->db->write('insert into shipper (shipperId,className) VALUES (?,?)', [$shipperId, $class]); - $self->set($options); - + my $self = $class->new($session, $shipperId); + $self->update($options); return $self; } @@ -167,7 +130,7 @@ Removes this ShipDriver object from the db. sub delete { my $self = shift; - $self->session->db->write('delete from shipper'); + $self->session->db->write('delete from shipper where shipperId=?',[$self->getId]); return; } @@ -190,13 +153,18 @@ return the value from the options hash. sub get { my $self = shift; my $param = shift; - my $options = $self->options; - if (defined $param) { - return $options->{$param}; + my $opts = $options{id $self}; + if ($opts eq "") { + $opts = {}; } else { - return $options; + $opts = JSON::from_json($opts); } + if (defined $param) { + return $opts->{$param}; + } + my %copy = %{$opts}; + return \%copy; } #------------------------------------------------------------------- @@ -214,13 +182,12 @@ sub getEditForm { my $form = WebGUI::HTMLForm->new($self->session); $form->submit; $form->hidden( - name => 'shipperId', + name => 'driverId', value => $self->getId, ); - $form->hidden( - name => 'className', - value => $self->className, - ); + $form->hidden(name => 'shop',value => "ship"); + $form->hidden(name => 'method',value => "do"); + $form->hidden(name => 'do',value => "editSave"); $form->dynamicForm($definition, 'properties', $self); return $form; } @@ -235,7 +202,8 @@ since a lot of WebGUI classes have a getId method. =cut sub getId { - return shift->shipperId; + my $self = shift; + return $shipperId{id $self}; } #------------------------------------------------------------------- @@ -275,26 +243,40 @@ sub new { my $properties = $session->db->quickHashRef('select * from shipper where shipperId=?',[$shipperId]); WebGUI::Error::ObjectNotFound->throw(error => q{shipperId not found in db}, id => $shipperId) unless scalar keys %{ $properties }; - ##This check is just to guardband the from_json call below. - WebGUI::Error::InvalidParam->throw( - error => qq{Options property for $shipperId was broken in the db}, - param => $properties->{options}, - ) unless $properties->{options}; ##Note, existence is controlled by the columns in the db - my $options = from_json($properties->{options}); - my $self = WebGUI::Shop::ShipDriver->_buildObj($session, $class, $shipperId, $options); + my $self = register $class; + my $id = id $self; + $session{ $id } = $session; + $options{ $id } = $properties->{options}; + $shipperId{ $id } = $shipperId; return $self; } + #------------------------------------------------------------------- -=head2 options ( ) +=head2 processPropertiesFromFormPost ( ) -Accessor for the driver properties. This returns a hashref -any driver specific properties. To set the properties, use -the C method. +Updates ship driver with data from Form. =cut +sub processPropertiesFromFormPost { + my $self = shift; + my %properties; + my $fullDefinition = $self->definition($self->session); + foreach my $definition (@{$fullDefinition}) { + foreach my $property (keys %{$definition->{properties}}) { + $properties{$property} = $self->session->form->process( + $property, + $definition->{properties}{$property}{fieldType}, + $definition->{properties}{$property}{defaultValue} + ); + } + } + $properties{title} = $fullDefinition->[0]{name} if ($properties{title} eq "" || lc($properties{title}) eq "untitled"); + $self->update(\%properties); +} + #------------------------------------------------------------------- =head2 session ( ) @@ -305,7 +287,7 @@ Accessor for the session object. Returns the session object. #------------------------------------------------------------------- -=head2 set ( $options ) +=head2 update ( $options ) Setter for user configurable options in the ship objects. @@ -316,40 +298,52 @@ flattened into JSON and stored in the database as text. There is no content che =cut -sub set { +sub update { my $self = shift; - my $options = shift; - WebGUI::Error::InvalidParam->throw(error => 'set was not sent a hashref of options to store in the database') + my $options = shift || {}; + WebGUI::Error::InvalidParam->throw(error => 'update was not sent a hashref of options to store in the database') unless ref $options eq 'HASH' and scalar keys %{ $options }; my $jsonOptions = to_json($options); - $self->session->db->write('update shipper set options=? where shipperId=?', [$jsonOptions, $self->shipperId]); - return; + $options{id $self} = $jsonOptions; + $self->session->db->write('update shipper set options=? where shipperId=?', [$jsonOptions, $self->getId]); + return undef; } -#------------------------------------------------------------------- - -=head2 shipperId ( ) - -Accessor for the unique identifier for this shipperDriver. The shipperId is -a GUID. - -=cut #------------------------------------------------------------------- =head2 www_edit ( ) -Generates an edito form. +Generates an edit form. =cut sub www_edit { my $self = shift; - my $admin = WebGUI::Shop::Admin->new($self->session); - my $i18n = WebGUI::International->new($self->session, "Shop"); - return $admin->getAdminConsole->render($self->getEditForm->print, $i18n->get("shipping methods")); + my $session = $self->session; + return $session->privilege->insufficient() unless $session->user->isInGroup(3); + my $admin = WebGUI::Shop::Admin->new($session); + my $i18n = WebGUI::International->new($session, "Shop"); + my $form = $self->getEditForm; + $form->submit; + return $admin->getAdminConsole->render($form->print, $i18n->get("shipping methods")); } +#------------------------------------------------------------------- +=head2 www_editSave ( ) + +Saves the data from the post. + +=cut + +sub www_editSave { + my $self = shift; + my $session = $self->session; + return $session->privilege->insufficient() unless $session->user->isInGroup(3); + $self->processPropertiesFromFormPost; + $session->http->setRedirect("/?shop=ship;method=manage"); + return undef; +} 1; diff --git a/lib/WebGUI/Shop/ShipDriver/FlatRate.pm b/lib/WebGUI/Shop/ShipDriver/FlatRate.pm index 9d89c0a68..030850632 100644 --- a/lib/WebGUI/Shop/ShipDriver/FlatRate.pm +++ b/lib/WebGUI/Shop/ShipDriver/FlatRate.pm @@ -79,8 +79,8 @@ sub definition { }, pricePerWeight => { fieldType => 'float', - label => $i18n->get('pricePerWeight'), - hoverHelp => $i18n->get('pricePerWeight help'), + label => $i18n->get('percentageOfWeight'), + hoverHelp => $i18n->get('percentageOfWeight help'), defaultValue => 0, }, pricePerItem => { diff --git a/lib/WebGUI/URL/Content.pm b/lib/WebGUI/URL/Content.pm index 53e4ac10b..9b30a7a4d 100644 --- a/lib/WebGUI/URL/Content.pm +++ b/lib/WebGUI/URL/Content.pm @@ -58,6 +58,9 @@ sub handler { } else { if ($output eq "chunked") { + if ($session->errorHandler->canShowDebug()) { + $session->output->print($session->errorHandler->showDebug(),1); + } last; } elsif (defined $output && $output ne "") { diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm index 33c8dced4..7ecf1aa4e 100644 --- a/lib/WebGUI/i18n/English/Shop.pm +++ b/lib/WebGUI/i18n/English/Shop.pm @@ -3,6 +3,12 @@ package WebGUI::i18n::English::Shop; use strict; our $I18N = { + 'add shipper' => { + message => q|Add Shipping Method|, + lastUpdated => 0, + context => q|button in shipping manager| + }, + 'shopping cart template' => { message => q|Cart Template|, lastUpdated => 0, diff --git a/t/Shop/ShipDriver.t b/t/Shop/ShipDriver.t index f3d64878f..2b06a3931 100644 --- a/t/Shop/ShipDriver.t +++ b/t/Shop/ShipDriver.t @@ -31,7 +31,7 @@ my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests -my $tests = 42; +my $tests = 35; plan tests => 1 + $tests; #---------------------------------------------------------------------------- @@ -154,6 +154,7 @@ my $options = { label => 'Slow and dangerous', enabled => 1, }; + $driver = WebGUI::Shop::ShipDriver->create( $session, $options ); isa_ok($driver, 'WebGUI::Shop::ShipDriver'); @@ -162,18 +163,16 @@ isa_ok($driver->session, 'WebGUI::Session', 'session method returns a session ob is($session->getId, $driver->session->getId, 'session method returns OUR session object'); -like($driver->shipperId, $session->id->getValidator, 'got a valid GUID for shipperId'); -is($driver->getId, $driver->shipperId, 'getId returns the same thing as shipperId'); +like($driver->getId, $session->id->getValidator, 'got a valid GUID for shipperId'); -is($driver->className, ref $driver, 'className property set correctly'); -cmp_deeply($driver->options, $options, 'options accessor works'); +cmp_deeply($driver->get, $options, 'options accessor works'); -my $dbData = $session->db->quickHashRef('select * from shipper where shipperId=?',[$driver->shipperId]); +my $dbData = $session->db->quickHashRef('select * from shipper where shipperId=?',[$driver->getId]); cmp_deeply( $dbData, { - shipperId => $driver->shipperId, + shipperId => $driver->getId, className => ref($driver), options => q|{"label":"Slow and dangerous","enabled":1}|, }, @@ -194,7 +193,6 @@ is (WebGUI::Shop::ShipDriver->getName($session), 'Shipper Driver', 'getName retu # ####################################################################### -cmp_deeply($driver->get, $driver->options, 'get works like the options method with no param passed'); is($driver->get('enabled'), 1, 'get the enabled entry from the options'); is($driver->get('label'), 'Slow and dangerous', 'get the label entry from the options'); @@ -215,7 +213,7 @@ my @forms = HTML::Form->parse($html, 'http://www.webgui.org'); is (scalar @forms, 1, 'getEditForm generates just 1 form'); my @inputs = $forms[0]->inputs; -is (scalar @inputs, 5, 'getEditForm: the form has 5 controls'); +is (scalar @inputs, 7, 'getEditForm: the form has 7 controls'); my @interestingFeatures; foreach my $input (@inputs) { @@ -232,11 +230,19 @@ cmp_deeply( type => 'submit', }, { - name => 'shipperId', + name => 'driverId', type => 'hidden', }, { - name => 'className', + name => 'shop', + type => 'hidden', + }, + { + name => 'method', + type => 'hidden', + }, + { + name => 'do', type => 'hidden', }, { @@ -295,40 +301,12 @@ cmp_deeply( 'new croaks unless the requested shipperId object exists in the db', ); -my $driverCopy = WebGUI::Shop::ShipDriver->new($session, $driver->shipperId); +my $driverCopy = WebGUI::Shop::ShipDriver->new($session, $driver->getId); is($driver->getId, $driverCopy->getId, 'same id'); -is($driver->className, $driverCopy->className, 'same className'); -cmp_deeply($driver->options, $driverCopy->options, 'same options'); +is(ref $driver, ref $driverCopy, 'same className'); +cmp_deeply($driver->get, $driverCopy->get, 'same options'); -my $brokenDriver = WebGUI::Shop::ShipDriver->create($session, {label=>'to be broken', enabled=>'0'}); -$session->db->write('update shipper set options=NULL where shipperId=?',[$brokenDriver->getId]); - -eval { $oldDriver = WebGUI::Shop::ShipDriver->new($session, $brokenDriver->getId); }; -$e = Exception::Class->caught(); -isa_ok($e, 'WebGUI::Error::InvalidParam', 'new croaks if the options column in the db is null'); -cmp_deeply( - $e, - methods( - error => re('Options property for \S{22} was broken in the db'), - param => undef, - ), - 'new croaks if the options column in the db is null', -); - -$session->db->write(q{update shipper set options='' where shipperId=?},[$brokenDriver->getId]); - -eval { $oldDriver = WebGUI::Shop::ShipDriver->new($session, $brokenDriver->getId); }; -$e = Exception::Class->caught(); -isa_ok($e, 'WebGUI::Error::InvalidParam', 'new croaks if the options column in the db is empty string'); -cmp_deeply( - $e, - methods( - error => re('Options property for \S{22} was broken in the db'), - param => '', - ), - 'new croaks if the options column in the db is empty string', -); ####################################################################### @@ -346,15 +324,15 @@ like ($@, qr/^You must override the calculate method/, 'calculate croaks to forc # ####################################################################### -eval { $driver->set(); }; +eval { $driver->update(); }; $e = Exception::Class->caught(); -isa_ok($e, 'WebGUI::Error::InvalidParam', 'set takes exception to not giving it a hashref of options'); +isa_ok($e, 'WebGUI::Error::InvalidParam', 'update takes exception to not giving it a hashref of options'); cmp_deeply( $e, methods( - error => 'set was not sent a hashref of options to store in the database', + error => 'update was not sent a hashref of options to store in the database', ), - 'set takes exception to not giving it a hashref of options', + 'update takes exception to not giving it a hashref of options', ); #######################################################################