background image

Na podstawie Tutorial20.pdf 
 
 
Przykład dialogu: 
 
S: 
Please enter your 4 digit pin code. 
U: 1234 
S: Good Morning Mr. Eisenzopf. How may I help you? 
 
Dokument VXML implementujący ten interfejs: 
 
<?xml version="1.0"?> 
<vxml version="1.0" > 
<form id="hello"> 

<field name="pin"> 

<prompt>Please enter your 4 digit pin code.</prompt> 
<filled> 
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/> 
</filled> 

</field> 

</form> 
</vxml> 
 
Wejście użytkownika dla pola “pin” jest przekazywane do skryptu CGI 
spec

yfikowanego za pomocą atrybutu next elementu submit. Skrypty dla wejść 

VXML są praktycznie takie same jak skrypty dla formularzy HTML. 
 

background image

Element filled 

może pojawić się albo wewnątrz elementu field

 
<?xml version="1.0"?> 
<vxml version="1.0" > 
<form id="hello"> 

<field name="pin"> 

<prompt>Please enter your 4 digit pin code.</prompt> 
<filled> 
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/> 
</filled> 

</field> 

</form> 
</vxml> 
 
albo wewnątrz formularza form, ale poza polem: 
 
<?xml version="1.0"?> 
<vxml version="1.0" > 
<form id="hello"> 

<field name="pin"> 

<prompt>Please enter your 4 digit pin> 

</field> 
 
<field name="ccnum"> 

<prompt>Please enter your credit card number.</prompt> 

</field> 
<filled> 
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/> 
</filled> 

</form> 
</vxml> 
 
To umożliwia sterowanie wejściem zarówno na poziomie pola i/lub formularza. 
Można przetwarzać wartości pola za każdym razem, gdy są wpisane lub można 
czekać aż wszystkie pola zostaną wypełnione. 
 

background image

Są inne atrybuty, których można użyć do sterowania jak i co się wysyła. 
 
Domyślnie wysyłane są wartości formularza poprzez protokół HTTP do 
określonego miejsca URL za pomocą metody GET (umieszcza się w adresie 
URL, po znaku „?‟, pary „parametr=wartość‟ połączone znakiem „&‟)
  
Można zastosować metodę POST za pomocą atrybutu method
 
<submit next=http://www.webreference.com/cgi-bin/perl/20/pin.pl method="POST"/> 
 
Podczas przesyłania wartości pól za pomocą elementu filled z poziomu formularza (w 
przeciwieństwie do pola) można kontrolować (za pomocą atrybutu namelist), które 
pola są przesyłane: 
  
<submit next=http://www.webreference.com/cgi-bin/perl/20/pin.pl namelist="ccnum"/> 
 
Dodatkowo jest wiele innych sposobów oddziaływania na pole wejściowe 
 
Można odesłać użytkownika do innego formularza: 
 
<filled> 

<goto next="#first_name"/> 

</filled> 
 
lub włączyć wiadomość: 
  
<filled> 

<prompt>Thank you Mr. Rich. It will take 24 to 48 hours money into your off-

shore accounts.</prompt> 

<submit next="http://www.textant.com/cgi-bin/launder.pl"/>  

</filled> 
 

background image

Można przetwarzać wejścia bez przekazywania ich do skryptów 
Najprostszą alternatywą jest element result. Jeżeli wartość atrybutu name pasuje do 
wartości pola, będzie wykonana instrukcja wewnątrz:  
 
<?xml version="1.0"?> 
<vxml version="1.0" > 
<form id="hello"> 

<field name="pin"> 

<prompt>Please enter your 4 digit pin code.</prompt> 
<filled> 

<result name="1234"> 

<prompt>Good Morning Mr. Eisenzopf. How may I help 

you?</prompt> 

<goto next="#secret_laboratory"/> 

</result> 
 
<result name="2468"> 
<prompt>Good Morning Mr. King. How may I help 

you?</prompt> 

<goto next="#control_room"/> 
</result> 

</filled> 

</field> 

</form> 
</vxml> 
 
Element result 

może dopasowywać proste łańcuchy, nie ma mocy instrukcji 

warunkowych, jak if else.  
D

ziała dobrze, gdy jest predefiniowany zbiór wejść, które użytkownik może 

wprowadzić. Jeżeli treść będzie bardziej dynamiczna, jak kod PIN, wtedy może być 
potrzebna instrukcja warunkowa. 

 

background image

Dynamiczne aplikacje VXML 

Dalej wykorzystany zostanie scenariusz z PIN-em.  
Opracowany zostanie skrypt CGI, który dostarczy odpowiedź na wejście 
użytkownika. 
Zakończony formularz VXML ma następującą postać (Example 4. [example4.xml]): 
 
<?xml version="1.0"?> 
<vxml version="1.0" > 
<form id="login"> 

<field name="pin"> 

<grammar> 

<![CDATA[ 
Four_digits 
]]> 

</grammar> 
<prompt>Please enter your 4 digit pincode.</prompt> 
<filled> 

<submit next="http://www.webreference.com/cgi-

bin/perl/20/pin.pl"/> 
</filled> 
<noinput count="1">No PIN entered. 

<reprompt/> 

</noinput> 
<noinput count="2">You must enter your PIN number to proceed. 

<reprompt/> 

</noinput> 
<noinput count="3">Please press or say exactly four numbers. 
</noinput> 
<nomatch count="1">Invalid pin code. 

<reprompt/> 

</nomatch> 
<nomatch count="2">Please press or say exactly four numbers. 

<reprompt/> 

</nomatch> 
<nomatch count="3">Too many attempts. Please call back another 
<exit/> 
</nomatch> 

</field> 

</form> 
</vxml> 
 
Skrypt CGI zostanie napisany w Perl. 

Umiejętność wykorzystania modułu Perl 

CGI pm 

pozwoli operować na wejściowym formularzu VXML. 

 
#!/usr/bin/perl -w 
use strict; 
use CGI; 
my %users = ( 

'1234' => 'Eisenzopf', 
'2468' => 'King' 

background image

); 
my $q = new CGI; 
my $pin = $q->param('pin'); 
print "Content-Type: text/xml\n\n"; 
print <<VXML; 
<?xml version="1.0"?> 
<vxml> 

<form> 
<block> 

VXML 
print "Good Morning Mr. $users{$pin}. How may I help you?" 
|| "$pin is an invalid pin code."; 
print <<VXML; 

</block> 

</form> 
</vxml> 
VXML 
 
Została napisana nowa wersja modułu CGI.pm. Wartość pola pin uzyskujemy za 
pomocą linii kodu: 
 
my $pin = $q->param('pin'); 
 
Jest ważne, aby upewnić się, że zwracany jest właściwy nagłówek http. Domyślny 
nagłówek nie będzie pracował właściwie. Należy użyć następującej instrukcji jako 
pierwszego wyjścia do Tellme: 
 
print "Content-Type: text/xml\n\n"; 
 
Pozostała część skryptu jest zwykłym perlem. Odnajdujemy nazwisko użytkowników 
wykorzystując ich kody PIN. Jeżeli znajdziemy nazwisko witamy ich, w przeciwnym 
wypadku zwracamy błąd. Jest to bardzo prosty skrypt, lecz jest to pierwsza próba 
opracowania dynamicznej aplikacji VXML.