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

         

Приглашение на ввод данных о заказе



Рисунок 16.4. Приглашение на ввод данных о заказе


После ввода пользователем информации о заказе, приложение посылает введенные данные в Peri-сценарий, который в реальных условиях взаимодействовал быс базой данных по заказам в ресторане. Чтобы сформировать приглашение пользователю на ввод данных о заказе, приложение запускает сценарийRestReservationWML.pl, состоящий из следующего программного кода:

#!/usr/bin/perl

$RestName = $ENV{'QUERY_STRING'};

$RestName =~ s/%20/ /g;

{ $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 id=\"EditRes\"&gt

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

&ltdo type=\"options\" label=\"Make\"&gt &ltgo href=\"#MakeRes\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

$RestName&ltbr/&gt

&lt/p&gt

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

&ltselect&gt

&ltoption onpick=\"#GetDay\"&gtDay: \$(ResDay)&lt/option&gt &ltoption onpick=\"#GetTime\"&gtTime: \$(ResTime)&lt/option&gt &ltoption onpick=\"#GetNumber\"&gtNumber: \$(ResNumber)&lt/option&gt &ltoption onpick=\"#GetName\"&gtName: \$(ResName)&lt/option&gt

&lt/select&gt



&lt/p&gt

&lt/card&gt

&ltcard id=\"GetDay\"&gt

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

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

&ltselect name=\"ResDay\"&gt




&ltoption value=\"Sunday\"&gtSunday&lt/option&gt &ltoption value=\"Monday\"&gtMonday&lt/option&gt &ltoption value=\"Tuesday\"&gtTuesday&lt/option&gt &ltoption value=\"Wednesday\"&gtWednesday&lt/option&gt &ltoption value=\"Thursday\"&gtThursday&lt/option&gt &ltoption value=\"Friday\"&gtFriday&lt/option&gt &ltoption value=\"Saturday\"&gtSaturday&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&ltcard id=\"GetTime\"&gt

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

&ltp align=\"left\"&gt

Time: &ltinput name=\"ResTime\" maxlength=\"5\" format=\"NN:NN\" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id=\"GetNumber\"&gt

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

&ltp align=\"left\"&gt

Number in party: &ltinput name=\"ResNumber\" maxlength=\"2\" format=\"*N\" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id=\"GetName\"&gt

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

&ltp align=\"left\"&gt

Name: &ltinput name=\"ResName\" maxlength=\"15\" format=\"M14M\" /&gt

&lt/p&gt

&lt/card&gt

&ltcard id=\"MakeRes\"&gt

&ltdo type=\"accept\" label=\"Done\"&gt &ltgo href=\"../RestaurantRes/ RestaurantRes.wml\" /&gt &lt/do&gt

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

Reservation at&ltbr/&gt $RestName&ltbr/&gt Confirmed

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

print $Deck;

Сценарий попросту создает WML-страницу, которая принимает данные о заказе, вводимые пользователем. Для получения данных о заказе приложение использует Peri-сценарий (вместо того, чтобы просто вызвать существующий WML-код),так как в реальном приложении сценарий использовался бы для связи с базойданных и затем мгновенно создавал бы WML-карты. Как вы, вероятно, догадались,содержимое Peri-сценария RestReservationHDML.pl почти полностью совпадает сWML-сценарием, за исключением того, что данный сценарий создает HDML-страницу.



Рассмотрение приложения Restaurant



Рассмотрение приложения Restaurant

При запуске пользователем приложения Restaurant WML-страницаRestaurantCall.wml отображает список разных типов ресторанов и выводит приглашение пользователю на выбор типа предпочитаемой кухни. WML-страницаRestaurantCall.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="GetRestType"&gt

&ltdo type="accept" label="Pick"&gt &ltgo href="../waplibcgi/RestCallTypeWML.pl ?$(RestType)" /&gt &lt/do&gt

&ltp align="center"&gt

Restaurants

&lt/p&gt

&ltp align="left"&gt

&ltselect name="RestType"&gt

&ltoption value="American"&gtAmerican&lt/option&gt &ltoption value="Chinese"&gtChinese&lt/option&gt &ltoption value="FastFood"&gtFast Food&lt/option&gt &ltoption value="HealthFood"&gtHealth Food&lt/option&gt &ltoption value="Italian"&gtItalian&lt/option&gt &ltoption value="Mexican"&gtMexican&lt/option&gt &ltoption value="Seafood"&gtSeafood&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt

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


Теги <HEAD> и </HEAD>, располагающиеся после тега<WML>, позволяют указывать данные о WML-странице, включая метаданные и информацию, управляющую доступом.

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

Для отображения разных типов ресторанов WML-страница использует элемент<select>. После того как пользователь сделает свой выбор, WML-страница запускает Peri-сценарий RestCallTypeWML.pl, который выводит на экран список соответствующих типов ресторанов. Сценарий RestCallTypeWML.pl реализуется с помощью следующего программного кода:

#!/usr/bin/perl

$RestType = $ENV{'QUERY_STRING'};

if ($RestType eq "American")

{ $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 id=\"GetAmerican\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallAmerWML.pl? \$(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt American&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"AllStar\"&gtAll Star Cafe&lt/option&gt &ltoption value=\"MarysDiner\"&gtMary\'s Diner&lt/option&gt &ltoption value=\"Timberline\"&gtTimberline Inn&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Chinese")

{ $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 id=\"GetChinese\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallChineseWML.pl? \$(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Chinese&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt



&ltoption value=\"ChinaGarden\"&gtChina Garden&lt/option&gt &ltoption value=\"GoldenDragon\"&gtGolden Dragon&lt/option&gt &ltoption value=\"PlumTree\"&gtPlum Tree Inn&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "FastFood")

{ $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 id=\"GetFastFood\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallFastFoodWML.pl? \$(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Fast Food&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"BurgerKing\"&gtBurger King&lt/option&gt &ltoption value=\"McDonalds\"&gtMcDonald's &lt/option&gt &ltoption value=\"TopSpot\"&gtTop Spot &lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "HealthFood")

{ $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 id=\"GetHealthFood\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallHealthFoodWML.pl? \$(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Health Food&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"GeneralNutrition\"&gtGeneral Nutrition&lt/option&gt &ltoption value=\"HealthExpress\"&gtHealth Express&lt/option&gt &ltoption value=\"LivingHealthy\"&gtLiving Healthy&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Italian")

{ $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 id=\"GetItalian\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallItalianWML.pl? \$(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt



Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"Marios\"&gtMario's&lt/option&gt &ltoption value=\"OliveGarden\"&gtOlive Garden&lt/option&gt &ltoption value=\"PapaMurphys\"&gtPapa Murphy's&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Mexican")

{ $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 id=\"GetMexican\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallMexicanWML.pl?\ $(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Mexican&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"BajaFresh\"&gtBaja Fresh&lt/option&gt &ltoption value=\"Guadalajara\"&gtGuadalajara Grill&lt /option&gt &ltoption value=\"LaVilla\"&gtLa Villa&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

elsif ($RestType eq "Seafood")

{ $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 id=\"GetSeafood\"&gt

&ltdo type=\"accept\" label=\"Pick\"&gt &ltgo href=\"RestCallSeafoodWML.pl?\ $(RestName)\" /&gt &lt/do&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"../RestaurantCall/ RestaurantCall.wml\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Seafood&ltbr/&gt

&lt/p&gt

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

&ltselect name=\"RestName\"&gt

&ltoption value=\"KPSeafood\"&gtK \& P Seafood&lt/option&gt &ltoption value=\"FishCompany\"&gtLas Vegas Fish Company&lt/option&gt &ltoption value=\"SevenSeas\"&gtSeven Seas&lt/option&gt

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt"; }

print $Deck;

В реальном приложении Peri-сценарий получал бы информацию о ресторанах изкарт WML-страницы, затем следовал бы запрос в базу данных относительно соответствующих ресторанов. Далее, используя результаты опроса базы данных, сценарий моментально формировал бы WML-карту для отображения наименованийресторанов. Однако в нашем случае сценарий сам выполняет функцию базы данных. Вначале сценарий анализирует параметры для извлечения типа ресторана.Затем используется серия ветвлений if-else для определения типа ресторана и,основываясь на выбранном типе, формируется WML-карта, содержащая названиясоответствующих ресторанов.

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


Сценарий, в свою очередь, находит название ресторана и формирует для ресторана

#!/usr/bin/perl

$RestName = $ENV{'QUERY_STRING'};

if ($RestName eq "Marios")

{ $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 id=\"Marios\"&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

Mario's&ltbr/&gt 111 North Rainbow&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

elsif ($RestName eq "OliveGarden")

{ $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 id=\"OliveGarden\"&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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



Olive Garden&ltbr/&gt 7890 West Sahara&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

elsif ($RestName eq "PapaMurphys")

{ $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 id=\"PapaMurphys\"&gt

&ltdo type=\"options\" label=\"Back\"&gt &ltgo href=\"RestCallTypeWML.pl?Italian\" /&gt &lt/do&gt

&ltp align=\"center\"&gt

Restaurants&ltbr/&gt Italian&ltbr/&gt

&lt/p&gt

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

Papa Murphy's&ltbr/&gt 123 Main Street&ltbr/&gt Las Vegas, NV&ltbr/&gt &lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

}

print $Deck;

Как можно видеть, сценарий просто определяет название ресторана, затем формирует соответствующую WML-страницу. Наиболее интересной частью данногопрограммного кода является существующий для каждого ресторана элемент привязки (anchor - анкер) <а>, который позволяет пользователю автоматическизвонить в ресторан:

&lta href=\"wtai://wp/mc;7025551212\" title=\"Call\"&gt702-555-1212&lt/a&gt

Внутри данного анкера код wtai определяет, что программа будет использоватьфункцию из интерфейса приложений для беспроводных телефонов (WTAI-Wireless Telephony Application Interface).Код wp сообщает, что функция находится в общей библиотеке, а код тс представляет собой имя выполняемой функции(make call-телефонный вызов).


Рассмотрение приложения Restaurant.hdml



Рассмотрение приложения Restaurant.hdml

Как и приложение, основанное на WML, Restaurant.hdml позволяет отображатьадрес и номер телефона, используя для этого портативное устройство пользователя. Кроме того, при желании, пользователь также может автоматически позвонить в ресторан. Приложение Restauranthdml реализуется с помощью следующего программного кода на HDML:

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

&ltChoice Name=GetRestType Key=RestType&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=$RestType Dest=../waplibcgi/RestCallTypeHDML.pl&gt

&ltCenter&gtRestaurants

&ltCE Value="American"&gtAmerican &ltCE Value="Chinese"&gtChinese &ltCE Value="FastFood"&gtFast Food &ltCE Value="HealthFood"&gtHealth Food &ltCE Value="Italian"&gtItalian &ltCE Value="Mexican"&gtMexican &ltCE Value="Seafood"&gtSeafood

&lt/Choice&gt

&lt/HDML&gt

Первый элемент в файле сообщает браузеру (или другим программистам) информацию о версии спецификации HDML, поддерживаемой приложением. Крометого, параметр Markable=True определяет, что браузер может устанавливать наHDML-странице закладку (Bookmark), а параметр TTL=0 предписывает браузеру невыполнять кэширование HDML-страницы. Для предоставления пользователювозможности указывать тип предпочитаемой кухни приложение использует элемент <Choice>. Затем приложение запускает Peri-сценарий RestCallTypeHDML.pl,чтобы отобразить на экране список названий ресторанов, из которых пользователь может сделать свой выбор. Peri-сценарий RestCallTypeHDML.pl реализуется спомощью следующего программного кода: #!/usr/bin/perl

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

if ($RestType eq "American")

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

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

&ltChoice Name=GetAmerican Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallAmerHDML.pl&gt




&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtAmerican&ltbr&gt

&ltCE Value=AllStar& gtAll Star Cafe &ltCE Value=MarysDiner&gtMary's Diner &ltCE Value=Timberline&gtTimberline Inn

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "Chinese")

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

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

&ltChoice Name=GetChinese Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallChineseHDML.pl&gt

&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtChinese&ltbr&gt

&ltCE Value=ChinaGarden&gtChina Garden &ltCE Value=GoldenDragon&gtGolden Dragon &ltCE Value=PlumTree&gtPlum Tree Inn

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "FastFood")

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

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

&ltChoice Name=GetFastFood Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallFastFoodHDML.pl&gt

&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtFast Food&ltbr&gt

&ltCE Value=BurgerKing&gtBurger King &ltCE Value=McDonalds&gtMcDonald's &ltCE Value=TopSpot&gtTop Spot

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "HealthFood")

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

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

&ltChoice Name=GetHealthFood Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallHealthFoodHDML.pl&gt



&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtHealth Food&ltbr&gt

&ltCE Value=GeneralNutrition& gtGeneral Nutrition &ltCE Value=HealthExpress&gtHealth Express &ltCE Value=LivingHealthy&gtLiving Healthy

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "Italian")

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

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

&ltChoice Name=GetItalian Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallItalianHDML.pl&gt

&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtItalian&ltbr&gt

&ltCE Value=Marios&gtMario's &ltCE Value=OliveGarden&gtOlive Garden &ltCE Value=PapaMurphys&gtPapa Murphy's

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "Mexican")

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

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

&ltChoice Name=GetMexican Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallMexicanHDML.pl&gt

&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtMexican&ltbr&gt

&ltCE Value=BajaFresh&gtBaja Fresh &ltCE Value=Guadalajara&gtGuadalajara Grill &ltCE Value=LaVilla&gtLa Villa

&lt/Choice&gt

&lt/HDML&gt";

}

elsif ($RestType eq "Seafood")

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

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

&ltChoice Name=GetSeafood Key=RestName&gt

&ltAction Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallSeafoodHDML.pl&gt



&ltAction Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtSeafood&ltbr&gt

&ltCE Value=KPSeafood&gtK & P Seafood &ltCE Value=FishCompany&gtLas Vegas Fish Company &ltCE Value=SevenSeas&gtSeven Seas

&lt/Choice&gt

&lt/HDML&gt";

}

print $Deck;

Сценарий анализирует параметр, после этого присваивает тип ресторана переменной $RestType. Далее программа использует серию ветвлений if-else дляопределения выбранного типа ресторана, в этом месте программного кода сценарий создает HDML-страницу, отображаемую браузером в виде списка соответствующих ресторанов. После выбора пользователем некоторого конкретного ресторана вновь созданная HDML-страница запускает соответствующий типу кухниPeri-сценарий, подобный RestCallSeafoodHDML.pl, приводимому здесь:

#!/usr/bin/perl

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

if ($RestName eq "KPSeafood")

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

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

&ltDisplay Name=KPSeafood&gt

&ltAction Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl&gt

&ltAction Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtSeafood&ltbr&gt &ltLine&gtK & P Seafood&ltbr&gt 111 Main Street&ltbr&gt Las Vegas, NV&ltbr&gt 702-555-1212

&lt/Display&gt

&lt/HDML&gt"; }

elsif ($RestName eq "FishCompany")

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

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

&ltDisplay Name=FishCompany&gt

&ltAction Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl&gt

&ltAction Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtSeafood&ltbr&gt &ltLine&gtLas Vegas Fish Company&ltbr&gt 222 East Sahara&ltbr&gt Las Vegas, NV&ltbr&gt 702-555-1212



&lt/Display&gt

&lt/HDML&gt"; }

elsif ($RestName eq "SevenSeas")

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

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

&ltDisplay Name=SevenSeas&gt

&ltAction Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl&gt

&ltAction Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212&gt

&ltCenter&gtRestaurants&ltbr&gt &ltCenter&gtSeafood&ltbr&gt &ltLine&gtSeven Seas&ltbr&gt 100 Water Street&ltbr&gt Las Vegas, NV&ltbr&gt 702-555-1212

&lt/Display&gt

&lt/HDML&gt"; }

print $Deck;

Элемент <Action> с параметром Task= Call определяет номер, который будетвызывать браузер, когда пользователь нажимает кнопку ввода (Accept), на которой может быть нанесено слово Call (Вызов) или, если телефон поддерживаетпиктограммы, изображение телефона.


Размещение предварительного заказа в ресторане



Размещение предварительного заказа в ресторане

В предыдущем приложении пользователь мог выбирать ресторан и, при желаии, звонить в выбранное место. Однако во многих случаях пользователи предпочтут делать заказ без необходимости говорить с кем-либо из персонала ресторана. В каталоге Главы 16 на CD-ROM, прилагаемом к данной книге, вы,найдетеприложение RestaurantReservation, полученное модификацией предыдущего приложения, которое предоставляет пользователю информацию, необходимую дляввода данных по заказу, как показано на Рисунок 16.4.



Вывод информации о конкретном ресторане



Рисунок 16.3. Вывод информации о конкретном ресторане




Вывод ресторановс определенным видом кухни



Рисунок 16.2, Вывод ресторановс определенным видом кухни