Al pari degli altri linguaggi di sviluppo, VoiceXML, è
in grado di gestire stati condizionali e variabili.
In questa lezione, l'utente immetterà il numero di partecipanti
che intendono usare la nostra Conference Room, il programma, poi,
userà questo input per determinare quale tipo di sala (room) dedicargli
1. |
<?xml version="1.0"?> |
2. |
<vxml version="1.0"> |
3. |
|
4. |
<!-- |
5. |
6. |
7. |
8. |
9. |
--> |
10. |
11. |
<var name="r" expr=""/> |
12. |
Variabili
Il primo nuovo elemento che troviamo è l'introduzione della
variabile "r" alla linea 11. Questa variabile conterrà
il nome della sala (room) da assegnare alla richiesta.
In VXML le variabili devono essere esplicitate. Gli unici attribuiti
per l'elemento VAR sono name,
per il nome della variabile, e expr
per il valore iniziale. L'attributo EXPR
non è obbligatorio, ma serve per inizializzare la variabile
una volta creata.
Utilizzo locale e globale
Le variabili in VXML hanno una precisa area di utilizzo. Le variabili cosi' come
altri oggetti che vedremo in seguito, sono accessibili soltanto nell'area
nella quale vengono dichiarati (tranne alcune eccezioni).
In VXML l'area di utilizzo e' rappresentata da un BLOCK,
un FORM, o un DOCUMENT.
Qualora una variabile venga dichiarata in una determinata area (es:
un BLOCK) non sarà utilizzabile in un altro block (vedremo
poi come sarà possibile accedere nuovamente a quella variabile).
Analogamente, una variabile dichiarata all'interno di un form, strutturato
in diversi blocchi, sarà accessibile da tutti i blocchi.
Una variabile il cui utilizzo e' limitato ad una certa parte dell' applicazione (form o block) e' detta di tipo "LOCALE".
L'area di utilizzo è determinata dal punto in cui la
variabile viene dichiarata, perciò, una variabile dichiarata
all'interno dei tag <VXML> sarà accessibile da ogni punto
del nostro codice, ed avrà una validità "GLOBALE"
Analogamente alle variabili, anche gli elementi NOMATCH
e NOINPUT possono avere una valenza
globale.
Al posto di scrivere una serie di nomatch e noinput per ogni elemento
MENU o FIELD, si potranno codificare una risposta Nomatch
ed una risposta noinput globali.
13. |
<nomatch> |
14. |
Spiacente, non sono riuscito
a capire cosa hai detto. |
15. |
Se hai bisogno di aiuto
di "HELP" |
16. |
</nomatch> |
17. |
|
18. |
<noinput> |
19. |
Rispondi prego, se hai
bisogno di aiuto di "HELP" |
20. |
</noinput> |
Gli elementi nomatch e noinput
definiti dopo il tag vxml saranno applicati ad ogni evento nomatch e noinput
all'interno del documento.
L'uso di questi elementi a valenza globale ha però un difetto.
Nella lezione precedente abbiamo visto che eravamo in grado di tenere
il conto dei differenti nomatch e noinput, e specificare differenti
risposte a seconda del numero di tentativi.
Tale conteggio è possibile soltanto qualora ci si
trovi all'interno di un form, mentre gli elementi globali nomatch
e noinput non tengono traccia del numero di tentativi.
Pertanto usando elementi nomatch e noinput globali, si "risparmia" scrittura
di codice, ma si perde la possibilità di differenziare i messaggi
di errore.
Abbiamo detto che la valenza di una variabile dipende dal punto del
codice in cui essa viene dichiarata, ma cio' non è
sempre vero.
Per definire l'area di utilizzo di una determinata variabile è
disponibile anche l'attributo SCOPE.
Nelle righe seguenti (riga 21) il form ha un attributo SCOPE = "document",
il che significa che gli elementi filled
saranno accessibili anche al di fuori del form "welcome"
Il codice seguente chiede all'utente se intende prenotare una conference
room, poi testa la risposta usando una istruzione di tipo IF /
ELSE per "pilotare" la
successiva esecuzione del codice.
21. |
<form id="welcome"
scope="document"> |
22. |
<field name="intro"> |
23. |
<grammar>
yes | no | help </grammar> |
24. |
<prompt>
Benvenuto nel sistema di prenotazione Cambrige |
25. |
conference
room. Vuoi prenotare una |
26. |
conference
room? |
27. |
</prompt> |
28. |
<help>
Se si vuole prenotare una conference room dire "yes",
altrimenti |
29. |
dire
"no" |
30. |
</help> |
31. |
<filled> |
32. |
33. |
<if
cond="intro=='no' "> |
34. |
<assign
name="x" expr="1"/> |
35. |
<goto
nextitem="end"/> |
36. |
<else/> |
37. |
38. |
<goto
next="#howmany"/> |
39. |
</if> |
40. |
</filled> |
41. |
</field> |
42. |
</form> |
Nota alle righe 35 e 38:
La sintassi per spostare l'esecuzione da un punto all'altro del codice
può essere scritta in due diversi modi:
nexitem = " etichetta " (es:
linea 35)
oppure
next = " # etichetta " (es:
linea 38)
Nel caso di form e blocchi le due sintassi sono equivalenti
Help
La risposta dell'utente verrà salvata nel campo "intro".
Alla riga 23 dichiariamo la nostra grammatica (vedere lezione precedente),
e oltre le parole "yes" e "no" viene introdotto l'elemento
HELP.
Qualora l'utente dica "help" il programma leggerà
le linee (28 e 29) incluse tra i tag <help></help> ed aspetterà
un ulteriore input da parte dell'utente.
Analogamente a quanto detto precedentemente per gli elementi nomatch
e noinput, anche l'elemento help può essere dichiarato all'interno
dei tag <vxml> ed avere così valenza GLOBALE.
Condizione IF / ELSE
Nel momento in cui l'utente fa una scelta corretta (compatibilmente
con la grammatica da noi definita), il campo "intro" viene riempito
e l'elemento filled viene processato.
L'elemento IF comincia alla linea 33
dove viene valutata la condizione "intro" = NO, se la condizione è
vera si crea una nuova variabile "X", le si assegna il
valore 1 (linea 34) e si sposta l'esecuzione del programma al blocco
contrassegnato dall'etichetta "end" (linea 35).
Attenzione: affinchè l'espressione condizionale sia valutata
deve essere completamente gestita come stringa.
La condizione "no" verrà perciò racchiuso tra
apici (') perche', in VXML, tutte le stringhe non numeriche devono essere racchiuse
tra di essi.
La linea 36 inizia la gestione della procedura ELSE,
in cui , visto che il valore di "intro" non e' 'no', l'esecuzione verra' spostata all' etichetta
"howmany"
ELSE è un figlio di IF ed infatti il
il tag di chiusura di IF (</if>) si trova alla linea 39
Grammatiche standard
VXML fornisce numerose grammatiche standard per validare e riempire
un nostro campo. Queste grammatiche "built-in" possono essere di
diversi tipi: valori booleani, date, cifre, valute, numeri, numeri di telefono,
ore e lettere.
La prossima sezione di codice interroga l'utente sul numero di persone
che devono partecipare e salva il valore in un campo "SIZE",
per poi scegliere la stanza più appropriata.
43. |
44. |
|
45. |
<form
id="how_many" scope="document"> |
46. |
|
47. |
<field
name="size" type="Number"> |
48. |
<grammar>
help </grammar> |
49. |
<prompt> |
50. |
Quante persone intendi invitare alla conferenza? |
51. |
</prompt> |
52. |
<help> |
53. |
Scegli un numero compreso tra 1 e 40 |
54. |
</help> |
Alla linea 47 viene dichiarato il nuovo attributo size per l'elemento
field.
Esso determina il tipo di grammatica che verrà usata ed il modo
in cui il valore del campo sarà salvato in memoria.
Qualora, come in questo caso, type sia uguale a "Number"
il campo verrà riempito con qualsiasi valore numerico e gli
input non numerici saranno considerati come nomatch.
Uso di caratteri speciali
Supponendo che l'utente abbia fornito un valore numerico, l'esecuzione
proseguirà assegnando una stanza in base a tale valore.
L'elemento filled userà una serie
di if / else al fine di valutare quale
sia la stanza adatta al valore inserito dall'utente.
Ma facciamo attenzione alla prima istruzione di if, dove viene valutato
il valore immesso.
55. |
<filled> |
56. |
57. |
|
58. |
<if
cond="val (size) <=40 && val(size)
>=21"> |
59. |
60. |
<assign
name="r" expr=" ' V.I.P.' " /> |
61. |
|
62. |
<goto
nextitem="end" /> |
Cosa sono quei simboli alla riga 58? Vi starete chiedendo
come mai i tags sono passatti dalla lingua inglese all' ostrogoto...
VXML usa molti caratteri speciali tra i quali quelli di maggiore e minore
( < > ) ed e commerciali ( & ) come controlli, mettendoli in
stringhe letterali che altrimenti risulterebbero confuse per il browser.
< verrà tradotto con " < ", & con
" & " ed infine, > con " > ".
L'intera stringa verrà interpretata dal browser come :
val(size) <= 40 && val(size)>= 21
e quindi, in linguaggio comune:
il valore della variabile size è minore o uguale a 40 e maggiore
o uguale a 21.
Queste sequenze di caratteri (escape) DEVONO essere sempre usate
qualora si intenda inserire caratteri speciali all'interno di stringhe
letterali.
Tornando al nostro codice, se la condizione alla riga 58 viene soddisfatta
il programma assegna il valore " V.I.P. " alla variabile
"r" e salta alla blocco end.
La funzione VAL
La funzione val viene introdotta nella
linea 58, all'interno della condizione IF.
Quando il campo "SIZE" viene "riempito" con l'input dell'utente viene
salvato come stringa, successivamente pero' esso viene utilizzato come intero all' interno dell'
uguaglianza.
Al fine di poter usare una stringa come intero occorre prima convertirla,
appunto con la funzione val.
Il resto del codice sono altre condizioni, con relativa assegnazione
di valore alla variabile "r".
Si verifica se il valore è tra 11 e 20 (riga 63) e si assegna
alla variabile il valore 'Executive' (riga 66).
Qualora il valore di size sia invece compreso tra 1 e 10 (riga 69),
si assegna il valore di 'Brainstorm' (riga 72).
Alla riga 76 si verifica, infine, che il valore di size non sia inferiore
a 1 o maggiore di 40, ed in tal caso si legge un messaggio di errore
all'utente (riga 77, istruzione prompt),
e si sposta l'esecuzione del codice nuovamente al form di inserimento
di size, dando all'utente un' ulteriore possibilità di inserire
il numero di partecipanti
63. |
<elseif
cond="val(size) <= 20 && val(size) |
64. |
>=11"/> |
65. |
66. |
<assign
name="r" expr="'Executive'"/> |
67. |
68. |
<goto
nextitem="end"/> |
69. |
<elseif cond="val(size)
>0 && val(size) |
70. |
<=10"/> |
71. |
72. |
<assign
name="r" expr="'BrainStorm'"/> |
73. |
74. |
<goto
nextitem="end"/> |
75. |
76. |
<elseif
cond="val(size) >= 41 || val(size) <= 0"/> |
77. |
<prompt>Hai
inserito un valore fuori dal |
78. |
range.</prompt> |
79. |
80. |
<clear namelist="size"/> |
81. |
82. |
<goto nextitem="size"/> |
83. |
</if> |
84. |
</filled> |
85. |
</field> |
Le ultime righe di codice confermano le scelte dell'utente ed indicano
la stanza che è stata assegnata.
La linea 89 si verifica se il valore della variabile "X" e' uguale ad "1" (
allla linea 32 X veniva posta ad "1" qualora l'utente decidesse di non
prenotare alcuna stanza), e se la condizione è verificata viene letto
un generico messaggio di saluto (riga 90)
Altrimenti, vengono ripresi i valori di "size" e di "r"
ed immessi all'interno del messaggio di conferma che viene letto all'utente
alla riga 94
86. |
87. |
|
88. |
<block
name="end"> |
89. |
<if
cond="x==1"> |
90. |
<prompt>Grazie
per aver usato il sistema di prenotazione Cambridge |
91. |
Conference
Room.</prompt> |
92. |
<exit/> |
93. |
<else/> |
94. |
<prompt>Hai
scelto <value expr="size"/> partecipanti |
95. |
per
la nostra <value expr="r"/> sala conferenze.</prompt> |
96. |
<prompt>Grazie
per aver usato il sistema di prenotazione Cambridge |
97. |
Conference
Room.</prompt> |
98. |
<exit/> |
99. |
</if> |
100. |
</block> |
101. |
</form> |
102. |
</vxml> |
Anche per questa quinta lezione that's all...