Listings 15-1 to 15-12 contain the complete an uninterrupted code for the programs and templates used to create the Web-based shopping cart.
Listing 15-1: catalog.cgi
01: #!/usr/bin/perl -wT 02: use strict; 03: use SOAP::Lite; 04: use CGI qw(:standard); 05: use lib qw(.); 06: use BasicSession; 07: our $sess; 08: my %cart; 09: $sess = Get_Session(); 10: tie %cart, ‘BasicSession’; 11: my $add_to_cart = param(‘add_to_cart’); 12: ++$cart{$add_to_cart} if $add_to_cart; 13: my $remove= param(‘remove’); 14: delete $cart{$remove} if $remove; 15: my $products = SOAP::Lite 16: -> uri(‘http://goliath.perlguy.net/Catalog’) 17: -> proxy(‘http://goliath.perlguy.net/cgi- bin/soap_server19.cgi’) 18: -> Get_Product_List() 19: -> result; 20: Print_Page("./templates", "header.tmpl", \%cart); 21: Print_Page("./templates", "catalog_header.tmpl", \%cart); 22: for my $p (@$products){ 23: print qq( 24: <tr><td> 25: [<a href="catalog.cgi?add_to_cart=$p->[1]">Add Item</a>] 26: </td><td> 27: <a href="item_details.cgi?item_num=$p->[1]">$p->[1]</a> 28: </td><td>$p->[0] 29: </td><td> $p->[2] 30: </td><td align="center"> $item{$p->[1]} 31: </td><td>[<a href="catalog.cgi?remove=$p->[1]">Delete</a>] 32: </td></tr>\n); 33: } 34: Print_Page("./templates", "catalog_footer.tmpl", \%cart);
Listing 15-2: item_details.cgi
01: #!/usr/bin/perl -wT 02: use strict; 03: use CGI qw(:standard); 04: use SOAP::Lite; 05: use XML::Simple; 06: use lib qw(.); 07: use BasicSession; 08: our $sess; 09: my %session; 10: $sess = Get_Session(); 11: tie %session, ‘BasicSession’; 12: my $input = param(‘item_num’); 13: my $data = SOAP::Lite 14: -> uri(‘http://goliath.perlguy.net/Catalog’) 15: -> proxy(‘http://goliath.perlguy.net/cgi- bin/soap_server.cgi’) 16: -> Get_Product_Data($input) 17: -> result; 18: $data =~ s/\&|\&/\&/g; 19: my $item = XMLin($data); 20: ++$session{$item->{isbn}} if(param(‘add_to_cart’)); 21: my $cart_qty = $session{$item->{isbn}}; 22: $cart_qty = 0 unless $cart_qty; 23: $item->{‘cart_qty’} = $cart_qty; 24: Print_Page("./templates", "header.tmpl" , $item); 25: Print_Page("./templates", "item_details.tmpl", $item);
Listing 15-3: cart.cgi
01: #!/usr/bin/perl -wT 02: # cart.cgi 03: use strict; 04: use SOAP::Lite; 05: use CGI qw(:standard); 06: use lib qw(.); 07: use BasicSession; 08: our $sess; 09: my %session; 10: $sess = Get_Session(); 11: tie %session, ‘BasicSession’; 12: my $add_to_cart = param(‘add_to_cart’); 13: ++$session{$add_to_cart} if $add_to_cart; 14: my $remove= param(‘remove’); 15: delete $session{$remove}; 16: my $products = SOAP::Lite 17: -> uri(‘http://goliath.perlguy.net/Catalog’) 18: -> proxy(‘http://goliath.perlguy.net/cgi- bin/soap_server19.cgi’) 19: -> Get_Product_List() 20: -> result; 21: Print_Page("./templates", "header.tmpl", \%session); 22: Print_Page("./templates", "catalog_header.tmpl", \%session); 23: delete($session{‘cart_qty_total’}); 24: delete($session{‘cart_price_total’}); 25: for my $prod (@$products) { 26: next unless ($session{$prod->[1]}); 27: $session{‘cart_qty_total’} += $session{$prod->[1]}; 28: $session{‘cart_price_total’} += Calc_Price($session{$prod->[1]} , $prod->[2]); 29: print qq( 30: <tr><td> 31: [<a href="cart.cgi?add_to_cart=$prod->[1]">Add Item</a>] 32: </td><td> 33: <a href="item_details.cgi?item_num=$prod->[1]">$prod->[1]</a> 34: </td><td> 35: $prod->[0] 36: </td><td align="right"> 37: $prod->[2] 38: </td><td align="center"> 39: $session{$prod->[1]} 40: </td><td> 41: [<a href="cart.cgi?remove=$prod->[1]">Delete</a>] 42: </td></tr>\n 43: ); 44: } 45: $session{‘cart_price_total’} = sprintf("%.2f", $session{‘cart_price_total’}); 46: Print_Page("./templates", "cart_total.tmpl" , \%session); 47: Print_Page("./templates", "catalog_footer.tmpl", \%session); 48: sub Calc_Price { 49: my($qty, $price) = @_; 50: $price =~ s/[ \$]//g; 51: return($qty * $price); 52: }
Listing 15-4: invoice.cgi
01: #!/usr/bin/perl -wT 02: use strict; 03: use SOAP::Lite; 04: use CGI qw(:standard); 05: use lib qw(.); 06: use BasicSession; 07: our $sess; 08: my %session; 09: $sess = Get_Session(); 10: tie %session, ‘BasicSession’; 11: my $products = SOAP::Lite 12: -> uri(‘http://goliath.perlguy.net/Catalog’) 13: -> proxy(‘http://goliath.perlguy.net/cgi- bin/soap_server19.cgi’) 14: -> Get_Product_List() 15: -> result; 16: Print_Page("./templates", "header.tmpl", \%session); 17: Print_Page("./templates", "invoice_header.tmpl", \%session); 18: delete($session{‘cart_qty_total’}); 19: delete($session{‘cart_price_total’}); 20: for my $prod (@$products){ 21: next unless ($session{$prod->[1]}); 22: $session{‘cart_qty_total’} += $session{$prod->[1]}; 23: $session{‘cart_price_total’} += Calc_Price($item{$prod->[1]} , $prod->[2]); 24: print qq( 25: <tr> 26: <td align="center" valign="top"> 27: $prod->[1] 28: </td> 29: <td align="left"> 30: $prod->[0] 31: </td> 32: <td align="center" valign="top"> 33: $session{$prod->[1]} 34: </td> 35: <td align="right" valign="top"> 36: $prod->[2] 37: </td> 38: <td align="right" valign="top"> 39: ); 40: printf("\$%.2f", Calc_Price($session{$prod->[1]}, $prod->[2]) ); 41: print qq( 42: </td> 43: </tr>\n 44: ); 45: } 46: $session{‘cart_price_total’} = sprintf("%.2f", $session{‘cart_price_total’}); 47: Print_Page("./templates", "invoice_footer.tmpl", \%session); 48: sub Calc_Price { 49: my($qty, $price) = @_; 50: $price =~ s/[ \$]//g; 51: return($qty * $price); 52: }
Listing 15-5: cart_total.tmpl
01: <tr> 02: <td align="right" colspan="3"> 03: Total in cart: 04: </td> 05: <td align="right"> 06: <b>$%%cart_price_total%%</b> 07: </td> 08: <td align="center"> 09: <b>%%cart_qty_total%%</b> 10: </td> 11: <td align="center"> 12: 13: </td> 14: </tr>
Listing 15-6: catalog_footer.tmpl
01: <tr> 02: <td align="center" colspan="6"> 03: [ <a href="catalog.cgi">View Catalog</a> ] 04: [ <a href="cart.cgi">View Cart</a> ] 05: [ <a href="invoice.cgi">View Invoice</a> ] 06: </td> 07: </tr> 08: </table> 09: </body> 10: </html>
Listing 15-7: catalog_header.tmpl
01: <body> 02: <table border="1" cellspacing="0" align="center"> 03: <tr> 04: <td colspan="6" align="center"> 05: <font > 06: Book Catalog 07: </font> 08: </td> 09: </tr> 10: <tr> 11: <td align="center"> 12: <b>Purchase</b> 13: </td> 14: <td align="center"> 15: <b>ISBN #</b> 16: </td> 17: <td align="center"> 18: <b>Item</b> 19: </td> 20: <td align="center"> 21: <b>Price</b> 22: </td> 23: <td align="center"> 24: <b>Cart</b> 25: </td> 26: <td align="center"> 27: <b>Remove</b> 28: </td> 29: </tr>
Listing 15-8: header.tmpl
01: <html><head><title>Product Catalog</title> 02: <style type="text/css"> 03: <!-- 04: td { background: #e0e0e0; 05: color: #000000; 06: font-family: Lucida, Verdana, Helvetica, Arial; 07: font-size: 12pt} 08: a:link { color: #4444ff } 09: a:visited { color: #333377 } 10: a:active { color: #0000dd } 11: b 12: { font-family: Lucida, Verdana, Helvetica, Arial; 13: font-size: 10pt; 14: color: %%text_color%% } 15: .small 16: { font-family: Lucida, Verdana, Helvetica, Arial; 17: font-size: 10pt; 18: color: %%text_color%% } 19: .medium 20: { font-family: Lucida, Verdana, Helvetica, Arial; 21: font-size: 12pt; 22: color: %%text_color%% } 23: .big_error 24: { font-family: Lucida, Verdana, Helvetica, Arial; 25: font-size: 14pt; 26: font-weight: bold; 27: color: #ff0000 } 28: .big 29: { font-family: Lucida, Verdana, Helvetica, Arial; 30: font-size: 14pt; 31: color: %%text_color%% } 32: .large 33: { font-family: Lucida, Verdana, Helvetica, Arial; 34: font-size: 20pt; 35: color: %%text_color%% } 36: .big2 37: { font-family: Lucida, Verdana, Helvetica, Arial; 38: font-size: 24pt; 39: color: %%text_color%% } 40: --> 41: </style> 42: </head> 43: <body>
Listing 15-9: invoice_body.tmpl
01: <tr> 02: <td align="center" valign="top"> 03: <b>Item #</b> 04: </td> 05: <td align="center"> 06: <b>Item Description</b> 07: </td> 08: <td align="center" valign="top"> 09: <b>Qty</b> 10: </td> 11: <td align="center" valign="top"> 12: <b>Price</b> 13: </td> 14: <td align="center" valign="top"> 15: <b>Total</b> 16: </td> 17: </tr>
Listing 15-10: invoice_footer.tmpl
01: <tr> 02: <td align="center" colspan="2"> 03: </td> 04: <td align="center"><b> 05: %%cart_qty_total%% 06: </b></td> 07: <td align="right"> 08: <b>Grand Total:</b> 09: </td> 10: <td align="right"><b> 11: $%%cart_price_total%% 12: </b></td> 13: </tr> 14: </table> 15: </body> 16: </html>
Listing 15-11: invoice_header.tmpl
01: <table border="1" width="100%" align="center" cellspacing="0"> 02: <tr> 03: <td colspan="5" align="center"> 04: <font >Order Invoice</font> 05: </td> 06: </tr> 07: <tr> 08: <td align="left" width="10%" valign="top"> 09: <b>Date:</b> <font >04/29/2002</font> 10: </td> 11: <td align="center" width="80%" colspan="3"> 12: <font >Perlguy, Inc.</font><br /> 13: 4 Brae Burn Court<br /> 14: St. Charles, MO 63303<br /> 15: (314) 555-1212<br /> 16: brent@perlguy.net 17: <br /><br /> 18: </td> 19: <td align="right" width="10%" valign="top"> 20: <b>Invoice #:</b> <font >9328409</font> 21: </td> 22: </tr> 23: <tr> 24: <td align="center" valign="top"> 25: <b>Item #</b> 26: </td> 27: <td align="center"> 28: <b>Item Description</b> 29: </td> 30: <td align="center" valign="top"> 31: <b>Qty</b> 32: </td> 33: <td align="center" valign="top"> 34: <b>Price</b> 35: </td> 36: <td align="center" valign="top"> 37: <b>Total</b> 38: </td> 39: </tr>
Listing 15-12: item_details.tmpl
01: <table border="1" width="100%" align="center" cellspacing="0"> 02: <tr> 03: <td colspan="5" align="center"> 04: <font >Order Invoice</font> 05: </td> 06: </tr> 07: <tr> 08: <td align="left" width="10%" valign="top"> 09: <b>Date:</b> <font >04/29/2002</font> 10: </td> 11: <td align="center" width="80%" colspan="3"> 12: <font >Perlguy, Inc.</font><br /> 13: 4 Brae Burn Court<br /> 14: St. Charles, MO 63303<br /> 15: (314) 555-1212<br /> 16: brent@perlguy.net 17: <br /><br /> 18: </td> 19: <td align="right" width="10%" valign="top"> 20: <b>Invoice #:</b> <font >9328409</font> 21: </td> 22: </tr> 23: <tr> 24: <td align="center" valign="top"> 25: <b>Item #</b> 26: </td> 27: <td align="center"> 28: <b>Item Description</b> 29: </td> 30: <td align="center" valign="top"> 31: <b>Qty</b> 32: </td> 33: <td align="center" valign="top"> 34: <b>Price</b> 35: </td> 36: <td align="center" valign="top"> 37: <b>Total</b> 38: </td> 39: </tr>