Пособие по написанию WAP-сайтов

         

Подробнее о приложении Catalogltem.hdml



Подробнее о приложении Catalogltem.hdml

Как и приложение формата WML, файл Catalogltem.hdml позволяет пользователюввести со своего сотового телефона номер и описание выбранного им товара.Файл Catalogltem.hdml имеет исходный код, приведенный ниже:

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltChoice Name=OrderItem Method=Alpha&gt

&ltAction Type=Accept Label=Edit&gt &ltAction Type=Soft1 Label=Next Task=GO Dest=CatalogShip.hdml&gt

&ltCenter&gtCatalog Order &ltLine&gtItem information

&ltCE Task=GOSub Dest=#GetItemNum Vars=ItemNum=$ItemNum Receive=ItemNum&gt Item #:[$ItemNum]

&ltCE Task=GOSub Dest=#GetItemDesc Vars=ItemDesc=$ItemDesc Receive=ItemDesc&gt Item:[$ItemDesc]

&lt/Choice&gt

&ltEntry Name=GetItemNum Default=$ItemNum Key=ItemNum Format=N4N&gt

&ltAction Type=Accept Task=Return Retvals=$ItemNum&gt Item #:

&lt/Entry&gt

&ltEntry Name=GetItemDesc Default=$ItemDesc Key=ItemDesc Format=M14M&gt

&ltAction Type=Accept Task=Return Retvals=$ItemDesc&gt Item:

&lt/Entry&gt

&lt/HDML&gt

Первый элемент внутри деки сообщает браузеру (или другим программистам),какая версия языка HDML используется приложением. Далее, выражение Markable=True сообщает, что браузер может установить закладку в исходной деке, аTTL=O сообщает ему о невозможности кэширования (таким образом, браузердолжен перезагружать эту деку каждый раз при обращении к нему пользователя).Далее приложение использует элементы <Action> для управления кнопками Edit(Редактировать) и Next (Следующий).

Сначала карта использует элемент <choice> для предоставления пользователювыбора того, что он желает редактировать: номер товара или его описание. Далее, основываясь на выборе пользователя, приложение передает управлениеэлементу GetltemNum или GetltemDesc для обеспечения ввода данных. Здесь используется поле format для определения формата вводимых пользователем значений переменных.


К примеру, в элементе GetltemNum определяется формат N4N.Этот формат предусматривает ввод от одного до пяти числовых символов номератовара (N4N означает, что один числовой символ обязателен, остальные четыре -по необходимости)



После ввода пользователем номера и описания товара, приложение загружаетдеку CatalogShip.hdml, которая имеет следующий исходный код:

Shipping information

Ship to:[$ShipName]

Address:[$ShipAddr1]

Address:[$ShipAddr2]

City:[$ShipCity]

State:[$ShipState]

Zip Code:[$ShipZip]

Phone:[$ShipPhone]

Ship to:

Address:

Address:

City:

State:

Zip Code:

Phone:

Для предоставления пользователю возможности выбора желаемого адресногополя приложение использует элемент <Choice>. Основываясь на выборе пользовaтеля, приложение передает управление именованному элементу <Entry> внутри деки, который предлагает ввести данные в определенном формате. Послеввода пользователем адреса отправки, приложение загружает декуCatalogBill.hdml, в которой предлагается ввести адрес для выписывания счета.Как вы понимаете, содержимое этой деки практически идентично содермимомуподобной деки, описанной ранее в этой главе.

После ввода информации по счету, приложение вызывает деку CatalogCredit.hdml,в которой пользователю предлагается ввести информацию по его кредитнойкарте. Содержимое этой деки приведено ниже:

Как и в других деках, в CatalogCredit.hdml используются элементы <Action> дляуправления кнопками Edit (Редактировать) и Next (Следующий). Далее, в исходном коде следует элемент <Choice> для предоставления пользователю возможности редактирования поля типа кредитной карты либо поля ее номера. Основываясь на выборе пользователя, приложение передает управление именованомуэлементу внутри деки, который предлагает пользователю ввести данные в определенном формате.

После ввода пользователем информации о кредитной карте приложение загружает файл CatalogDone.hdml, из которого запускается сценарий языка PerlCatalogOrderHDML.pl.


Этому сценарию передаются параметры, как показано ниже:

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltDisplay Name=CatalogDone&gt

&ltAction Type=Soft1 Label=Reset Task=GO Dest=CatalogItem.hdml&gt &ltAction Type=Accept Label=Order Task=GO Method=Post PostData=$ItemNum&$ItemDesc:noesc&$ShipName: noesc&$ShipAddr1:noesc&ShipAddr2:noesc&$ShipCity: noesc&$ShipState&ShipZip&$ShipPhone&$BillName: noesc&$BillAddr1:noesc&$BillAddr2:noesc&$BillCity: noesc&$BillState&$BillZip&$BillPhone&$CartType: noesc&$CardNum Dest=../waplibcgi/CatalogOrderHDML.pl&gt

&ltbr&gtOrder form complete

&lt/Display&gt

&lt/HDML&gt

Как видите, в нашем случае используется единственое поле postdata, и параметры разделяются с помощью символа «амперсанд» (&).


Подробнее о приложении CatalogOrder



Подробнее о приложении CatalogOrder

Когда пользователь запускает приложение CatalogOrder, дека Catalogltem.wmlпредлагает ему ввести номер товара и его характеристики. После того как этаинформация будет введена, загружается другая дека (CatalogShip.wml) для получения информации об адресе отправки. Дека Catalogltem.wml имеет следующийисходный код:

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="OrderItem"&gt

&ltdo type="accept" label="Edit"&gt &ltnoop /&gt &lt/do&gt

&ltdo type="options" label="Next"&gt &ltgo href="CatalogShip.wml" /&gt &lt/do&gt

&ltp align="center"&gt

Catalog Order

&lt/p&gt

&ltp align="left" mode="nowrap"&gt

Item information

&ltselect&gt

&ltoption onpick="#GetItemNum"&gtItem#: $(ItemNum)&lt/option&gt &ltoption onpick="#GetItemDesc"&gtItem: $(ItemDesc)&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetItemNum"&gt

&ltdo type="accept"&gt &ltgo href="#OrderItem" /&gt &lt/do&gt

&ltp align="left"&gt

Item #: &ltinput name="ItemNum" maxlength="5" format="N4N" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetItemDesc"&gt

&ltdo type="accept"&gt &ltgo href="#OrderItem" /&gt &lt/do&gt

&ltp align="left"&gt

Item: &ltinput name="ItemDesc" maxlength="15" format="M14M" /&gt




&lt/p&gt

&lt/card&gt

&lt/wml&gt

Так же как и во всех деках формата WML, первые два ее элемента сообщают браузеру, какую из версий спецификации WAP поддерживает данное приложение. Внашем случае WML-страница поддерживает версию 1.0 языка XML и версию 1.1описания типа документа (DTD), разработанного ассоциацией WAP Forum.

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

Далее, за информацией о версиях, каждый WML-файл начинается с тега <wml>. Вконце каждого файла вводят </wml>, что означает окончание исходного кодаприложения. За <wml> следуют теги <head> и </head>, внутри которых находитсяинформация о самом исходном коде, включая метаданные и информацию обуправлении доступом. Многие программисты называют метаданные «данными оданных». Другими словами, в этом случае метаданные, которые считывает и обрабатывает браузер, сообщают ему, как трактовать данные.

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

Элемент <meta> позволяет точно определить метаинформацию для исходногофайла. В нашем случае строка http-eguiv="Cache-Control" сообщает браузеруWAP, что эта часть метаинформации используется системой кэширования памяти. Аналогично, строка content=max-age=0 сообщает браузеру, что максимальноевремя, в течение которого будет кэшироваться этот файл, равно нулю секунд;значит, браузер не будет кэшировать данные, а загружать данные с сервера каждый раз, когда они будут запрошены. Для этой книги значение нуля было выбрано для содействия процессу обучения читателя. При выборе нуля каждый раз,когда будут происходить изменения, они будут передаваться на телефон. В реальном приложении статическое меню, подобное этому, можно использовать поумолчанию в течение 30 дней. Последняя строка forua="true" определяет, чтозначение Cache-Control предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.



Приложение использует две переменные (itemNum и itemDesc) для хранениявведеных пользователем данных. После запуска приложения в карте используются два элемента <do>. Один из них служит для преобразования надписи кнопкиподтверждения ввода Accept (Принять) из ОК по умолчанию в Edit (Редактировать) на время, пока на дисплеее отображаются выбранные опции. Второй элемент <do> используется для обработки нажатия кнопки Next (Далее). :

Когда пользователь нажимает кнопку Next (Далее), приложение дает браузерууказание загрузить деку CatalogShip.wml, которая предлагает пользователю ввестиинформацию об адресе отправления товара.

Далее в карте используются элемент <select> для предоставления пользователювозможности выбрать и редактировать номер товара или его описание:

&ltselect&gt

&ltoption onpick="#GetItemNum"&gtItem#: $(ItemNum)&lt/option&gt &ltoption onpick="#GetItemDesc"&gtItem: $(ItemDesc)&lt/option&gt

&lt/select&gt

Внутри элемента <select> знак фунта (#), предшествующий первым двум опциямговорит о том, что каждая из карт, например #GetltemNum, находится внутри текущей деки формата WML. Когда пользователь производит выбор одной из опций, приложение передает управление соответствующей карте.

Внутри каждой из карт приложение использует элемент <input> для предоставления пользователю возможности ввода необходимой .информации. Если выпроанализируете этот элемент, вы увидите, что поле format определяет форматсоответствующих данных. Например, <input> в карте GetltemNum используетформат N4N для ограничения ввода пользователем от одного до пяти числовыхсимволов (N4N означает, что один числовой символ обязателен, остальные четыре-по необходимости).

После ввода пользователем номера товара и его описания приложение загружаетдеку CatalogShip.wml, исходный код которой приведен ниже:

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt



&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="OrderShip"&gt

&ltdo type="accept" label="Edit"&gt &ltnoop /&gt &lt/do&gt

&ltdo type="options" label="Next"&gt &ltgo href="CatalogBill.wml" /&gt &lt/do&gt

&ltp align="left" mode="nowrap"&gt

Shipping information

&ltselect&gt

&ltoption onpick="#GetShipName"& gtShip to: $(ShipName)&lt/option&gt &ltoption onpick="#GetShipAddr1"&gtAddress: $(ShipAddr1)&lt/option&gt &ltoption onpick="#GetShipAddr2"&gtAddress: $(ShipAddr2)&lt/option&gt &ltoption onpick="#GetShipCity"&gtCity: $(ShipCity)&lt/option&gt &ltoption onpick="#GetShipState"&gtState: $(ShipState)&lt/option&gt &ltoption onpick="#GetShipZip"&gtZip Code: $(ShipZip)&lt/option&gt &ltoption onpick="#GetShipPhone"&gtPhone: $(ShipPhone)&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipName"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

Ship to: &ltinput name="ShipName" maxlength="15" format="M14M" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipAddr1"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

Address: &ltinput name="ShipAddr1" maxlength="20" format="M19M" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipAddr2"&gt



&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

Address: &ltinput name="ShipAddr2" maxlength="20" format="M19M" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipCity"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

City: &ltinput name="ShipCity" maxlength="15" format="M14M" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipState"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

State: &ltinput name="ShipState" maxlength="2" format="AA" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipZip"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

Zip Code: &ltinput name="ShipZip" maxlength="5" format="5N" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetShipPhone"&gt

&ltdo type="accept"&gt &ltgo href="#OrderShip" /&gt &lt/do&gt

&ltp align="left"&gt

Phone: &ltinput name="ShipPhone" maxlength="14" format="(NNN)-NNN-NNNN" /&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Дека CatalogShip.wml не сильно отличается от деки Catalogltem.wml, за исключением того, что в ней используется немногим больше карт, которые увеличивают

размер исходного кода внутри элемента <select>. Каждый раз, когда пользователь производит ввод, например названия города, приложение передает управление определенной локальной карте.


В пределах локальной карты используютсяэлемент <input> для получения данных от пользователя.

После ввода пользователем адреса отправки товара, приложение загружает декуCatalogBill.wml, содержимое которой очень похоже на содержимое описаннойвыше деки. Далее приложение загружает деку CatalogCredit.wml для полученияинформации о кредитной карте пользователя. Исходный код декиCatalogCredit.wml приведен ниже:

&lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="CatalogCredit"&gt

&ltdo type="accept" label="Edit"&gt &ltnoop /&gt &lt/do&gt

&ltdo type="options" label="Next"&gt &ltgo href="CatalogDone.wml" /&gt &lt/do&gt

&ltp align="left" mode="nowrap"&gt

Credit Card

&ltselect&gt

&ltoption onpick="#GetCardType"&gtCard: $(CardType)&lt/option&gt &ltoption onpick="#GetCardNum"&gtNumber: $(CardNum)&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id="GetCardType"&gt

&ltdo type="accept"&gt &ltgo href="#CatalogCredit" /&gt &lt/do&gt

&ltp align="left" mode="nowrap"&gt

&ltselect name="CardType"&gt

&ltoption value="AmEx"&gtAmerican Express&lt/option&gt &ltoption value="Discover"&gtDiscover&lt/option&gt &ltoption value="MasterCard"&gtMaster Card&lt/option&gt &ltoption value="Visa"&gtVisa&lt/option&gt

&lt/select&gt

&lt/p&gt



&lt/card&gt

&ltcard id="GetCardNum"&gt

&ltdo type="accept"&gt &ltgo href="#CatalogCredit" /&gt &lt/do&gt

&ltp align="left"&gt

Number: &ltinput name="CardNum" maxlength="19" format="NNNN-NNNN-NNNN-NNNN" /&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Дека использует элемент <select> для предоставления пользователю возможности выбрать тип его кредитной карты или номер кредитной карты. Если пользователь желает определить тип его кредитной карточки, приложение обращаетсяк локальной карте GetCardType, которая использует <select> для отображениясписка кредитных карт. Аналогично, если выбран ввод номера карточки, приложение обращается к локальной карте GetCardNum, в которой используется элемент <input> для предоставления пользователю возможности ввода номера кредитной карточки. Заметьте, что в элементе <input> присутствует поле format.Использованием тире в поле формата приложение позволяет пользователю вводить номер карточки только стандартным способом. Для упрощения исходногокода в деке не предлагается вводить дату истечения срока действия кредитнойкарточки. Однако реализовать это можно точно так же, как в карте GetCardNum, стем лишь исключением, что формат вводимой информации в элементе <input>должен иметь вид NN-NN.

После определения пользователем информации о кредитной карте приложениезагружает деку CatalogDone.wml, которая передает информацию о сделанном заказе сценарию языка Perl для обработки. Дека CatalogDone.wml имеет следующийисходный код: &lt?xml version="1.0"?&gt &lt!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt

&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="CatalogDone"&gt



&ltdo type="options" label="Reset"&gt &ltgo href="CatalogItem.wml" /&gt &lt/do&gt

&ltdo type="accept" label="Order"&gt

&ltgo method="post" href="../waplibcgi/CatalogOrderWML.pl"&gt &ltpostfield name="ItemNum" value="$(ItemNum)&"/&gt &ltpostfield name="ItemDesc" value="$(ItemDesc)&"/&gt &ltpostfield name="ShipName" value="$(ShipName)&"/&gt &ltpostfield name="ShipAddr1" value="$(ShipAddr1)&"/&gt &ltpostfield name="ShipAddr2" value="$(ShipAddr2)&"/&gt &ltpostfield name="ShipCity" value="$(ShipCity)&"/&gt &ltpostfield name="ShipState" value="$(ShipState)&"/&gt &ltpostfield name="ShipPhone" value="$(ShipPhone)&"/&gt &ltpostfield name="BillName" value="$(BillName)&"/&gt &ltpostfield name="BillAddr1" value="$(BillAddr1)&"/&gt &ltpostfield name="BillAddr2" value="$(BillAddr2)&"/&gt &ltpostfield name="BillCity" value="$(BillCity)&"/&gt &ltpostfield name="BillState" value="$(BillState)&"/&gt &ltpostfield name="BillPhone" value="$(BillPhone)&"/&gt &ltpostfield name="CardType" value="$(CardType)&"/&gt &ltpostfield name="CardNum" value="$(CardNum)"/&gt &lt/go&gt

&lt/do&gt

&ltp align="left" mode="nowrap"&gt

Order form complete

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Для запуска сценария CatalogOrderWML.pl приложение использует элемент <до> с методом POST. Как вы видите, для передачи параметров сценарию используется элемент postfield, который позволяет приложению определить имя изначение.


Подробнее о сценарии языка Perl CatalogOrderHDML.pl



Подробнее о сценарии языка Perl CatalogOrderHDML.pl

Как и приложение формата WML, приложение формата HDML использует сценарий языка Perl для анализа введенной информации о заказе. Эту информациюсценарий получает из деки CatalogDone.hdml. После того, как будут проанализированы полученные данные, сценарий создает исходный код формата HDML,отображающий информацию о заказе. Исходный код сценарияCatalogOrderHDML.pl приведен ниже:

#!/usr/bin/perl

read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});

@data = split(/&/, $Buffer);

$ItemNum = $data[0]; $ItemDesc = $data[1]; $ShipName = $data[2]; $ShipAddr1 = $data[3]; $ShipAddr2 = $data[4]; $ShipCity = $data[5]; $ShipState = $data[6]; $ShipZip = $data[7]; $ShipPhone = $data[8]; $BillName = $data[9]; $BillAddr1 = $data[10]; $BillAddr2 = $data[11]; $BillCity = $data[12]; $BillState = $data[13]; $BillZip = $data[14]; $BillPhone = $data[15]; $CardType = $data[16]; $CardNum = $data[17];

#Do processing here...

$Deck = "Content-type: text/x-hdml

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltDisplay&gt

&ltAction Type=Accept Task=GO Dest=../CatalogOrder/CatalogItem.hdml&gt

Input data:&ltbr&gt&ltbr&gt

\$ItemNum&ltbr&gt \$ItemDesc&ltbr&gt&ltbr&gt \$ShipName&ltbr&gt \$ShipAddr1&ltbr&gt \$ShipAddr2&ltbr&gt \$ShipCity&ltbr&gt \$ShipState&ltbr&gt \$ShipZip&ltbr&gt \$ShipPhone&ltbr&gt \$BillName&ltbr&gt \$BillAddr1&ltbr&gt \$BillAddr2&ltbr&gt \$BillCity&ltbr&gt \$BillState&ltbr&gt \$BillZip&ltbr&gt \$BillPhone&ltbr&gt \$CardType&ltbr&gt \$CardNum

&lt/Display&gt

&lt/HDML&gt";

print $Deck;

Для проведения анализа данных, полученных с использованием функции $ENV,сценарий считывает всю информацию о переданных параметрах в переменную$Buffer. Далее, используя функцию разделения split (), переписывает параметры в массив (помните, что дека формата HDML поместила между параметрамисимвол &, который функция разделения использует для распознавания каждогоотдельного параметра). После этого значения элементов массива просто присваиваются соответствующим переменным. Строка внутри сценария, котораягласит Do processing here (Здесь происходит обработка) представляет область,где вы должны поместить исходный код для взаимодействия с существующимиприложениями для электронной коммерции вашей компании.





Подробнее о сценарии языка Perl CatalogOrderWML.pl



Подробнее о сценарии языка Perl CatalogOrderWML.pl

В реальном приложении сценарий языка Perl CatalogOrderWML.pl должен инициировать серию операций, таких, как подтверждение действительности номеракредитной карты, проверка списка базы данных (чтобы убедиться, что товардоступен), размещение текущего заказа в базе данных компании и так далее. Другими словами, сценарий должен взаимодействовать со средствами электроннойкоммерции компании. Таким образом, для большинства компаний создание подобного приложения, поддерживающего протокол WAP, заключается просто впостроении основанной на WML интерфейсной части для своего программногообеспечения электронной коммерции.

Сценарий CatalogOrderWML.pl просто анализирует переданные ему приложениемдля электронной коммерции параметры, создает новую деку формата WML, которую браузер использует для отображения транзакции. Исходный код сценарияCatalogOrderWML.pl приведен ниже:

#!/usr/bin/perl

require 'DeckUtils.pl';

%cgiVars = &AppUtils::ParseCGIVars();

$ItemNum = $cgiVars{"ItemNum"}; $ItemDesc = $cgiVars{"ItemDesc"}; $ShipName = $cgiVars{"ShipName"}; $ShipAddr1 = $cgiVars{"ShipAddr1"}; $ShipAddr2 = $cgiVars{"ShipAddr2"}; $ShipCity = $cgiVars{"ShipCity"}; $ShipState = $cgiVars{"ShipState"}; $ShipZip = $cgiVars{"ShipZip"};; $ShipPhone = $cgiVars{"ShipPhone"}; $BillName = $cgiVars{"BillName"}; $BillAddr1 = $cgiVars{"BillAddr1"}; $BillAddr2 = $cgiVars{"BillAddr2"}; $BillCity = $cgiVars{"BillCity"}; $BillState = $cgiVars{"BillState"}; $BillZip = $cgiVars{"BillZip"}; $BillPhone = $cgiVars{"BillPhone"}; $CardType = $cgiVars{"CardType"}; $CardNum = $cgiVars{"CardNum"};

#Do processing here...

$Deck = "Content-type: text/vnd.wap.wml

&lt?xml version=\"1.0\"?&gt &lt!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\"&gt




&ltwml&gt

&lthead&gt

&ltmeta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/&gt

&lt/head&gt

&ltcard&gt

&ltdo type=\"accept\"&gt &ltgo href=\"../CatalogOrder/CatalogItem.wml\" /&gt &lt/do&gt

&ltp align=\"left\" mode=\"nowrap\"&gt

Input data:&ltbr/&gt&ltbr/&gt

\$ItemNum&ltbr/&gt \$ItemDesc&ltbr/&gt \$ShipName&ltbr/&gt \$ShipAddr1&ltbr/&gt \$ShipAddr2&ltbr/&gt \$ShipCity&ltbr/&gt \$ShipState&ltbr/&gt \$ShipZip&ltbr/&gt \$ShipPhone&ltbr/&gt \$BillName&ltbr/&gt \$BillAddr1&ltbr/&gt \$BillAddr2&ltbr/&gt \$BillCity&ltbr/&gt \$BillState&ltbr/&gt \$BillZip&ltbr/&gt \$BillPhone&ltbr/&gt \$CardType&ltbr/&gt \$CardNum

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

print $Deck;

Первая строка сценария представляет собой комментарий, сообщающий интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока сообщает интерпретатору языка, что сценарий использует в своей работедругой сценарий языка Perl DeckUtils.pl, в котором определены процедуры дляанализа параметров. После анализа параметров сценарий создает и печатаетпростую деку формата WML, перехватывая которую браузер отображает итоговуюинформацию по сделанному заказу. Как минимум, сценарий должен проверить,введены ли пользователем имя, адрес, номер товара, номер кредитной карты итак далее. Для выполнения этих действий он просто проверяет переменные наналичие нулевого значения, и если значение какой-либо из переменных равнонулю, передает управление обратно соответствующей карте, открывая и выводядеку формата WML:


Приглашение к вводу адресадля отправки товара



Рисунок 15.2. Приглашение к вводу адресадля отправки товара




Приглашение к вводу данныхкредитной карты



Рисунок 15.3. Приглашение к вводу данныхкредитной карты




Приглашение к вводу номератовара и его описания



Рисунок 15.1. Приглашение к вводу номератовара и его описания