PHP: Полезные приемы
Автор: Антон Орлов, orlovs.pp.ru

  Главная   Учебник   Статьи   FAQ   Книги   Ссылки  

Глава 5

PHP: простейший Интернет-магазин

С помощью PHP можно легко сделать мини-Интернет-магазин - т.е. установить на сайт форму заказа, которая будет отправляться вам по электронной почте. При этом почтовая программа посетителя ис-пользоваться не будет - ему даже необязательно вообще ее иметь.

К примеру, такой "магазин" сделан на странице http://www.harchikov.ru/cass.php (рис.5.1). В этой главе рассказывается о его устройстве.


Рис.5.1. Реально действующий Интернет-магазин,

построенный по описанной в этой главе схеме.

Задачи

Что, собственно, должен делать Интернет-магазин? Пожалуй, следующее:

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

Собственно, на первое время этого и достаточно.

Проект

Из каких же компонентов web-магазин должен быть сделан?

Отобразить ассортимент из пары десятков товаров можно на одной web-странице. На ней же можно разместить "калькулятор" и форму ввода контактных данных.

Раздел страницы, относящийся к одному товару, должен быть снабжен чем-то, что могло бы позволить посетителю как-нибудь этот товар отметить. Для последнего лучше всего использовать выпадаю-щего списка (рис.5.2 - наподобие того, в котором устанавливается размер шрифта в Word): он заодно дает посетителю возможность вы-брать и количество товара для заказа. На HTML для отображения та-кого списка необходимо использовать элемент <select name="имя это-го элемента формы">, внутри которого размещены тэги <option...>, в которых и указаны те значения, что в меню отображаются. При от-правке формы странице-обработчику сценарию на ней передается пе-ременная с именем, равным имени элемента <select…> и значением, равным числу из параметра value того тэга <option…>, который был посетителем выбран.


Рис.5.2. Выпадающее меню.

Скажем, список на рис.5.2 может отображаться, например, кодом

<select name=spis>
<option value=45>Первый</option>
<option value=81>Второй</option>
<option value=31>Третий</option>
</select>

В зависимости от того, какой пункт списка будет выбран посетите-лем, сценарию-обработчику передастся в качестве значения перемен-ной $spis (и элемента массива $HTTP_POST_VARS['spis']) то число, которое находилось в параметре value тэга <option>, отображающего выбранный пункт.

Для ввода посетителем контактных данных можно использовать элемент <textarea...>, позволяющий помещать в себя достаточно длинные фрагменты текста на нескольких строках (например, почто-вый адрес), а для ввода адреса электронной почты - элемент типа text (он отображает однострочное поле для ввода текста), рис.5.3.


Рис.5.3. Виды полей ввода текста.

Форма, в которую посетитель внесет сведения о своем заказе и свои контактные данные, должна быть отправлена владельцу сайта. Для этого на странице, указанной в заглавии формы как ее обработ-чик, нужно разместить сценарий, собирающий значения всех элемен-тов формы в единую текстовую строку и отправляющий эту строку на e-mail владельца сайта. Последнее сделать можно командой PHP mail().

Итак, весь Интернет-магазин будет состоять из двух файлов: вит-рины и обработчика заказа. Однако практически все возможности для торговли будут иметься: и список товаров, и возможность указания вида и количества заказываемого товара.

"Калькулятор", о желательности которого упоминалось на преды-дущем шаге проектирования, можно сделать на Javascript. Программа должна отслеживать изменения в выпадающих списках, сверяться со списком цен и в соответствии с данными этого списка выводить посе-тителю сообщение о стоимости его заказа. Вывод сообщения лучше всего сделать с помощью средств Dynamic HTML, динамически изме-няя содержимое страницы.

Витрина

Итак, вот основное, что должно быть на первой странице Интер-нет-магазина. Весь дизайн, все оформление остается на ваше собст-венное усмотрение - важно лишь, чтобы на странице присутствовали перечисленные ниже элементы.

В начале страницы, после тэга <body>, но до каких-либо описаний товаров, должен находиться заголовок формы:

<FORM METHOD="post" ACTION="zakaz.php" NAME="mainform">

Допустим, что PHP-программа, обрабатывающая форму, находится в файле zakaz.php (и именно на эту страницу произойдет переход по-сле нажатия кнопки типа submit в форме). Не забудьте указать пара-метр name в заголовке формы - он потом пригодится для использова-ния в коде калькулятора стоимости заказа.

(Кстати, обратите внимание, что так как для передачи данных формы используется метод POST, а не GET, то при этом в адресной строке данные полей формы отображаться не будут.)

Ну, а внутри формы следует расположить коды выпадающих спи-сков - по одному на каждый товар (рис.5.4). В качестве значений па-раметров name удобнее всего использовать небольшие буквосочета-ния - коды товаров:

<select name="TOV1">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
...
<option value=10>10</option>
</select>

Обратите внимание, что первым по счету в выпадающем списке должно стоять значение 0 - именно оно будет отображаться по умол-чанию.


Рис.5.4. Реальный Интернет-магазин.

Поля заказа количества товара.

Также в форме должны присутствовать поля ввода контактной информации - см. на рис.5.1. Скажем, текстовая строка типа text с име-нем e-mail - для адреса электронной почты и поле ввода текста tex-tarea с именем contact - для ввода контактных данных (что сочтет нужным покупатель - имя, телефон, домашний адрес).

<input name="email" type="text">
<textarea name="contact" cols="30" rows="5" wrap="virtual"></textarea>

(В параметре cols тэга textarea указывается количество символов, которое должно помещаться в одну строку в поле ввода текста, в па-раметре rows - количество строк текста, которые можно будет вписать в поле ввода до появления полос прокрутки. Параметр wrap="virtual" разрешает автоматический перенос текста на следующие строки в по-ле ввода.)

Разумеется, в форме должна быть кнопка ее отправки

<input type=submit>

и закрывающий тэг формы

</form>

Отправка заказа

После оформления заказа и нажатия посетителем кнопки отправки формы произойдет переход на страницу, указанную в заголовке этой формы (в рассматриваемом сценарии - zakaz.php). Именно в этом файле содержится программа отправки заказа.

При передаче формы сценарию на PHP содержимое каждого элемента переданной формы (для поля ввода текста - введенный текст, для элемента <select...> - значение параметра value выбранного пункта <option>) помещается в переменную, имя которой равно значению параметра name данного элемента (Так происходит, если в файле php.ini установлен в on параметр register_globals). Кроме того, все эти значения по-мещаются в одноименные соответствующим значениям параметров name элементы массива $HTTP_POST_VARS (если форма передана методом POST) или $HTTP_GET_VARS (если форма передана мето-дом GET) (Так происходит, если в файле php.ini установлен в on параметр track_vars), а в PHP версии 4.1 и выше - еще и в массивы $_POST и $_GET соответственно. Например, значение элемента <select name="TOV1"> будет доступно сценариям на странице-обработчике в переменной $TOV1 и в элементе массива $HTTP_POST_VARS['TOV1'] (а в PHP версии 4.1 и старше - еще и в элементе массива $_POST['TOV1'].

Однако особенностью использования этих массивов в частности является то, что для присоединения значения любого их элемента к какой-либо строковой переменной нельзя просто поместить их внутрь текста строки - нужно использовать оператор сложения строк: точку. Скажем, написать

$zak="$zak $HTTP_POST_VARS['TOV1']";

нельзя - надо использовать формат

$zak="$zak ",$HTTP_POST_VARS['TOV1'];

Отправка письма осуществляется командой mail, как вы помните, имеющей формат

mail ("Кому", "Тема", "Текст сообщения", "Дополнительные заго-ловки");

При выполнении данной команды на сервере формируется элек-тронное письмо в соответствии с указанными параметрами и отправ-ляется с помощью установленной на сервере почтовой программы (Вы можете установить почтовый сервер и на своем компьютере - используйте, например, Office Mail Server Юрия Кучуры (доступен с http://eu3eu.chat.ru) или Courier Mail Server Романа Ругаленко (доступен с http://courierms.narod.ru)). В качестве параметра "Кому" может выступать набор адресов, разде-ленных запятыми.

"Дополнительные заголовки" могут быть любые из допустимых почтовыми протоколами, разделяться они должны комбинацией сим-волов /n, которая в PHP означает перевод строки. Если среди "Допол-нительных заголовков" не указано поле From, то оно заполняется по умолчанию, например, именем "Unprivileged User".

Для отправки письма с заказом необходимо приготовить его текст. Можно, конечно, просто включить в письмо значения всех перемен-ных с именами, равными кодам товара (то есть полученные из эле-ментов <select…>), и в конец добавить контактные данные посетите-ля. Но куда как лучше, чтобы владелец web-сайта получал не набор кодов, которые он еще должен по своим данным перевести в назва-ния, а уже готовый список заказанных посетителем товаров (рис.5.5). Для этого в текст сценария включим блок определения полного на-звания товара по его коду.


Рис.5.5. Письмо с заказом. Удобно читать - удобно выполнять.

Итак, в любом месте файла-обработчика формы, но лучше всего в начале, следует поместить следующий сценарий

<?php
$zak="";
(В эту переменную будем последовательно собирать названия зака-занных товаров.)
if ($TOV1>0){$zak="$zak Название товара 1 - $TOV1 шт.\n"; }
if ($TOV2>0){$zak="$zak Название товара 2 - $TOV2 шт.\n"; }
...

И такие же строчки - для каждого товара. В качестве имени пере-менной в условной части блока if ($...>0) указывается значение параметра name соответствующего тэга <select...>, а в последующих фигурных скобках - название того товара, к которому этот тэг отно-сился на странице-витрине. В результате в том случае, если посети-тель изменил значение какого-либо выпадающего списка на число, отличное от нуля, то в переменную $zak, которая впоследствии станет текстом отправляемого письма, включается название товара, соответ-ствующего этому выпадающему списку, и сведения о количестве его заказанных единиц - та величина, которая в конце концов и оказалась значением этого выпадающего списка.

Теперь завершим составление текста письма:

$zak="С адреса $email от заказчика с контактными данными $contact пришла заявка на приобретение то-вара:\n$zak";

и отправим письмо-заявку:

mail ("электронный адрес владельца сайта", "За-каз на товар", $zak, "From: $email\nReply-To: $email\nContent-Type: text/plain; charset=windows-1251");?>

В результате выполнения этой команды тот, кто обрабатывает за-казы, получит аккуратный список заказанных товаров и сведения о заказчике (см. на рис.5.5). Причем если посетитель правильно ввел свой e-mail, то для связи с ним после получения письма достаточно нажать кнопку "Ответить" или ей подобную в почтовом клиенте - этот e-mail подставляется в заголовок письма From:.

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

Сам же файл, в котором размещен код отправки письма, может со-держать, скажем, благодарность посетителю за заказ (как на сайте www.harchikov.ru - рис.5.6) или сведения о том, куда обращаться за информацией об этапе его выполнения. HTML-код страницы просто помещается вслед за окончанием сценария на PHP и выводится в браузер после окончания работы сценария.


Рис.5.6. Заказ сделан - можно уходить и ждать...

В приведенном сценарии вместо одноименных элементам формы переменных можно использовать и соответствующие элементы мас-сивов $HTTP_POST_VARS и (в PHP версии старше 4.1) $_POST. На-пример, строка добавления в текст заказа нового товара будет выгля-деть как

if ($HTTP_POST_VARS['TOV1']>0){$zak="$zak Назва-ние товара 1 - ".$HTTP_POST_VARS['TOV1']." шт.\n"; }

строка генерации письма - как

$zak="С адреса ".$HTTP_POST_VARS['email']." от заказчика с контактными данными ".$HTTP_POST_VARS['contact']." пришла заявка на приобретение товара:\n$zak";

и команда отправки письма - измененная по тому же принципу.

Калькулятор

Калькулятор для отображения на странице витрины информации о сумме заказа сделан на Javascript. Его текст приводится ниже. Но, так как книга посвящена PHP, а не Javascript, к его командам даны лишь минимально необходимые комментарии. Просто поместите код сце-нария в тексте web-страницы, набрав его с клавиатуры или отскани-ровав страницы книги.

В раздел <head> страницы с витриной следует поместить сценарий:

<SCRIPT LANGUAGE="JavaScript">
function calc()
{

В следующей строчке производится задание массива кодов това-ров, встречающихся на web-странице и подлежащих учету. В ней должны быть перечислены все встречающиеся на странице коды то-варов. Порядок перечисления кодов товаров не важен и не зависит от их порядка следования содержащих их элементов <select…> на самой странице.

tov=new Array("TOV1", "TOV2", "TOV3", "TOV4");

В другой такой же строчке перечисляются цены на эти товары точ-но в том порядке, в каком перечислялись коды товаров - на одних и тех же порядковых местах должны стоять код и цена, принадлежащие одному и тому же товару.

prc=new Array(100, 200, 300, 400);

Сценарий продолжается...

var kolvo=0;
var stoim=0;
for (n=0; n<tov.length; n++)
{
if (document.mainform(tov[n])!=null)
{
kolvo=kolvo+1*document.mainform(tov[n]).value;
stoim=prc[n]*document.mainform(tov[n]).value+stoim;
}
}
mess.innerHTML="Количество заказанных товаров - "+kolvo+"<br>"+"Стоимость заказанных товаров - "+stoim;
document.mainform("stoim").value=stoim;
document.mainform("kolvo").value=kolvo;
}
</SCRIPT>

Вкратце можно сказать, что этот сценарий при своем запуске про-сматривает значения всех элементов форм на web-странице, имеющих перечисленные в массиве tov имена (а, как вы помните, в этом масси-ве перечислены коды товаров: то есть элементы с этими именами - это соответствующие этим товарам выпадающие списки <select…>), и вычисляет сумму этих значений (общее число заказанных товаров) и сумму произведений этих значений на соответствующее каждому ко-ду число из массива prc - списка цен (т.е. считает общую сумму по-купки). Полученные значения помещаются в элементы web-страницы с именем mess (текстовое сообщение), stoim (стоимость заказа), kolvo (количество заказанных единиц товара).

В каждый тэг <select...>, присутствующий на странице и предна-значенный для заказа товара, добавьте команду, предписывающую браузеру выполнять сценарий calс при каждом изменении значения элемента, отображаемого этим тэгом:

<select name=TOV1 onchange=calс()>
<option value=0>0
...
</select>

В том месте страницы, где вы желаете отображать посетителю све-дения о заказе, поместите строчку с элементом <p> или <div>, имеющую идентификатор mess - тот же, что упоминался в сценарии (здесь надо использовать именно параметр id, а не name):

<p align=center id=mess>Информация о заказе поя-вится здесь</p>

Где-нибудь в форме также поставьте два скрытых поля:

<input type=hidden name=stoim value=0>
<input type=hidden name=kolvo value=0>

С помощью этих полей в сценарий-обработчик будут переданы значения стоимости заказа и количества заказанного товара. В ре-зультате владелец сайта получит в письме еще и эти сведения.

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

$zak="С адреса $email от заказчика с контактными данными $contact пришла заявка на приобретение то-вара:\n$zak\nКоличество заказанных товаров - $kolvo\nОбщая стоимость заказа - $stoim";

Добавление товара

Перспективы

Вот так, очень просто, вы можете сделать элементарный Интернет-магазин. Конечно, небольшой - всего на одной странице. Но заказать представленный на этой странице товар и отправить заказ владельцу посетитель сможет.

При работе с таким Интернет-магазином посетителю даже не нуж-но быть постоянно подключенным к Интернету во время оформления заказа - он спокойно может загрузить страницу с перечнем товаров, отключиться от Сети, выбрать нужные предложения и заполнить поля формы заказа, а затем, подключившись снова, этот заказ отправить. Да и саму страницу со списком ему необязательно получать именно из Сети - вы можете отправить ее кому-либо по почте или поместить на компакт-диски, раздаваемые друзьям или коллегам (только не за-будьте в этом случае указать в заголовке формы полный адрес стра-ницы с обработчиком заказа, а не только ее имя).

Hosted by uCoz