<% ASP на блюдечке %>. Часть 7
Oтправка заказа по e-mail (файл Done.asp)
После того как все действия выполнены успешно, необходимо сформировать электронное письмо, которое одновременно должно быть послано как гипотетическому менеджеру по продажам или доставке нашего виртуального магазина, так и самому пользователю в подтверждение выполненного заказа. Для этого воспользуемся стандартной ActiveX компонентой CDONTS:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Виртуальный магазин</title>
</head>
<body bgcolor="#006767" text="#FFFFFF" link="#FFFF00" vlink="#FFFF00">
<table width="780" border="0" cellspacing="0" cellpadding="0">
<tr><td>
<div align="center">
<%
Name = Request.QueryString("Name")
Phone = Request.QueryString("Phone")
Address = Request.QueryString("Address")
Email = Request.QueryString("Email")
UIN = Request.QueryString("UIN")
Dim myMail
Set myMail = CreateObject("CDONTS.NewMail")
myMail.From = Email
myMail.To = "rouben@iname.com"
myMail.Subject = "Order from" & Name
Body = Body & "Уважаемый " & Name & "!" & CHR(13) & CHR(10)
Body = Body & "Имя: " & Name & CHR(13) & CHR(10)
Body = Body & "Телефон: " & Phone & CHR(13) & CHR(10)
Body = Body & "Адрес: " & Address & CHR(13) & CHR(10)
Body = Body & "E-mail: " & Email & CHR(13) & CHR(10)
Body = Body & "UIN: " & UIN & CHR(13) & CHR(10) & CHR(13) & CHR(10)
Body = Body & "Вы заказали:"
I = 1
Total = CDbl(0)
ComponentCount = Session("ComponentCount")
'Если это не корзина, то будем осуществлять обработку обычным способом
If (Request.QueryString ("Cart") <> 1) Then
Do While I <= ComponentCount
Body = Body & CHR(13) & CHR(10) & I & ". "
Str = "select"
Str = Str & CStr(I)
Res = Request.QueryString(Str)
Body = Body & " - " & Res & " - "
Str = "quant"
Str = Str & CStr(I)
Res1 = Request.QueryString(Str)
Body = Body & Res1 & " - "
I = I + 1
Loop
' В противном случае произведем добавление к телу электронного письма
' сессионной переменной с содержимым корзины
Else
CartVal = Session ("Cart")
Body = Body & CartVal
End If
D = Date()
D = FormatDateTime(D,1)
Body = Body & CHR(13) & CHR(10)
Body = Body & "Отправленно:" & D
Body = Body & CHR(13) & CHR(10)
Body = Body & "Итого с Вас: " & Total & " у.е." & CHR(13) & CHR(10) & CHR(13) & CHR(10)
Body = Body & "Наши менеджеры свяжутся с Вами в ближайшее время по оставленным Вами координатам."
Body = Body & CHR(13) & CHR(10) & "С наилучшими пожеланиями" & CHR(13) & CHR(10)
Body = Body & "Сервер 'Виртуального магазина'"
myMail.Body = Body
'Response.Write Body
On Error Resume Next
myMail.Send
If Err <> 0 Then
Response.Write "Error encountered: " & Err.Description
End If
Response.Write "<center><p>Уважаемый " & Name & "!<br>"
Response.Write "Ваш заказ был успешно отправлен на сервер Виртуального магазина.<br>"
Response.Write "Спасибо!</p></center>"
%>
</div>
</td></tr></table>
</body>
</html>
Еще о вариациях
Несколько слов о поиске
Разумеется, ни один мало-мальски солидный Интернет-магазин не обходится без такого важного инструментария, как поиск позиций. Здесь возникает целая куча вопросов о том, что, где, как и по каким критериям искать. Скажем сразу, что однозначно ответить на все эти вопросы невозможно, поскольку это зависит от специфики поставляемых товаров или услуг и «заточено» под конкретные коммерческие цели, преследуемые теми или иными организаторами Интернет-торговли. Однако осмелимся предложить возможное решение, основанное с инструментальной точки зрения на результатах просмотра многочисленных Интернет-магазинов самого широкого спектра товаров. Для простоты дальнейшего изложения рассмотрим пример, связанный с нашим магазином.
Прежде всего необходимо организовать форму поиска по ключевым словам (по подстроке) в наименованиях позиций, причем как по всем категориям (по всей базе данных), так и по заданной (следовательно, нужно предусмотреть компонент выбора категории поиска). Кроме того, стоит предусмотреть возможность поиска товаров и по ценовым критериям, например искать все товары, цена которых меньше определенного заданного значения. Совокупность этих критериев и будет определять результаты поиска. Итак, для начала создадим форму поиска, удовлетворяющую описанным выше критериям (см. рисунок):
Как видите, форма попросту добавлена в файл страницы списка позиций заданной категории List.asp. Сделано это простым добавлением строки в начало файла List.asp:
<!--#include file="SearchForm.asp" -->
Сама же форма (как явствует из ссылки на соответствующий файл) представлена в файле SearchForm.asp следующим образом:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Виртуальный магазин</title>
</head>
<body bgcolor="#006767" text="#FFFFFF" link="#FFFF00" vlink="#FFFF00">
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Open "DSN=ISHop; UID=sa;PWD=;database= ISHop"
SQLQuery = "SELECT * FROM _Components ORDER BY CategoryName ASC"
Set rs = db.Execute(SQLQuery)
%>
<form name="SearchForm" method="get" action="Search.asp">
<p> Искать:
<input type="text" name="SearchString" size="15" maxlength="15">
в категории:
<select style="WIDTH: 140px" name="CategorySel">
<option value="AllCategories">Во всех</option>
<%
Do While NOT rs.EOF
Response.Write "<option value='" & rs.Fields("CategoryTableName").value & _
"'>" & rs.Fields("CategoryName").value & "</option>"
rs.MoveNext
Loop
%>
</select>
цена:
<select name="BounderSel">
<option value="AnyPrice"></option>
<option value="<="><=</option>
<option value=">=">>=</option>
</select>
<input type="text" name="PriceBound" size="3" maxlength="4">
<input type="submit" name="Submit" value="Поиск">
</p>
</form>
<%
db.Close
Set db = Nothing
%>
</body>
</html>
Здесь в качестве обработчика формы указана страничка Search.asp, по сути являющаяся модификацией файла List.asp для случая формирования списка позиций не из одной, а из нескольких таблиц, согласно введенным критериям запроса. Приведем фрагмент кода странички Search.asp, отвечающий за формирование запросов к базе данных, исходя из состояния полей нашей поисковой формы:
<%
…
SearchString = Request.QueryString("SearchString")
CategorySel = Request.QueryString("CategorySel")
BounderSel = Request.QueryString("BounderSel")
PriceBound = Request.QueryString("PriceBound")
…
If SearchString = "" Then
If (BounderSel = "AnyPrice" OR PriceBound = "" ) Then
SQLQuery = "Select * From " & TN & " WHERE Title <> 'Выберите позицию' ORDER BY Title ASC"
Else
SQLQuery = "Select * From " & TN & " WHERE Title <> 'Выберите позицию'" &_
" AND Price1 " & BounderSel & PriceBound & " ORDER BY Title ASC"
End If
Else
If (BounderSel = "AnyPrice" OR PriceBound = "" ) Then
SQLQuery = "Select * From " & TN & " WHERE Title <> 'Выберите позицию'" &_
" AND Title LIKE '%" & SearchString & "%' ORDER BY Title ASC"
Else
SQLQuery = "Select * From " & TN & " WHERE Title <> 'Выберите позицию'” &_
” AND Title LIKE '%" & SearchString & _
"%' AND Price1 " & BounderSel & PriceBound & " ORDER BY Title ASC"
End If
End If
…
%>
Как видите, после считывания значений полей нашего поискового компонента в переменные, производится анализ пользовательского ввода и формируется строка запроса к базе данных исходя из введенных значений.
Единственным существенным отличием от файла и странички List.asp является то, что поиск может быть осуществлен по всем таблицам данных, для этого:
<%
…
'Если пользователь запустил поиск по всем категориям, т.е. таблицам
If (CategorySel = "AllCategories") Then
SQLQuery = "Select * From _Components"
Set res = db.Execute(SQLQuery)
Do While NOT res.EOF
CurTableName = res.Fields("CategoryTableName").value
'Функция показа содержимого текущей таблицы
FetchFromTable CurTableName
res.MoveNext
Loop
'В противном случае (поиск только по одной таблице)
Else
FetchFromTable CategorySel
End If
…
%>
Таким образом, сделав несколько изменений и слегка переработав страничку показа списка позиций заданной категории List.asp, можно получить страничку вывода результатов поиска Search.asp (предлагаем вам проделать это самостоятельно).
Проверка пользовательского ввода
В завершение хотелось бы рассмотреть несколько полезных JavaScript-сценариев для проверки корректности ввода информации о пользователе и всевозможных типов данных. В связи с тем, что наблюдается определенный дефицит таких функций, была разработана библиотека сценариев, использование которых позволило облегчить задачу обработки пользовательского ввода. Для удобства все функции сгруппированы в один файл (script.js):
…
Проверка целого значения
…
function isInteger (s,message){
// s is a string
// message – строка с сообщением об ошибке
var i;
for (i = 0; i < s.length; i++){
// Убедимся, что текущий символ является цифрой
var c = s.charAt(i);
if (!isDigit(c)) {
alert(message);
return false;
}
}
return true;
}
…
Проверка цифры
…
function isDigit (c) {
// c – символ
return ((c >= "0") && (c <= "9"))
}
…
Преобразование строки в число с отбрасыванием посторонних символов
…
function numericize(s) {
// s – строка
// message – строка с сообщением об ошибке
var i,j;
j="";
for (i=0;i<s.length;i++) {
if (isDigit(s.charAt(i))){
j=j+s.charAt(i);
}
}
return j;
}
…
Проверка «пустоты» введенного значения
…
function isBlank (s,message) {
// s – рассматриваемый элемент формы
// message – строка с сообщением об ошибке
if ((s.value.length > 0) && (s.value != null) && (s.value != "")){
return false;
}
alert(message);
s.focus();
return true;
}
…
Проверка номера телефона
…
function isPhone (s,message) {
// s – рассматриваемый элемент формы
// message – строка с сообщением об ошибке
// Удалим символы, не являющиеся цифрами, и вычислим длину полученной строки
if (s.value.length > 10) {
s.value = numericize(s.value);
}
//По крайней мере 3 цифры – код города и 7 цифр — номер телефона
if (s.value.length == 10) {
if (isInteger(s.value,message)) {
return true;
}
else {
s.focus();
return false;
}
}
else {
alert(message);
s.focus();
return false;
}
return true;
}
…
Проверка адреса электронной почты
…
function isEmail (s,message) {
// s – рассматриваемый элемент формы
// message – строка с сообщением об ошибке
var i,ii;
var j;
var k,kk;
var jj;
var len;
// Пусто?
if (isBlank(s,message)) {
s.focus();
return false;
}
// Проверка адреса электронной почты
// Адрес должен содержать "@" и "."
// В строке адреса должен быть хотя бы 1 символ до символа "@"
// После символа "@" и перед символом "." должен быть хотя бы 1 символ
// после символа "." должно быть по крайней мере еще 2 символа
if (s.value.length >0) {
i =s.value.indexOf ("@");
ii=s.value.indexOf ("@",i+1);
j=s.value.indexOf (".",i);
k=s.value.indexOf (",");
kk=s.value.indexOf (" ");
jj=s.value.lastIndexOf (".")+1;
len=s.value.length;
if ((i>0) && (j>(1+1)) && (k==-1) && (ii==-1) && (kk==-1) &&
(len-jj >=2) && (len-jj<=3)) {}
else {
alert(message)
s.focus();
return false;
}
}
return true;
}
…
Проверка выбора значения из списка
…
function isSelected (s,message) {
// s – рассматриваемый элемент формы
// message – строка с сообщением об ошибке
// Проверяет список выбора на предмет изменения его значения
// по сравнению со значением, задаваемым по умолчанию
if (s.selectedIndex==0) {
alert(message);
s.focus();
return false;
}
return true;
}
Использовать данный файл крайне просто. Для этого в тэге объявления формы в качестве скрипта проверки необходимо указать определенную функцию, например:
… <Form Name="MainForm" ACTION="Process.asp" Method=Post onSubmit="return PreProcess();"> …
Далее следует включить вышеприведенный файл с библиотекой функций в разрабатываемое Web-приложение:
…
<Script Type = "text/javascript" Src = "script.js">
<!--
// В случае, если библиотека не найдена
document.write ("Библиотека JavaScript не найдена.");
//-->
</Script>
…
Определить функцию проверки, которая и будет осуществлять вызов необходимых функций нашей библиотеки:
<Script Tupe = "text/javascript">
function PreProcess()
{
var ok;
with (document.MainForm) {
// Пусто ли имя
if (isBlank(name,'Введите имя.')) {
return false;
}
// Проверка номера домашнего телефона
if (!isPhone (homephone,'Введите корректный номер домашнего телефона.')) {
return false;
}
// Проверка адреса электронной почты
if (!isEmail (email,'Пожалуйста, введите корректный адрес электронной почты.')) {
return false;
}
}
return true;
}
</Script>
Заключение
Как уже неоднократно было сказано выше, Интернет-магазинов великое множество. И если раньше они считались всего лишь игрушками, не позволяющими реально осуществлять ежедневные покупки всевозможных товаров, то теперь это серьезные системы, за которыми стоят не менее серьезные организации, профессионально занимающиеся бизнесом. В последнее время понятие Интернет-торговли перестало быть чем-то экзотическим, а возможность приобрести практически любой товар, не вставая из-за компьютера, стала поистине огромной.
Прежде чем приступать к созданию своего Интернет-магазина, советуем для начала «побродить»по чужим. Для ориентации читателей в мире отечественных Интернет-магазинов приведем список наиболее привлекательных из них:
MEGAShop - магазин компьютерной техники http://www.megashop.ru/index14.html
Kenga - магазин детских товаров и игрушек http://www.kenga.ru/toys_main.php3
24x7 - книги, видео, музыка, игрушки http://www.24x7.ru/
Каталог книжных магазинов зоны .ru http://www.findbook.h1.ru/
Korzina.ru - российская сеть магазинов с доставкой http://www.korzina.ru/
WebMarket.ru - http://www.webmarket.ru/
Торговый город - http://www.delo.omsknet.ru/shop/
Электронный торговый дом AVT - http://www.avt.ru/etd.shtml/
Полный архив исходных текстов ASP-страниц к настоящей статье лежит здесь.
КомпьютерПресс 4'2001








