<% 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="&lt;=">&lt;=</option>  
      <option value="&gt;=">&gt;=</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


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует