Charon Cart Version 2 Tutorial
This is a comprehensive tutorial outlining the steps neccessary to implement a shopping cart on a site using the excellent Charon Cart Extension. It is suitable for all but the very novice Ultradev user. The only requisite skills are an ability to create filtered recordsets and some familiarity with the Goto Link Page behaviour.
There are well illustrated steps to all the Charon Cart features, a short discussion on database design and a commented version of the server side code included with this extension.
This tutorial has been written with the kind permission of the extension author Jules Roberts. Corrections and suggestions are welcomed.
Database Design
The Charon Cart extension
comes complete with an access database that contains all the tables and structures
you need to start using the Charon Cart immediately. This section will discuss
those tables briefly and also some of the database design rules that you should
use if you decide to create your own tables.
The access database contains
these pertinent tables related as shown.
The most important relationships
are between the Products, OrderDetails and Order tables. Every record in the
OrderDetails table represents one item whos details are stored in the Products
table. They are linked through the ProductID column which is a primary key of
the Products table and a Foreign key of the OrderDetails table. The Order table
is related to the OrderDetails table through the OrderID column that is the
primary key of the Orders table and another Foreign key of the OrderDetails
table. So every product that belongs to an order is listed in the OrderDetails
table, you know which order it belongs to because the records OrderID will match
a record in the Orders table. This is called a one-to-many relationship. There
can be many records or items on one order, all with the same OrderID, but there
is only one order with that OrderID. The same is true of the Products and OrderDetails
tables, there can be many records in the OrderDetails table with the same ProductID
(but usually with different OrderIDs) but only one record in the Products table
with the same ProductID. This is what is meant by primary and foreign keys,
a primary key is unique in that table, a foreign key is not.
This is the relational model
of databases and the tables have been normalised, meaning that any information
that is repeated is stored in a separate table and linked to via primary and
foreign keys.
If you wish to utilise your
own table and database design you must include these features within it;
- The product table must
include a unique identifier (the primary key), usually generated by using
an auto increment identity column.
There must be two tables for storing orders, one to store the actual order
and one to store the order contents. These must be related via a unique OrderID
that specifies which order the products stored in the order detail table belong
to.
If you wish to apply shipping and discounts to your orders there must exist
a table for each and they must contain at least one row that can be retrieved
at run-time.
Everything else is pretty
much optional. There are many very good tutorials here at UDzone on database
design that will explain much more fully what is required of a good e-commerce
database.
next
summary....
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18
Comments
A VERY important tip for use with Dreamweaver MX
I found that storing the Order and the Cart to a Database with Dreamweaver MX requires a slight modify to both the rsOrders and rsOrderDetails Recordsets (pages 13/14 of the tutorial).
In order to work properly, you have to change the LockType from Read Only (this is the default LockType in DreamweaverMX) to Optimistic. To do so, just select your Recordsets in the Server Behaviors Panel one at a time, then go to the Properties bar and change the Lock Type as I said above.
Maybe on Ultradev the default Lock Type is Optimistic (remember that's NOT so on Dreamweaver MX), so Rolf didn't mentioned in his tutorial. If you don't change the Lock Type, you'll get this error:
"ADODB.Recordset (0x800A0CB3)
Current Recordset does not support updating. This may be a limitation of
the provider, or of the selected locktype."
(as you see you find the word "locktype" in the error, and it's quite easy to understand: not so if you are using a non-english version of IIS or PWS, as me)
Oh, Rolf! Please change the Image029.gif on page 14: the selected Recordset is rsOrders and not rsOrderDetails, and that maybe confusing for the new user.
Happy Carting! :-)
About the Tutorial
I think the tutorial is tooo long. it will be better if it will be a little shorter or in other means " to the point" But anyways its good. but boaring too beacuse of too much text i guess.
Thanks anyways for the good things.
Pretty Good Until SSL
This was a pretty good tutorial until you left me hanging out to dry without a way to pass my cart over to my SSL connection. I found a form variable or a querystring works fine for this. In order to implement such a scheme one must create a modified version of the inc_CharonCart.asp, so that the function CookieToCart reads the values in from the form variable or querystring after one establishes the SSL connection. I modified it like so and saved it as ssl_inc_CharonCart.asp:
<%
CONST CC_ProductID = 0
CONST CC_Quantity = 1
CONST CC_Name = 2
CONST CC_Price = 3
CONST CC_UniqueKey = 4
CCcart=CookieToCart("SoftwareCart")
CCcart_SubTotal=0
CCcart_numItems=0
CCcart_Shipping=0
CCcart_Discount=0
CCcart_SalesTax=0
isFound=false
for i="0" to ubound(CCcart,2)
if CCcart(CC_ProductID,i) <> "" then
isFound=true
CCcart_SubTotal=CCcart_SubTotal + (CCcart(CC_Quantity,i)*CCcart(CC_Price,i))
CCcart_numItems=CCcart_numItems + 1
end if
next
function CCcart_LineTotal
CCcart_LineTotal=CCcart(CC_Quantity,i)*CCcart(CC_Price,i)
end function
function CCcart_GrandTotal
CCcart_GrandTotal=CCcart_SubTotal + CCcart_Shipping + CCcart_SalesTax - CCcart_Discount
end function
function CookieToCart(cookiename)
mystring=Request("Cart")
dim myarray(5,50)
productarray=split(mystring,"|")
for j="0" to ubound(productarray)
itemarray=split(productarray(j),"^")
for i="0" to 5
if itemarray(i) <> "" then
myarray(i,j)=itemarray(i)
else
myarray(i,j)=null
end if
next
next
CookieToCart=myarray
end function
%>
Notice the variable "mystring" in function CookieToCart now gets the cookie using a generic request. The other difference is--unless you are allowing Cart Updates on your checkout page--is the the CartToCookie function and the code to initialize the cart array are no longer needed and can be removed for clarity as I have.
RE: A VERY important tip for use with Dreamweaver MX
You must me logged in to write a comment.