Приглашение на ввод данных о заказе
Рисунок 16.4. Приглашение на ввод данных о заказе
После ввода пользователем информации о заказе, приложение посылает введенные данные в Peri-сценарий, который в реальных условиях взаимодействовал быс базой данных по заказам в ресторане. Чтобы сформировать приглашение пользователю на ввод данных о заказе, приложение запускает сценарийRestReservationWML.pl, состоящий из следующего программного кода:
#!/usr/bin/perl
$RestName = $ENV{'QUERY_STRING'};
$RestName =~ s/%20/ /g;
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"EditRes\">
<do type=\"accept\" label=\"Edit\"> <noop /> </do>
<do type=\"options\" label=\"Make\"> <go href=\"#MakeRes\" /> </do>
<p align=\"center\">
$RestName<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select>
<option onpick=\"#GetDay\">Day: \$(ResDay)</option> <option onpick=\"#GetTime\">Time: \$(ResTime)</option> <option onpick=\"#GetNumber\">Number: \$(ResNumber)</option> <option onpick=\"#GetName\">Name: \$(ResName)</option>
</select>
</p>
</card>
<card id=\"GetDay\">
<do type=\"accept\"> <go href=\"#EditRes\" /> </do>
<p align=\"left\" mode=\"nowrap\">
<select name=\"ResDay\">
<option value=\"Sunday\">Sunday</option> <option value=\"Monday\">Monday</option> <option value=\"Tuesday\">Tuesday</option> <option value=\"Wednesday\">Wednesday</option> <option value=\"Thursday\">Thursday</option> <option value=\"Friday\">Friday</option> <option value=\"Saturday\">Saturday</option>
</select>
</p>
</card>
<card id=\"GetTime\">
<do type=\"accept\"> <go href=\"#EditRes\" /> </do>
<p align=\"left\">
Time: <input name=\"ResTime\" maxlength=\"5\" format=\"NN:NN\" />
</p>
</card>
<card id=\"GetNumber\">
<do type=\"accept\"> <go href=\"#EditRes\" /> </do>
<p align=\"left\">
Number in party: <input name=\"ResNumber\" maxlength=\"2\" format=\"*N\" />
</p>
</card>
<card id=\"GetName\">
<do type=\"accept\"> <go href=\"#EditRes\" /> </do>
<p align=\"left\">
Name: <input name=\"ResName\" maxlength=\"15\" format=\"M14M\" />
</p>
</card>
<card id=\"MakeRes\">
<do type=\"accept\" label=\"Done\"> <go href=\"../RestaurantRes/ RestaurantRes.wml\" /> </do>
<p align=\"left\" mode=\"nowrap\">
Reservation at<br/> $RestName<br/> Confirmed
</p>
</card>
</wml>"; }
print $Deck;
Сценарий попросту создает WML-страницу, которая принимает данные о заказе, вводимые пользователем. Для получения данных о заказе приложение использует Peri-сценарий (вместо того, чтобы просто вызвать существующий WML-код),так как в реальном приложении сценарий использовался бы для связи с базойданных и затем мгновенно создавал бы WML-карты. Как вы, вероятно, догадались,содержимое Peri-сценария RestReservationHDML.pl почти полностью совпадает сWML-сценарием, за исключением того, что данный сценарий создает HDML-страницу.
Рассмотрение приложения Restaurant
Рассмотрение приложения Restaurant
При запуске пользователем приложения Restaurant WML-страницаRestaurantCall.wml отображает список разных типов ресторанов и выводит приглашение пользователю на выбор типа предпочитаемой кухни. WML-страницаRestaurantCall.wml реализуется с помощью следующего программного кода:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="GetRestType">
<do type="accept" label="Pick"> <go href="../waplibcgi/RestCallTypeWML.pl ?$(RestType)" /> </do>
<p align="center">
Restaurants
</p>
<p align="left">
<select name="RestType">
<option value="American">American</option> <option value="Chinese">Chinese</option> <option value="FastFood">Fast Food</option> <option value="HealthFood">Health Food</option> <option value="Italian">Italian</option> <option value="Mexican">Mexican</option> <option value="Seafood">Seafood</option>
</select>
</p>
</card>
</wml>
Первые два элемента 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
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetAmerican\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallAmerWML.pl? \$(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> American<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"AllStar\">All Star Cafe</option> <option value=\"MarysDiner\">Mary\'s Diner</option> <option value=\"Timberline\">Timberline Inn</option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "Chinese")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <! DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetChinese\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallChineseWML.pl? \$(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Chinese<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"ChinaGarden\">China Garden</option> <option value=\"GoldenDragon\">Golden Dragon</option> <option value=\"PlumTree\">Plum Tree Inn</option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "FastFood")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <! DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetFastFood\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallFastFoodWML.pl? \$(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Fast Food<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"BurgerKing\">Burger King</option> <option value=\"McDonalds\">McDonald's </option> <option value=\"TopSpot\">Top Spot </option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "HealthFood")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetHealthFood\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallHealthFoodWML.pl? \$(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Health Food<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"GeneralNutrition\">General Nutrition</option> <option value=\"HealthExpress\">Health Express</option> <option value=\"LivingHealthy\">Living Healthy</option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "Italian")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <! DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetItalian\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallItalianWML.pl? \$(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Italian<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"Marios\">Mario's</option> <option value=\"OliveGarden\">Olive Garden</option> <option value=\"PapaMurphys\">Papa Murphy's</option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "Mexican")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <! DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetMexican\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallMexicanWML.pl?\ $(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Mexican<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"BajaFresh\">Baja Fresh</option> <option value=\"Guadalajara\">Guadalajara Grill< /option> <option value=\"LaVilla\">La Villa</option>
</select>
</p>
</card>
</wml>"; }
elsif ($RestType eq "Seafood")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"GetSeafood\">
<do type=\"accept\" label=\"Pick\"> <go href=\"RestCallSeafoodWML.pl?\ $(RestName)\" /> </do>
<do type=\"options\" label=\"Back\"> <go href=\"../RestaurantCall/ RestaurantCall.wml\" /> </do>
<p align=\"center\">
Restaurants<br/> Seafood<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
<select name=\"RestName\">
<option value=\"KPSeafood\">K \& P Seafood</option> <option value=\"FishCompany\">Las Vegas Fish Company</option> <option value=\"SevenSeas\">Seven Seas</option>
</select>
</p>
</card>
</wml>"; }
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
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"Marios\">
<do type=\"options\" label=\"Back\"> <go href=\"RestCallTypeWML.pl?Italian\" /> </do>
<p align=\"center\">
Restaurants<br/> Italian<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
Mario's<br/> 111 North Rainbow<br/> Las Vegas, NV<br/> <a href=\"wtai://wp/mc;7025551212\" title=\"Call\">702-555-1212</a>
</p>
</card>
</wml>";
}
elsif ($RestName eq "OliveGarden")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"OliveGarden\">
<do type=\"options\" label=\"Back\"> <go href=\"RestCallTypeWML.pl?Italian\" /> </do>
<p align=\"center\">
Restaurants<br/> Italian<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
Olive Garden<br/> 7890 West Sahara<br/> Las Vegas, NV<br/> <a href=\"wtai://wp/mc;7025551212\" title=\"Call\">702-555-1212</a>
</p>
</card>
</wml>";
}
elsif ($RestName eq "PapaMurphys")
{ $Deck = "Content-type: text/vnd.wap.wml
<?xml version=\"1.0\"?> <!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<head>
<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>
</head>
<card id=\"PapaMurphys\">
<do type=\"options\" label=\"Back\"> <go href=\"RestCallTypeWML.pl?Italian\" /> </do>
<p align=\"center\">
Restaurants<br/> Italian<br/>
</p>
<p align=\"left\" mode=\"nowrap\">
Papa Murphy's<br/> 123 Main Street<br/> Las Vegas, NV<br/> <a href=\"wtai://wp/mc;7025551212\" title=\"Call\">702-555-1212</a>
</p>
</card>
</wml>";
}
print $Deck;
Как можно видеть, сценарий просто определяет название ресторана, затем формирует соответствующую WML-страницу. Наиболее интересной частью данногопрограммного кода является существующий для каждого ресторана элемент привязки (anchor - анкер) <а>, который позволяет пользователю автоматическизвонить в ресторан:
<a href=\"wtai://wp/mc;7025551212\" title=\"Call\">702-555-1212</a>
Внутри данного анкера код wtai определяет, что программа будет использоватьфункцию из интерфейса приложений для беспроводных телефонов (WTAI-Wireless Telephony Application Interface).Код wp сообщает, что функция находится в общей библиотеке, а код тс представляет собой имя выполняемой функции(make call-телефонный вызов).
Рассмотрение приложения Restaurant.hdml
Рассмотрение приложения Restaurant.hdml
Как и приложение, основанное на WML, Restaurant.hdml позволяет отображатьадрес и номер телефона, используя для этого портативное устройство пользователя. Кроме того, при желании, пользователь также может автоматически позвонить в ресторан. Приложение Restauranthdml реализуется с помощью следующего программного кода на HDML:
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetRestType Key=RestType>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=$RestType Dest=../waplibcgi/RestCallTypeHDML.pl>
<Center>Restaurants
<CE Value="American">American <CE Value="Chinese">Chinese <CE Value="FastFood">Fast Food <CE Value="HealthFood">Health Food <CE Value="Italian">Italian <CE Value="Mexican">Mexican <CE Value="Seafood">Seafood
</Choice>
</HDML>
Первый элемент в файле сообщает браузеру (или другим программистам) информацию о версии спецификации 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
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetAmerican Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallAmerHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>American<br>
<CE Value=AllStar& gtAll Star Cafe <CE Value=MarysDiner>Mary's Diner <CE Value=Timberline>Timberline Inn
</Choice>
</HDML>";
}
elsif ($RestType eq "Chinese")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetChinese Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallChineseHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Chinese<br>
<CE Value=ChinaGarden>China Garden <CE Value=GoldenDragon>Golden Dragon <CE Value=PlumTree>Plum Tree Inn
</Choice>
</HDML>";
}
elsif ($RestType eq "FastFood")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetFastFood Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallFastFoodHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Fast Food<br>
<CE Value=BurgerKing>Burger King <CE Value=McDonalds>McDonald's <CE Value=TopSpot>Top Spot
</Choice>
</HDML>";
}
elsif ($RestType eq "HealthFood")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetHealthFood Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallHealthFoodHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Health Food<br>
<CE Value=GeneralNutrition& gtGeneral Nutrition <CE Value=HealthExpress>Health Express <CE Value=LivingHealthy>Living Healthy
</Choice>
</HDML>";
}
elsif ($RestType eq "Italian")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetItalian Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallItalianHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Italian<br>
<CE Value=Marios>Mario's <CE Value=OliveGarden>Olive Garden <CE Value=PapaMurphys>Papa Murphy's
</Choice>
</HDML>";
}
elsif ($RestType eq "Mexican")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetMexican Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallMexicanHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Mexican<br>
<CE Value=BajaFresh>Baja Fresh <CE Value=Guadalajara>Guadalajara Grill <CE Value=LaVilla>La Villa
</Choice>
</HDML>";
}
elsif ($RestType eq "Seafood")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=GetSeafood Key=RestName>
<Action Type=Accept Label=Pick Task=GO Method=Post PostData=\$RestName Dest=RestCallSeafoodHDML.pl>
<Action Type=Soft1 Label=Back Task=GO Dest=../RestaurantCall/RestaurantCall.hdml>
<Center>Restaurants<br> <Center>Seafood<br>
<CE Value=KPSeafood>K & P Seafood <CE Value=FishCompany>Las Vegas Fish Company <CE Value=SevenSeas>Seven Seas
</Choice>
</HDML>";
}
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
<HDML Version=3.0 Markable=True TTL=0>
<Display Name=KPSeafood>
<Action Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl>
<Action Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212>
<Center>Restaurants<br> <Center>Seafood<br> <Line>K & P Seafood<br> 111 Main Street<br> Las Vegas, NV<br> 702-555-1212
</Display>
</HDML>"; }
elsif ($RestName eq "FishCompany")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Display Name=FishCompany>
<Action Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl>
<Action Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212>
<Center>Restaurants<br> <Center>Seafood<br> <Line>Las Vegas Fish Company<br> 222 East Sahara<br> Las Vegas, NV<br> 702-555-1212
</Display>
</HDML>"; }
elsif ($RestName eq "SevenSeas")
{ $Deck = "Content-type: text/x-hdml
<HDML Version=3.0 Markable=True TTL=0>
<Display Name=SevenSeas>
<Action Type=Soft1 Label=Back Task=GO Method=Post PostData=Seafood Dest=RestCallTypeHDML.pl>
<Action Type=Accept Icon=phone1 Label=Call Task=Call Number=702-555-1212>
<Center>Restaurants<br> <Center>Seafood<br> <Line>Seven Seas<br> 100 Water Street<br> Las Vegas, NV<br> 702-555-1212
</Display>
</HDML>"; }
print $Deck;
Элемент <Action> с параметром Task= Call определяет номер, который будетвызывать браузер, когда пользователь нажимает кнопку ввода (Accept), на которой может быть нанесено слово Call (Вызов) или, если телефон поддерживаетпиктограммы, изображение телефона.
Размещение предварительного заказа в ресторане
Размещение предварительного заказа в ресторане
В предыдущем приложении пользователь мог выбирать ресторан и, при желаии, звонить в выбранное место. Однако во многих случаях пользователи предпочтут делать заказ без необходимости говорить с кем-либо из персонала ресторана. В каталоге Главы 16 на CD-ROM, прилагаемом к данной книге, вы,найдетеприложение RestaurantReservation, полученное модификацией предыдущего приложения, которое предоставляет пользователю информацию, необходимую дляввода данных по заказу, как показано на Рисунок 16.4.
Вывод информации о конкретном ресторане
Рисунок 16.3. Вывод информации о конкретном ресторане
Вывод ресторановс определенным видом кухни
Рисунок 16.2, Вывод ресторановс определенным видом кухни