Пособие по написанию WAP сайтов
ГЛАВА 16
Рассмотрение приложения Restaurant
Рассмотрение приложения Restaurant.hdml
Размещение предварительного заказа в ресторане
В Главе 4 вы узнали, как разработать приложение, позволяющее пользователямпросматривать время начала сеансов кинофильмов, демонстрируемых в определенных кинотеатрах. В данной главе вы создадите приложение, использующеесерию Peri-сценариев, которые формируют WML- или HDML-страницы, отображающие информацию по определенным ресторанам. Обнаружив нужный ресторан, вы можете воспользоваться вашим сотовым телефоном для автоматическогозвонка в этот ресторан. При запуске приложения на экране отображается списокразных типов ресторанов, как показано на Рис. 16.1. После того как пользовательвыберет тип предпочитаемой кухни, приложение выводит список соответствующих ресторанов, как показано на Рис. 16.2. Затем, после выбора пользователем некоторого конкретного ресторана, приложение отображает на экране егоадрес и номер телефона, как показано на Рис. 16.3. Далее пользователь можетвыбрать телефонный номер ресторана и нажать кнопку вызова ("Call") для звонка в ресторан.
Если вы еще не установили пакет инструментального программного обеспечения (SDK) для разработки WAP-приложений,аналогичный SDK, который вы можете загрузить с Web-caumawww.openwave.com, то проверить работу приложенияRestaurant можно с помощью сотового телефона с WAP-функциями, набрав в качестве URL (Универсальный указательресурсов) waplib.com/RestaurantCall/RestaurantCall.hdml илиwaplib.com/RestaurantCall/RestaurantCall.wml, в зависимости оттого, какой язык, HDML или WML, поддерживает ваш телефонный браузер.
Рассмотрение приложения 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>All 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>General 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.1. Вывод типов ресторанов
Вывод ресторановс определенным видом кухни
Рис.. 16.2, Вывод ресторановс определенным видом кухни
Вывод информации о конкретном ресторане
Рис.. 16.3. Вывод информации о конкретном ресторане
Приглашение на ввод данных о заказе
Рис.. 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-страницу.