extract order tags into the order object and make them common between order and shipp...
authorTony Cook <tony@develop-help.com>
Thu, 9 Jun 2011 05:52:26 +0000 (15:52 +1000)
committerTony Cook <tony@develop-help.com>
Thu, 9 Jun 2011 05:52:26 +0000 (15:52 +1000)
The ordershipped template now uses items/item instead of
orderitems/orderitem

Also adds the various options tags from the mailorder template.

site/cgi-bin/modules/BSE/Shop/Util.pm
site/cgi-bin/modules/BSE/TB/Order.pm
site/cgi-bin/modules/BSE/TB/OrderItem.pm
site/cgi-bin/modules/BSE/UI/Shop.pm
site/cgi-bin/modules/BSE/Util/Iterate.pm
site/cgi-bin/modules/BSE/Util/Tags.pm
site/templates/email/ordershipped.tmpl

index 4cf71a2..b10c845 100644 (file)
@@ -7,7 +7,7 @@ use vars qw(@ISA @EXPORT_OK);
                 payment_types order_item_opts
  PAYMENT_CC PAYMENT_CHEQUE PAYMENT_CALLME PAYMENT_MANUAL PAYMENT_PAYPAL/;
 
-our $VERSION = "1.003";
+our $VERSION = "1.004";
 
 our %EXPORT_TAGS =
   (
@@ -205,27 +205,8 @@ sub cart_item_opts {
 
 sub order_item_opts {
   my ($req, $order_item, $product) = @_;
-  
-  if (length $order_item->{options}) {
-    my @values = split /,/, $order_item->options;
-    return map
-      +{
-       id => $_->{id},
-       value => $_->{value},
-       desc => $_->{desc},
-       label => $_->{display},
-       }, $product->option_descs($req->cfg, \@values);
-  }
-  else {
-    my @options = $order_item->option_list;
-    return map
-      +{
-       id => $_->original_id,
-       value => $_->value,
-       desc => $_->name,
-       label => $_->display
-       }, @options;
-  }
+
+  return $order_item->option_hashes;
 }
 
 sub nice_options {
index daa011b..c95a9a9 100644 (file)
@@ -6,7 +6,7 @@ use vars qw/@ISA/;
 @ISA = qw/Squirrel::Row/;
 use Carp 'confess';
 
-our $VERSION = "1.004";
+our $VERSION = "1.005";
 
 sub columns {
   return qw/id
@@ -400,6 +400,75 @@ sub mail_recipient {
   return $self->emailAddress;
 }
 
+=item mail_tags
+
+Return mail template tags suitable for an order
+
+=cut
+
+sub mail_tags {
+  my ($self) = @_;
+
+  require BSE::Util::Tags;
+  require BSE::Util::Iterate;
+  require BSE::TB::OrderItems;
+  my $it = BSE::Util::Iterate::Objects::Text->new;
+  my %item_cols = map { $_ => 1 } BSE::TB::OrderItem->columns;
+  my %products;
+  my $current_item;
+  return
+    (
+     order => [ \&BSE::Util::Tags::tag_object_plain, $self ],
+     $it->make
+     (
+      single => "item",
+      plural => "items",
+      code => [ items => $self ],
+      store => \$current_item,
+     ),
+     extended => sub {
+       my ($args) = @_;
+
+       $current_item
+        or return '* only usable in items iterator *';
+
+       $item_cols{$args}
+        or return "* unknown item column $args *";
+
+       return $current_item->$args() * $current_item->units;
+     },
+     $it->make
+     (
+      single => "option",
+      plural => "options",
+      code => sub {
+       $current_item
+         or return;
+       return $current_item->option_hashes
+      },
+      nocache => 1,
+     ),
+     options => sub {
+       $current_item
+        or return '* only in the items iterator *';
+       return $current_item->nice_options;
+     },
+     product => sub {
+       $current_item
+        or return '* only usable in items *';
+
+       require Products;
+       my $id = $current_item->productId;
+       $products{$id} ||= Products->getByPkey($id);
+
+       my $product = $products{$id}
+        or return '';
+
+       return BSE::Util::Tags::tag_article_plain($product, BSE::Cfg->single, $_[0]);
+     },
+    );
+}
+
 sub send_shipped_email {
   my ($self) = @_;
 
@@ -412,13 +481,7 @@ sub send_shipped_email {
   my %acts =
     (
      BSE::Util::Tags->mail_tags(),
-     order => [ \&BSE::Util::Tags::tag_object_plain, $self ],
-     $it->make
-     (
-      single => "orderitem",
-      plural => "orderitems",
-      code => [ items => $self ],
-     ),
+     $self->mail_tags,
     );
 
   $mailer->send
index 05475b6..6a96724 100644 (file)
@@ -5,7 +5,7 @@ use Squirrel::Row;
 use vars qw/@ISA/;
 @ISA = qw/Squirrel::Row/;
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub columns {
   return qw/id productId orderId units price wholesalePrice gst options
@@ -45,4 +45,39 @@ sub product {
   return Products->getByPkey($self->productId);
 }
 
+sub option_hashes {
+  my ($self) = @_;
+
+  my $product = $self->product;
+  if (length $self->{options}) {
+    my @values = split /,/, $self->options;
+    return map
+      +{
+       id => $_->{id},
+       value => $_->{value},
+       desc => $_->{desc},
+       label => $_->{display},
+       }, $product->option_descs(BSE::Cfg->single, \@values);
+  }
+  else {
+    my @options = $self->option_list;
+    return map
+      +{
+       id => $_->original_id,
+       value => $_->value,
+       desc => $_->name,
+       label => $_->display
+       }, @options;
+  }
+}
+
+sub nice_options {
+  my ($self) = @_;
+
+  my @options = $self->option_hashes
+    or return '';
+
+  return '('.join(", ", map("$_->{desc} $_->{label}", @options)).')';
+}
+
 1;
index 2db2941..24d3514 100644 (file)
@@ -17,7 +17,7 @@ use BSE::Shipping;
 use BSE::Countries qw(bse_country_code);
 use BSE::Util::Secure qw(make_secret);
 
-our $VERSION = "1.014";
+our $VERSION = "1.015";
 
 use constant MSG_SHOP_CART_FULL => 'Your shopping cart is full, please remove an item and try adding an item again';
 
@@ -1407,53 +1407,8 @@ sub _send_order {
      custom_class($cfg)
      ->order_mail_actions(\%acts, $order, \@items, \@products, 
                          $session->{custom}, $cfg),
-     BSE::Util::Tags->static(\%acts, $cfg),
-     iterate_items_reset => sub { $item_index = -1; },
-     iterate_items => 
-     sub { 
-       if (++$item_index < @items) {
-        $option_index = -1;
-        @options = order_item_opts($req,
-                                   $items[$item_index], 
-                                   $products[$item_index]);
-        return 1;
-       }
-       return 0;
-     },
-     item=> sub { $items[$item_index]{$_[0]}; },
-     product => 
-     sub { 
-       my $value = $products[$item_index]{$_[0]};
-       defined($value) or $value = '';
-       $value;
-     },
-     order => sub { $order->{$_[0]} },
-     extended => 
-     sub {
-       $items[$item_index]{units} * $items[$item_index]{$_[0]};
-     },
-     _format =>
-     sub {
-       my ($value, $fmt) = @_;
-       if ($fmt =~ /^m(\d+)/) {
-        return sprintf("%$1s", sprintf("%.2f", $value/100));
-       }
-       elsif ($fmt =~ /%/) {
-        return sprintf($fmt, $value);
-       }
-       elsif ($fmt =~ /^\d+$/) {
-        return substr($value . (" " x $fmt), 0, $fmt);
-       }
-       else {
-        return $value;
-       }
-     },
-     iterate_options_reset => sub { $option_index = -1 },
-     iterate_options => sub { ++$option_index < @options },
-     option => sub { escape_html($options[$option_index]{$_[0]}) },
-     ifOptions => sub { @options },
-     options => sub { nice_options(@options) },
-     with_wrap => \&tag_with_wrap,
+     BSE::Util::Tags->mail_tags(),
+     $order->mail_tags(),
      ifSubscribingTo => [ \&tag_ifSubscribingTo, \%subscribing_to ],
     );
 
@@ -1518,19 +1473,6 @@ sub _send_order {
     or print STDERR "Error sending order to customer: ",$mailer->errstr,"\n";
 }
 
-sub tag_with_wrap {
-  my ($args, $text) = @_;
-
-  my $margin = $args =~ /^\d+$/ && $args > 30 ? $args : 70;
-
-  require Text::Wrap;
-  # do it twice to prevent a warning
-  $Text::Wrap::columns = $margin;
-  $Text::Wrap::columns = $margin;
-
-  return Text::Wrap::fill('', '', split /\n/, $text);
-}
-
 sub _refresh_logon {
   my ($class, $req, $msg, $msgid, $r, $parms) = @_;
 
index 3c7e83f..47c9d0a 100644 (file)
@@ -4,7 +4,7 @@ use base 'DevHelp::Tags::Iterate';
 use BSE::Util::HTML;
 use Carp 'confess';
 
-our $VERSION = "1.001";
+our $VERSION = "1.002";
 
 sub escape {
   escape_html($_[1]);
@@ -156,4 +156,10 @@ sub item {
   return tag_object($item, $args);
 }
 
+package BSE::Util::Iterate::Objects::Text;
+use vars qw(@ISA);
+@ISA = 'DevHelp::Tags::Iterate';
+
+# base class has all the behaviour we want
+
 1;
index 11cac22..42ce432 100644 (file)
@@ -8,7 +8,7 @@ use vars qw(@EXPORT_OK @ISA);
 @ISA = qw(Exporter);
 require Exporter;
 
-our $VERSION = "1.009";
+our $VERSION = "1.010";
 
 sub _get_parms {
   my ($acts, $args) = @_;
@@ -1238,7 +1238,46 @@ Currently returns the basic static tags.
 sub mail_tags {
   my ($class) = @_;
 
-  return $class->static(undef, BSE::Cfg->single);
+  return 
+    (
+     $class->static(undef, BSE::Cfg->single),
+     _format =>
+     sub {
+       my ($value, $fmt) = @_;
+       if ($fmt =~ /^m(\d+)/) {
+        return sprintf("%$1s", sprintf("%.2f", $value/100));
+       }
+       elsif ($fmt =~ /%/) {
+        return sprintf($fmt, $value);
+       }
+       elsif ($fmt =~ /^\d+$/) {
+        return substr($value . (" " x $fmt), 0, $fmt);
+       }
+       elsif ($fmt eq "h") {
+        return escape_html($value);
+       }
+       elsif ($fmt eq "u") {
+        return escape_uri($value);
+       }
+       else {
+        return $value;
+       }
+     },
+     with_wrap => \&tag_with_wrap,
+    );
+}
+
+sub tag_with_wrap {
+  my ($args, $text) = @_;
+
+  my $margin = $args =~ /^\d+$/ && $args > 30 ? $args : 70;
+
+  require Text::Wrap;
+  # do it twice to prevent a warning
+  $Text::Wrap::columns = $margin;
+  $Text::Wrap::columns = $margin;
+
+  return Text::Wrap::fill('', '', split /\n/, $text);
 }
 
 1;
index 29403d7..850e490 100644 (file)
@@ -4,11 +4,14 @@ Your order <:order id |%05d:> has been shipped.
 
 <:or:><:eif
 :>
-Item                                                      Units    Price
-<:iterator begin orderitems:>
-<:orderitem title |%-60s:>
-                                                         <:orderitem units |%6d:> <:money orderitem price |%8s:>
-<:iterator end orderitems:>
-<:ifOrder shipping_cost
-:>Shipping:                                                       <:money order shipping_cost |%8s:><:or:><:eif:>
-Total:                                                          <:money order total |%8s:>
+Product                                   Units  Price   Extended
+-----------------------------------------------------------------
+<:iterator begin items:><:product title |42:><:item units|%2d:><:item price |m10:><:extended price|m11:><:if Options:>
+   <:options:><:or Options:><:eif Options:>
+<:iterator separator items:><:iterator end items 
+:>-----------------------------------------------------------------
+                                             Shipping: <:order shipping_cost |m10:>
+                                                Total: <:order total |m10:>
+                                                 GST: <:order gst   |m10:>
+
+