<% 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