Глава 7. Корзина
В предыдущей главе мы предоставили покупателям средства для просмотра и поиска товаров. Теперь можно переходить к процессу управления корзиной.
Корзина является одним из основных элементов, обеспечивающих работу электронного магазина. Покупатель помещает в корзину интересующие его товары, чтобы позднее решить, действительно ли он хочет приобрести эти товары.

Проектирование корзины
Благодаря некоторым ключевым функциям корзина является одним из самых динамичных аспектов Web-сайта. В табл. 7.1 перечислены основные функции, которые мы реализуем на странице, предназначенной для операций с корзиной.
Таблица 7.1. Основные функции корзины


Функция

Описание

Добавление новых позиций в корзину

Когда покупатель нажимает кнопку Order на странице товара, мы выполняем действия по включению товара в корзину. При этом необходимо соблюдать несколько ключевых правил (см. ниже)

Отображение корзины

Когда покупатель находится на странице корзины, часто возникает потребность вывода всех товаров, находящихся в корзине, с количеством заказанных единиц

Обновление содержимого корзины

Если пользователь захочет изменить количество заказанных единиц товара в любой позиции корзины, мы должны предоставить ему соответствующие средства

Удаление позиций из корзины

Если пользователь решает удалить некоторую позицию из корзины, мы должны предоставить средства для удаления выбранной позиции

Очистка корзины

Если по какой-либо причине пользователь захочет удалить из корзины все отобранные товары и начать покупки заново, мы должны предоставить ему функцию для полной очистки корзины

Стрелка в верхней части диаграммы обозначает включение позиций в корзину. Покупатель может очистить корзину, изменить количество единиц товара или удалить позиции. Но давайте без лишних слов перейдем к программированию всех этих возможностей.

Добавление новых позиций
Изображенный на рисунке процесс начинается с добавления новых позиций. Страница AddItem.asp вызывается при нажатии пользователем кнопки Order на странице товара. Обратите внимание - страница выполняет только обработку данных. Она не выводит никакой информации для пользователя и немедленно передает управление странице Basket.asp для вывода содержимого корзины. Страница начинается с проверки идентификатора покупателя. Если идентификатор не был присвоен, по умолчанию присваивается 0, чтобы страница могла продолжить работу. Код страницы AddItem.asp начинается в листинге 7.1.
Листинг 7.1. AddItem.asp
<%@ Language=VBScript %>
<%
' ****************************************************
' AddItem.asp - включение выбранного товара в корзину
' ****************************************************
' Проверить, установлен ли идентификатор пользователя.
' Если нет, по умолчанию установить его равным нулю.
if session("idShopper") = "" then
' По умолчанию присваивается 0
session("idShopper") = 0
end if
Затем мы убеждаемся в том, что количество заказанных единиц товара отлично от 0. Если оно равно 0, добавлять товар в корзину незачем; вместо этого следует вернуть покупателя на страницу с информацией о товаре. Выбор страницы обеспечивается включением идентификатора товара в ссылку.
Листинг 7.2. AddItem.asp (продолжение)
' Убедиться в том, что количество единиц не равно 0.
if request("quantity") = "0" then
' Вернуть пользователя на страницу товара.
Response.Redirect("product.asp?idProduct=" & _
request("idProduct"))
End If
После завершения проверки мы получаем данные со страницы Product.asр. Как упоминалось выше, основные параметры товара сохраняются в скрытых полях этой страницы. Теперь мы читаем их для использования в программе. Апострофы в названии товара удваиваются перед занесением в базу данных.
Листинг 7.3. AddItem.asp (продолжение)
' Получить количество единиц
intQuantity = request("quantity")

' Получить идентификатор товара
idProduct = request("idProduct")

' Получить название товара
chrName = replace(request("productname"), "'", "''")

' Получить цену товара
intPrice = request("productprice")
' Получить размер
chrSize = request("size")
' Получить цвет
chrColor = request("color")
Далее необходимо убедиться в том, что для текущего заказа была создана корзина. Нельзя добавить товар в несуществующую корзину. Мы проверяем, было ли присвоено значение сеансовой переменной idBasket.
Если переменная не была инициализирована, мы открываем подключение к базе данных и создаем новую корзину. Задача решается при помощи хранимой процедуры sp_CreateBasket. При создании новой корзине присваивается идентификатор покупателя, который передается хранимой процедуре в качестве параметра.
После создания корзины мы читаем из базы данных ее идентификатор (столбец-счетчик). Прочитанное значение сохраняется в сеансовой переменной.
Листинг 7.4. AddItem.asp (продолжение)
' Проверить, существует ли корзина
if session("idBasket") = "" then
' Создать объект подключения к базе данных
set dbBasket = server.createobject("adodb.connection")
' Создать набор записей
set rsBasket = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbBasket.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры для создания
' новой корзины у покупателя с заданным идентификатором
sql = "execute sp_CreateBasket " & session("idShopper")
' Выполнить команду SQL
set rsBasket = dbBasket.Execute(sql)
' Получить идентификатор корзины, сгенерированный при создании записи
idBasket = rsBasket("idBasket")

' Сохранить идентификатор корзины в сеансовой переменной
session("idBasket") = idBasket
else
Если корзина уже существует, необходимо проверить, присутствует ли заказанный товар в корзине. Нет смысла создавать в корзине несколько записей для одного товара; достаточно просто увеличить количество единиц в существующей записи.
Мы открываем подключение к базе данных и вызываем хранимую процедуру sp_CheckBasketItemQuantity, передавая ей идентификаторы товара и корзины.
Листинг 7.5. AddItem.asp (продолжение)
' Создать объект подключения к базе данных
set dbBasket = server.createobject("adodb.connection")
' Создать набор записей
set rsBasket = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbBasket.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры для проверки наличия товара в корзине.
' Идентификаторы проверяемого товара и корзины передаются в качестве параметров.
sql = "execute sp_CheckBasketItemQuantity " & _
idProduct & ", " & _
session("idBasket")
' Выполнить команду SQL
set rsBasket = dbBasket.Execute(sql)
Если возвращается пустой набор, значит данный товар в корзине отсутствует. В противном случае необходимо увеличить количество единиц товара в корзине на указанную величину.
Обновление выполняется при помощи хранимой процедуры sp_UpdateBasket -ItemsQuantity. При вызове процедуре передаются идентификаторы корзины и товара. Кроме того, передается новое количество единиц товара. Для этого мы читаем текущее количество, полученное из предыдущего запроса, и суммируем его с количеством единиц, указанным покупателем на странице Product.asp. Затем пользователь перенаправляется на страницу Basket.asр.
Листинг 7.6. AddItem.asp (продолжение)
' Проверить, присутствует ли товар в корзине

if rsbasket.eof = false then

' Если товар присутствует, вместо добавления новой позиции
' следует обновить количество единиц в существующей записи.
sql = "execute sp_UpdateBasketItemsQuantity " & _
session("idBasket") & ", " & _
intQuantity + rsBasket("intQuantity") & ", " & _
idProduct
' Выполнить команду SQL
set rsBasket = dbBasket.Execute(sql)

' Перейти к выводу содержимого корзины
Response.Redirect "basket.asp"

end if
end if
Если товар отсутствует в корзине, значит в таблицу BasketItems следует добавить новую запись. Для добавления новой позиции в корзину используется хранимая процедура sp_InsertBasketItem.
При ее вызове передаются все основные параметры, включая идентификатор корзины, количество единиц, цену, название и идентификатор товара, размер и цвет. После создания новой позиции покупатель направляется на страницу Basket.asp.
ПРИМЕЧАНИЕ
Многие из наших товаров не обладают атрибутами размера и цвета. Если эти атрибуты не существуют, Request не возвращает никакой информации, и соответствующие поля в базе данных остаются пустыми.

Листинг 7.7. AddItem.asp (продолжение)
' Создать объект подключения к базе данных
set dbBasketItem = server.createobject("adodb.connection")
' Создать набор записей
set rsBasketItem = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbBasketItem.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры для вставки новой позиции в корзину
sql = "execute sp_InsertBasketItem " & _
session("idBasket") & ", " & _
intQuantity & ", " & _
intPrice & ", '" & _
chrName & "', " & _
idProduct & ", '"& _
chrSize & "', '" & _
chrColor & "'"
' Выполнить команду SQL
set rsBasketItem = dbBasketItem.Execute(sql)
' Send the user to the basket page
Response.Redirect "basket.asp"
%>
Отправить пользователя на страницу вывода содержимого корзины Response.Redirect "basket.asp"
Хранимая процедура sp_InsertBasketItem добавляет в корзину новую позицию. Вся необходимая информация передается при вызове процедуры.
Листинг 7.8. Хранимая процедура sp_InsertBasketItem
/* Stored procedure to insert a new basket
item */
CREATE PROCEDURE sp_InsertBasketItem
/* При вызове процедуре передается идентификатор корзины, количество единиц товара, .цена, название товара, идентификатор товара, размер , и цвет */
@idBasket int,
@intQuantity int,
@intPrice int,
@chrName varchar(255),
@idProduct int,
@chrSize varchar(50),
@chrColor varchar(50)
AS
/* Создать запись в таблице */
insert into basketitem(idBasket, intQuantity,
intPrice, chrName,
idProduct, chrSize,
chrColor)
values(@idBasket, @intQuantity,
@intPrice, @chrName,
@idProduct, @chrSize,
@chrColor)
Хранимая процедура sp_CreateBasket создает новую корзину для заданного покупателя. Это происходит, когда в базу данных заносится информация о новом покупателе или когда существующий покупатель оформил заказы на все существующие корзины.
В качестве параметра хранимой процедуре передается идентификатор покупателя. Затем команда INSERT добавляет запись корзины в базу данных. Процедура возвращает идентификатор корзины при помощи переменной @@Identity, которой присваивается последнее значение столбца-счетчика, возвращенное при вызове INSERT.

Листинг 7.9. Хранимая процедура sp_CreateBasket
/* При вызове процедуре передается идентификатор покупателя,
которому будет принадлежать данная корзина */
CREATE PROCEDURE sp_CreateBasket
/* Создать в таблице новую запись и присвоить значение идентификатору покупателя */
@idShopper int
AS
/* Insert a new role into the basket and
set the shopper ID
*/
insert into basket(idShopper) values(@idShopper)
/* Retrieve the ID of the basket which will be in the
@@identity variable value
*/
select idbasket = @@identity
Хранимая процедура sp_CheckBasket ItemQuantity возвращает количество единиц заданного товара в заданной корзине.
Листинг 7.10. Хранимая процедура sp_CheckBasketItemQuantity
/* Checks the quantity of items in the basket for
the specified product.
*/
CREATE PROCEDURE sp_CheckBasketItemQuantity
/* Pass in the ID of the product and
the ID of the basket
*/
@idProduct int,
@idBasket int
AS
/* Retrieve the quantity value */
select intQuantity from basketitem
where idProduct = @idProduct and
idBasket = @idBasket
Хранимая процедура spUpdateBasketItemsQuantity обновляет количество единиц заданного товара в корзине новым значением, переданным в качестве параметра. Нужная запись определяется идентификатором корзины и идентификатором товара.
Листинг 7.11. Хранимая процедура sp_UpdateBasketItemsQuantity
/* Stored procedure to update the
basket item quantity. */
CREATE PROCEDURE sp_UpdateBasketItemsQuantity
/* Pass in the ID of the basket, the quantity
and the ID of the product (basket item). */
@idBasket int,
@intQuantity int,
@idProduct int
as
/* Update the basketitem table wit the new
quantity for the product. */
update basketitem set intQuantity = @intQuantity
where idBasket = @idbasket and
idProduct = @idProduct
Страница с информацией о товаре Joe Bob's Thimble Sounds. Если щелкнуть на кнопке Order, товар включается в корзину.
Обратите внимание: в корзине находится 1 единица товара, поскольку именно это количество было указано при добавлении товара.
Как выглядит корзина после повторного включения того же товара? На этот раз мы добавили в корзину 3 единицы. Поскольку товар уже присутствовал в корзине, вместо добавления новой записи количество единиц в существующей позиции обновляется до общего количества 4.
Познакомившись с работой корзины, мы переходим к рассмотрению ее программного кода.
Вывод корзины
Корзина представляет собой список позиций, которые необходимо вывести на странице. Страница начинается со стандартного включения файла Header.asp, после чего начинается форма, предназначенная для обновления количества единиц прямо на странице. Начало страницы Basket.asp показано в листинге 7.12.
Листинг 7.12. Basket.asp
<%@ Language=VBScript %>
<HTML>
<!--
Basket.asp - вывод содержимого корзины.
-->
<!-- #include file="include/header.asp" -->
<!-- Форма позволяет обновлять количество единиц
товара непосредственно в окне корзины -->
<form method="post" action="UpdateBasket.asp">
Как и на странице AddItem.asp, необходимо проверить, была ли создана корзина у текущего пользователя. Если корзина отсутствует, мы создаем в базе данных новую корзину при помощи хранимой процедуры sp_CreateBasket.
Листинг 7.13. Basket.asp (продолжение)
<%
' Check to see if the ID of the basket is blank
if session("idBasket") = "" then
' Create an ADO database connection
set dbBasket = server.createobject("adodb.connection")
' Create a record set
set rsBasket = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbBasket.open("filedsn=WildWillieCDs")
' Create a new shopping basket
sql = "execute sp_CreateBasket " & session("idShopper")
' Execute the SQL statement
set rsBasket = dbBasket.Execute(sql)
' Retrieve the id of the basket returned from the insert
idBasket = rsBasket("idBasket")

' Set the basket id in the session variable
session("idBasket") = idBasket
end if
Переходим к чтению содержимого текущей корзины. Хранимая процедура sp_RetrieveBasketItem читает записи всех позиции активной корзины текущего покупателя.
Листинг 7.14. Basket.asp (продолжение)
' Create an ADO database connection
set dbBasketItem = server.createobject("adodb.connection")
' Create a record set
set rsBasketItem = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbBasketItem.open("filedsn=WildWillieCDs")
' Execute the stored procedure to retrieve the basket
' items for the shopper.
sql = "execute sp_RetrieveBasketItem " & session("idBasket")
' Execute the SQL statement
set rsBasketItem = dbBasketItem.Execute(sql)
Если корзина пуста, для покупателя выводится соответствующее сообщение. При наличии товаров в корзине можно переходить к перебору и выводу.
Листинг 7.15. Basket.asp (продолжение)
' Check to ensure a basket has been created and that
' there are items in the basket
if session("idBasket") = "" or rsBasketItem.EOF = true then
%>
<!-- Show the empty basket message -->
<center>
<BR><BR>
<font size="4">Your basket is empty.</font>
</center>
<%
else
ПЕРЕМЕЩЕНИЕ ПО ЭЛЕКТРОННОМУ МАГАЗИНУ
Мы построили базовую структуру, при помощи которой пользователь может перемещаться между корзиной, разделами, страницами поиска и оформления заказа.
Обратная ссылка на раздел, находящаяся на странице с содержимым корзины, создается для удобства покупателя. В настоящем магазине никто не заставляет покупателя относить товар в корзину, а затем через весь магазин возвращаться обратно в отдел. Таким образом, ссылка упрощает продолжение закупок.
В процессе перемещения используются и другие средства, которые также стоит учитывать. Во многих магазинах на странице товара существуют кнопки перебора товаров в прямом и обратном направлении без перехода на страницу разделов.
Также можно рассмотреть возможность продажи товаров в группах. Например, при продаже постельного белья покупатель нередко приобретает весь комплект (наволочки, простыни и т. д.) В этом случае создаются специальные шаблоны, позволяющие просмотреть несколько товаров на одной странице и приобрести их все вместе.
Хорошо продуманная система перемещения должна обеспечивать максимум удобств для покупателя в процессе перехода между страницами сайта. Иногда требования к системе перемещения определяются типом продаваемых товаров, но многие из описанных принципов достаточно универсальны.
Прежде чем входить в цикл, мы создаем ссылку на раздел, в котором был заказан последний товар. Вспомните - на странице Products.asp мы создали сеансовую переменную для хранения идентификатора последнего раздела.
В нашем случае мы проверяем, было ли присвоено значение переменной LastIDDept. Если значение - не пустая строка, мы создаем ссылку для ускоренного возвращения к последнему разделу, в котором покупатель заказывал товары.
Листинг 7.16. Basket.asp (продолжение)
' Check to see if the last department is set
' based on where they ordered from.
if session("LastIDDept") <> "" then

%>
<!-- Show the link to go back to the department to
make navigation easier.
-->
<BR>
Click <a href="products.asp?idDept=<%=session("LastIDDept")%>">
here</a> to continue shopping.
<BR><BR>
<%end if%>
Затем на странице создается таблица для вывода содержимого корзины. В первой строке таблицы выводятся названия столбцов данных, отображаемых в корзине.
Листинг 7.17. Basket.asp (продолжение)
<!-- Build the basket table -->
<table border="0" cellpadding="3" cellspacing="2" width="500">
<!-- Build the header row -->
<tr>
<th>Item Code</th>
<th>Name</th>
<th>Attributes</th>
<th>Quantity</th>
<th>Price</th>
<th>Total</th>
<th>Remove</th>
</tr>
Далее мы в цикле перебираем все позиции корзины. При каждой итерации выводится идентификатор товара, его название и атрибуты. Далее выводится количество единиц товара, заказанное до настоящего момента.
При выводе количества единиц атрибуту VALUE текстового поля присваивается идентификатор товара. Это сделано для того, чтобы на странице обновления корзины можно было определить, для какого товара покупатель изменяет количество единиц.
Вслед за количеством выводится цена одной единицы товара и стоимость всей позиции в целом. Как говорилось выше, цены хранятся в базе данных в целочисленном формате. Для правильного вывода цены необходимо разделить значение поля на 100, чтобы вывести дробную часть. Форматирование цены с добавлением символа доллара и т. д. осуществляется функцией FormatCurrency. Стоимость позиции вычисляется умножением количества единиц на цену товара.
Наконец, на форме строится ссылка для удаления текущей позиции из корзины. В нашем примере ссылка указывает на страницу DeleteItem.asp. В URL передается идентификатор товара, удаляемого из корзины.
При каждой итерации стоимость текущей позиции прибавляется к накапливаемой сумме. Полученная общая стоимость выводится после всех позиций корзины. В конце цикла происходит переход к следующей записи, и цикл повторяется для следующего товара.
Листинг 7.18. Basket.asp (продолжение)
<%
' Loop through the basket items.
do until rsBasketItem.EOF
%>
<!-- Show the row -->
<tr>
<!-- Show the product id -->
<td align="center"><%=rsBasketItem("idProduct")%></td>
<!-- Show the product name -->
<td><%=rsBasketItem("chrName")%></td>
<!-- Show the product attributes -->
<td>
<% if rsBasketItem("chrColor") <> " " then %>
<%=rsBasketItem("chrSize")%>,
<%=rsBasketItem("chrColor")%>
<% end if %>
</td>
<!-- Show the product quantity -->
<td align="center">
<input type="text" value="<%=rsBasketItem("intQuantity")%>"
name="<%=rsBasketItem("idProduct")%>" size="2">
</td>
<!-- Show the product price -->
<td><%=formatcurrency(rsBasketItem("intPrice")/100, 2)%></td>

<!-- Show the product total cost -->
<td>
<%=formatcurrency(rsBasketItem("intPrice")/100 * rsBasketitem("intQuantity"), 2)%>
</td>
<!-- Show the remove option. -->
<td>
<a href="deleteitem.asp?idBasketItem=<%=rsBasketItem("idBasketItem")%>">
Remove</a>
</td>
<!-- Continue to calculate the subtotal -->
<% subtotal = subtotal + (rsBasketItem("intPrice") * rsBasketitem("intQuantity")) %>

</tr>
<%
' Move to the next row
rsBasketItem.MoveNext
' Loop back
loop
%>
После всех позиций корзины выводится общая стоимость заказа. В таблице создается пустая строка с разделительной чертой, а в следующей строке выводится общая стоимость, выровненная по столбцу стоимости текущей позиции.
Листинг 7.19. Basket.asp (продолжение)
<!-- Build a break -->
<tr>
<td colspan="7"><HR></td>
</tr>
<!-- Show the sub total of the basket -->
<tr>
<td colspan="5" align="right"><b>Subtotal:</b></td>
<td><% = formatcurrency(subtotal/100, 2) %></td>
<td>&nbsp;</td>
</tr>
</table>
СОВЕТ
Чтобы интерфейс выглядел более последовательным, кнопку отправки данных и текстовые ссылки можно заменить графическими изображениями.

Кнопка Update Basket вносит в корзину все изменения в количестве заказанных единиц товара. Вслед за кнопкой выводятся ссылки на страницы Empty-Basket.asp и Shipping.asp. Страница завершается включением файла Footer.asp и закрывающими тегами.

Листинг 7.20. Basket.asp (продолжение)
<!-- Show the submit button for the quantity update action -->
<table width="100%">
<td><input type="submit" value="Update Basket" name="Submit"></td>
</form>
<!-- Show the empty basket and check out links -->
<td><a href="emptybasket.asp">Empty Basket</a></td>
<td><a href="shipping.asp">Check Out</a></td>
</tr>
</table>
<% end if %>
<!-- #include file="include/footer.asp" -->
</BODY>
</HTML>
На рис. 7.5 изображена корзина, состоящая из нескольких позиций. Обратите внимание на разное количество единиц и на вывод стоимости каждой позиции в столбце Total. В нижней части страницы выводится общая стоимость всей корзины. Также обратите внимание на ссылку Click here to continue shopping - она возвращает покупателя к последнему разделу, в котором он производил покупки.
ПРИМЕЧАНИЕ
В корзине выводится только общая стоимость корзины. Налоги и расходы на доставку вычисляются в процессе оформления заказа. Если в вашем магазине доставка обходится дороже обычного или действуют особые налоговые условия, возможно, эти затраты следует отображать на уровне корзины, однако для их вычисления покупатель обычно должен ввести по крайней мере почтовый индекс места доставки и/или выписки счета.
 
Итак, мы разобрались с выводом корзины и создали все ссылки, при помощи которых покупатель выполняет операции с корзиной.
Операции с корзиной
Наш покупатель получил возможность добавлять новые позиции в корзину и просматривать ее текущее содержимое. Перейдем к средствам управления корзиной - страницам UpdateBasket.asp, DeleteItem.asp и EmptyBasket.asp.
Обновление корзины
Первая страница, UpdateBasket.asp, не выводит никаких данных. Она обрабатывает запросы на обновление позиций заказа. В самом начале своей работы страница открывает подключение к базе данных.
Установив связь с базой, мы читаем содержимое корзины текущего покупателя. Страница в цикле перебирает позиции корзины и обновляет запись каждого товара. Второй набор записей обеспечивает подключение к базе данных для обновления корзины. Код страницы UpdateBasket.asp приведен в листинге 7.21.
Листинг 7.21. UpdateBasket.asp
<%@ Language=VBScript %>
<%
' ****************************************************
' страница читает новые количества единиц для каждой позиции
' корзины и вносит соответствующие изменения в базу данных.
' ****************************************************
' Создать объект подключения к базе данных
set dbBasketItem = server.createobject("adodb.connection")
' Создать набор записей
set rsBasketItem = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbBasketItem.open("filedsn=WildWillieCDs")
' Прочитать содержимое корзины
sql = "execute sp_RetrieveBasketItem " & session("idBasket")
' Выполнить команду SQL
set rsBasketItem = dbBasketItem.Execute(sql)
' Создать объект подключения к базе данных
set dbUpdateItem = server.createobject("adodb.connection")
' Создать набор записей
set rsUpdateItem = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbUpdateItem.open("filedsn=WildWillieCDs")
' В цикле перебирать позиции корзины
do until rsBasketItem.EOF
При каждой итерации мы получаем количество единиц в текущей позиции, определяемой идентификатором товара из открытого набора записей. Как упоминалось выше, атрибут VALUE каждого текстового поля Quantity на странице Basket.asp содержит идентификатор товара. Таким образом, при вызове Request мы должны передать идентификатор товара, обрабатываемого в текущей итерации.
Хранимая процедура sp_UpdateBasketItemQuantity обновляет запись новым количеством единиц. Обратите внимание: в качестве параметров хранимой процедуре передаются идентификаторы корзины и товара.
После завершения цикла покупатель отправляется на страницу Basket.asp. На этой странице выводятся новые количества единиц товаров, а также новые стоимости по всем позициям и новая общая стоимость.
Листинг 7.22. UpdateBasket.asp (продолжение)
' Retrieve the quantity. We use the ID of the
' basket item from the database to retrieve the
' datan from the correct input box.
intQuantity = request(cstr(rsBasketItem("idProduct")))
' Call the stored procedure to update the quantity
sql = "execute sp_UpdateBasketItemsQuantity " & _
session("idBasket") & ", " & intQuantity & ", " & _
rsBasketItem("idProduct")
' Execute the SQL statement
set rsUpdateItem = dbUpdateItem.Execute(sql)
' Move to the next item
rsBasketItem.MoveNext
loop
' Send the user to the basket page
Response.Redirect "basket.asp"
%>
Хранимая процедура sp_RetrieveBasketItem используется для чтения содержимого заданной корзины из базы данных. Идентификатор корзины передается при вызове процедуры в качестве параметра.
Листинг 7.23. Хранимая процедура sp_RetrieveBasketItem
/* Загрузка содержимого корзины из базы данных */
CREATE PROCEDURE sp_RetrieveBasketItem
/* При вызове процедуре передается идентификатор корзины */
@idBasket int
AS
/* Выборка записей, относящихся к заданной корзине */
select * from basketitem where idBasket = @idBasket
Примерный вид страницы корзины. В корзину входит два товара, Circle Sax и Joe Bob's Thimble Sounds. Первый товар приобретается в количестве 6 единиц, а второй - в количестве 9 единиц. Давайте изменим количество единиц каждого товара на 3.
Обновленная корзина. Обратите внимание - изменилось не только количество единиц, но и стоимость по каждой позиции, а также общая стоимость всей корзины.
Удаление товаров из корзины
Следующая страница также не выводит данных для пользователя. Она предназначена для обработки запросов на удаление позиций из корзины. В начале своей работы страница открывает подключение к базе данных, используемое в дальнейшем для удаления записи. Задача решается страницей Deleteltem.asp, приведенной в листинге 7.24.
Листинг 7.24. DeleteItem.asp
<%@ Language=VBScript %>
<%
' ****************************************************
' DeleteItem.asp - удаление заданной позиции из корзины.
' ****************************************************
' Создать подключение ADO к базе данных
set dbBasketItem = server.createobject("adodb.connection")
' Создать набор записей
set rsBasketItem = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbBasketItem.open("filedsn=WildWillieCDs")
Идентификатор товара, удаляемого из корзины, включается в URL страницы. При вызове хранимой процедуры sp_RemoveBasketItem передаются идентификаторы корзины и позиции. После выполнения процедуры покупатель возвращается на страницу Basket.asp.
Листинг 7.25. DeleteItem.asp (продолжение)
' Call the delete item SQL statement and
' pass in the ID of the basket and the id of
' the item.
sql = "execute sp_RemoveBasketItem " & session("idBasket") & _
", " & request("idBasketItem")
' Execute the SQL statement
set rsBasketItem = dbBasketItem.Execute(sql)
' Send the user back to the baket page
Response.Redirect "Basket.asp"
%>
Хранимая процедура sp_RemoveBasketItem удаляет из таблицы запись указанной позиции. Параметры корзины и позиции передаются в качестве параметров. Удаление записей осуществляется командой SQL DELETE.
Листинг 7.26. Хранимая процедура sp_RemoveBasketItem
/* Удаление позиций из корзины */
CREATE PROCEDURE sp_RemoveBasketItem
/* При вызове процедуре передаются идентификаторы корзины и удаляемой позиции */
@idBasket int,
@idBasketItem int
AS
/* Удаление позиции из базы данных */
delete from basketitem
where idBasket = @idBasket and
idBasketItem = @idBasketItem
Чтобы проверить новую возможность, попробуйте создать корзину, состоящую из 5 позиций. Щелкните на ссылке Remove рядом с товаром Т-Shirt Rip.
Корзина после удаления позиции. Обратите внимание: общая стоимость корзины изменилась, а оставшаяся часть корзины осталась без изменений.
Последняя функциональная возможность, рассматриваемая в этой главе - очистка корзины на странице EmptyBasket.asp.
Очистка корзины
Наконец, покупатель должен иметь возможность полностью очистить корзину. Начало программного кода страницы EmptyBasket.asp приведено в листинге 7.27. Конечно, мы надеемся, что покупателю эта возможность не понадобится, однако сознание того, что все отобранные товары можно в любой момент убрать из корзины и отказаться от покупки, придаст ему уверенности.
Работа страницы начинается с открытия базы данных. При вызове этой странице не передаются никакие параметры. Все, что необходимо знать - идентификатор корзины. Страница вызывает хранимую процедуру sp_ClearBasketItems и передает ей идентификатор корзины. После этого покупатель направляется на страницу Basket.asр.
Листинг 7.27. EmptyBasket.asp
<%@ Language=VBScript %>
<%
' ****************************************************
' EmptyBasket.asp - очистка корзины
' ****************************************************
' Создать объект подключения к базе данных
set dbBasketItem = server.createobject("adodb.connection")
' Создать набор записей
set rsBasketItem = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbBasketItem.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры для очистки корзины
sql = "execute sp_ClearBasketItems " & session("idBasket")
' Выполнить команду SQL
set rsBasketItem = dbBasketItem.Execute(sql)
' Направить пользователя на страницу Basket
Response.Redirect "basket.asp"
%>
Хранимая процедура sp_ClearBasketItems получает идентификатор корзины и выполняет команду удаления всех позиций заданной корзины.
Листинг 7.28. Хранимая процедура sp_ClearBasketItems
/* Clear the items in the basket */
CREATE PROCEDURE sp_ClearBasketItems
/* Pass in the ID of the basket */
@idBasket int
AS
/* Delete all items in the specified basket */
delete from basketitem where idBasket = @idBasket
Итоги
В предыдущей главе были описаны основные средства просмотра разделов и товаров, а также выполнения поиска. При входе в магазин покупатель уделяет основное внимание именно этим средствам.
В этой главе мы рассмотрели корзину и ее роль в процессе электронной коммерции. Корзина является одним из ключевых компонентов процесса электронной коммерции. С ее помощью покупатель отбирает интересующие его товары и управляет окончательным составом заказа.
Следующая глава посвящена процессу оформления заказов, следующему за выбором приобретаемых товаров. Мы рассмотрим вопросы проверки данных, вычисления расходов на доставку и налогов, а также процедуру отслеживания состояния заказа.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика