shipping — display shipping cost for items in electronic cart


Attribute Pos. Req. Default Description
mode Yes shipping mode
possible list available shipping modes
resolve resolve shipping mode
check_validity 0 whether to check shipping mode is valid or not
free text for free shipping
country_var country name of country variable in value namespace
state_var state name of state variable in value namespace
display     symbol Display currency as symbol, text or not at all?
interpolate     0 interpolate output?
hide     0 Hide the tag return value?


Without any parameters, [shipping] displays the shipping cost for the items in the cart.

List currently available shipping modes and shipping parameters

[shipping possible=1]

This can be used to display custom parameters for the currently available shipping modes with the [shipping-desc] tag:

[loop list="[shipping possible=1]"]
Shipping Mode:   [shipping-desc mode="[loop-code]"]
Processing time: [shipping-desc mode="[loop-code]" key=p_time]
Shipping time:   [shipping-desc mode="[loop-code]" key=s_time]
Cost:            [shipping mode="[loop-code]"]

Check and resolve shipping modes

The availability of shipping modes depends on shipping parameters, usually the shipping country. [shipping check_validity=1] checks whether the shipping mode in the mv_shipmode variable is still valid. [shipping resolve=1] updates this variable if necesssary.


This tag does not appear to be affected by, or affect, the rest of Interchange.



<select name="mv_shipmode">
[shipping free="Free!" label=1 
    format=|<option value="%M"%S>%D</option>| 
    mode=|[shipping possible=1]|



shipping is available in Interchange versions:

4.6.0-5.9.0 (git-head)


Interchange 5.9.0:

Source: code/SystemTag/shipping.coretag
Lines: 18

# Copyright 2002-2007 Interchange Development Group and others
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.  See the LICENSE file for details.
# $Id: shipping.coretag,v 1.5 2007-03-30 23:40:49 pajamian Exp $

UserTag shipping            Order        mode
UserTag shipping            addAttr
UserTag shipping            attrAlias    tables table
UserTag shipping            attrAlias    carts cart
UserTag shipping            attrAlias    modes mode
UserTag shipping            attrAlias    name mode
UserTag shipping            PosNumber    1
UserTag shipping            Version      $Revision: 1.5 $
UserTag shipping            MapRoutine   Vend::Ship::tag_shipping

Source: lib/Vend/
Lines: 1101

sub tag_shipping {
my($mode, $opt) = @_;
$opt = { noformat => 1, convert => 1 } unless $opt;

return resolve_shipmode($mode, $opt)
  if $opt->{possible} || $opt->{resolve} || $opt->{check_validity};

$Ship_its = 0;
if(! $mode) {
  if($opt->{widget} || $opt->{label}) {
    $mode = resolve_shipmode(undef, { no_set => $opt->{no_set}, possible => 1});
  else {
    $mode = $opt->{handling}
        ? ($::Values->{mv_handling})
        : ($::Values->{mv_shipmode} || 'default');

my $loc = $Vend::Cfg->{Shipping_repository}
    && $Vend::Cfg->{Shipping_repository}{default};
$loc ||= {};

$Vend::Cfg->{Shipping_line} = [] 
  if $opt->{reset_modes};
read_shipping(undef, $opt) if $Vend::Cfg->{SQL_shipping};
read_shipping(undef, $opt) if $opt->{add};
read_shipping($opt->{file}) if $opt->{file};
my $out;

#::logDebug("Shipping mode(s) $mode");
my (@modes) = grep /\S/, split /[\s,\0]+/, $mode;
if($opt->{default}) {
  undef $opt->{default}
    if tag_shipping($::Values->{mv_shipmode});
if($opt->{label} || $opt->{widget}) {
  my @out;
  if($opt->{widget}) {
    $opt->{label} = 1;
    $opt->{output_options} = 1;
  for(@modes) {
    my $return = shipping($_, $opt);
#::logDebug("pushing $return");
    #push @out, shipping($_, $opt);
    push @out, $return;
  @out = grep /=.+/, @out;

  if(! @out and ! $opt->{hide_error}) {
    my $message = $loc->{no_modes_message} || 'Not enough information';
    @out = "=" . errmsg($message);

  if($opt->{widget}) {
    my $o = { %$opt };
    $o->{type} = delete $o->{widget};
    $o->{passed} = join ",", @out;
    $o->{name} ||= 'mv_shipmode';
    $o->{value} ||= $::Values->{mv_shipmode};
    $out = Vend::Form::display($o);
  else {
    $out = join "", @out;
else {
  ### If the user has assigned to shipping or handling,
  ### we use their value
  if($Vend::Session->{assigned}) {
    my $tag = $opt->{handling} ? 'handling' : 'shipping';
    $out = $Vend::Session->{assigned}{$tag} 
      if defined $Vend::Session->{assigned}{$tag} 
      && length( $Vend::Session->{assigned}{$tag});
  ### If no assignment has been made, we read the shipmodes
  ### and use their value
  unless (defined $out) {
    $out = 0;
    for(@modes) {
      $out += shipping($_, $opt) || 0;
  $out = Vend::Util::round_to_frac_digits($out);
  ## Conversion would have been done above, force to 0, as
  ## found by Frederic Steinfels
  $out = currency($out, $opt->{noformat}, 0, $opt);
return $out unless $opt->{hide};


Interchange Development Group


assign(7ic), SpecialSub(7ic), shipping-desc(7ic)

DocBook! Interchange!