add some support for customizing product options
[bse.git] / site / cgi-bin / modules / BSE / Edit / Product.pm
index e668ffb..e85fc05 100644 (file)
@@ -8,9 +8,10 @@ use BSE::Util::Iterate;
 use BSE::Util::HTML;
 use BSE::CfgInfo 'product_options';
 use BSE::Util::Tags qw(tag_hash tag_article);
+use BSE::PubSub;
 use constant PRODUCT_CUSTOM_FIELDS_CFG => "product custom fields";
 
-our $VERSION = "1.016";
+our $VERSION = "1.017";
 
 =head1 NAME
 
@@ -300,6 +301,7 @@ sub low_edit_tags {
   my $price_tier;
   my %prices;
   $req->set_variable(product => $article);
+  BSE::PubSub->customize(product_edit_variables => { req => $req, product => $article, errors => \$errors });
   return 
     (
      product => [ \&tag_article, $article, $cfg ],
@@ -739,6 +741,14 @@ sub req_add_option {
   }
   $req->validate(fields => \%work_option_fields,
                 errors => \%errors);
+  BSE::PubSub->customize(
+    product_option_add_validate =>
+      {
+       req => $req,
+       errors => \%errors,
+       product => $article,
+       fields => \%work_option_fields,
+       });
   keys %errors
     and return $self->_service_error($req, $article, $articles, undef, 
                                     \%errors);
@@ -776,6 +786,15 @@ sub req_add_option {
     $option->save;
   }
 
+  BSE::PubSub->customize(
+    product_option_add =>
+      {
+       req => $req,
+       product => $article,
+       option => $option,
+       values => \%value_keys
+       });
+
   $req->is_ajax
     and return $req->json_content
       (
@@ -831,8 +850,17 @@ sub _common_option {
   keys %errors
     and return $self->_service_error($req, $article, $articles, undef, \%errors);
 
+  if ($template =~ /edit/) {
+    BSE::PubSub->customize(
+      product_edit_option_edit => {
+       req => $req,
+       product => $article,
+       option => $option
+       });
+  }
   $req->set_variable(option => $option);
   $req->messages($errors);
+
   my $it = BSE::Util::Iterate->new;
   my %acts;
   %acts =
@@ -881,6 +909,7 @@ sub req_edit_option {
   $req->user_can(bse_edit_prodopt_edit => $article)
     or return $self->_service_error($req, $article, $articles, "Insufficient product access to edit options");
 
+
   return $self->_common_option('admin/prodopt_edit', $req, $article, 
                               $articles, $msg, $errors);
 }
@@ -983,6 +1012,14 @@ sub req_save_option {
     and return $self->_service_error($req, $article, $articles, undef, \%errors, 'FIELD', "req_edit_option");
   $req->validate(fields => \%option_name,
                 errors => \%errors);
+  BSE::PubSub->customize(
+    product_option_edit_validate =>
+      {
+       req => $req,
+       errors => \%errors,
+       product => $article,
+       option => $option,
+       });
   my @values = $option->values;
   my %fields = map {; "value$_->{id}" => \%option_value } @values;
   $req->validate(fields => \%fields,
@@ -994,7 +1031,6 @@ sub req_save_option {
       or $errors{default_value} = "Unknown value selected as default";
   }
 
-  $DB::single = 1;
   my @new_values;
   my $index = 1;
   while ($index < 10 && defined $cgi->param("newvalue$index")) {
@@ -1002,7 +1038,7 @@ sub req_save_option {
     my $value = $cgi->param($field);
     $req->validate(fields => { $field => \%option_value },
                   errors => \%errors);
-    push @new_values, $value;
+    push @new_values, [ $field, $value ];
 
     ++$index;
   }
@@ -1028,14 +1064,24 @@ sub req_save_option {
     }
   }
   my $order = @values ? $values[-1]->display_order : time;
-  for my $value (@new_values) {
-    BSE::TB::ProductOptionValues->make
+  my %newvalues;
+  for my $new (@new_values) {
+    my ($name, $value) = @$new;
+    $newvalues{$name} = BSE::TB::ProductOptionValues->make
        (
         product_option_id => $option->id,
         value => $value,
         display_order => ++$order,
        );
   }
+  BSE::PubSub->customize(
+    product_option_edit_save =>
+      {
+       req => $req,
+       product => $article,
+       option => $option,
+       newvalues => \%newvalues,
+       });
 
   $req->is_ajax
     and return $req->json_content