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.
Adding Sales Tax or VAT
Sales tax or VAT in the
UK is calculated in the same way as shipping or discount; by using a filtered
recordset to retrieve the rate of tax to be added to the order.
So create a recordset as
before and use an sql statement to filter the recordset to one record. Sales
tax is usually constant within a country, state or county and if you are only
interested in one rate of tax then produce a database table with only one record
that contains the correct rate of tax.
Note
that this rate should be expressed as a decimal fraction, i.e. if the
rate is 17.5% then the value you should store in the table should be 0.175.
If you are using the sample
database provided with the Charon Cart then a table is provided with many European
countries that you can assign the relevant tax codes to. Charon Cart has no
way of knowing which rate of tax to assign to which order except through the
recordset used here. It is up to you to make sure that the correct record is
retrieved, either because there is only one tax rate you are interested in or
because you know at this point what country the customer is ordering from. This
may be achieved through a customer login screen for example. If you do not know
how to identify a customer through the web site it is beyond the scope of this
article to describe and if you need to achieve this then investigate the use
of cookies to identify users.
Once you are sure that your
discount recordset will be retrieving the correct record then click on the Charon
Cart > Sales Tax server behaviour and complete this dialogue.
NOTE:
there is a small but significant bug at this point in the Charon Cart
concerning the order of calculation of the order totals. If you wish to
charge VAT/Sales Tax to the whole order, after discount but including
the shipping costs (which is normal in the UK at least) then switch to
code view and ensure that the three code elements for calculating discount,
shipping and sales tax are in this order (some field names may be different
in your view but they will essentially look the same);
<%
'calculate discount from subtotal
if not rsDiscount.eof then
CCcart_Discount = CCcart_SubTotal - (CCcart_SubTotal * rsDiscount("Discount"))
End If
%>
<%
'Add shipping from a value in a recordset
'The recordset may be pre-filtered based on the CCcart_SubTotal value
if not rsShipping.eof then
CCcart_Shipping=rsShipping("ShippingCost")
end if
%>
<%
'Add sales tax from value in recordset
if not rsVAT.eof then
CCcart_SalesTax=(CCcart_SubTotal + CCcart_Shipping - CCcart_Discount)*rsVAT("VATrate")
end if
%>
By
default Charon Cart will insert the sales tax calculation before the value
of CCcart_Shipping has been assigned and so it will be ignored in the
tax calculation.
next
storing the order....
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.