Il primo elemento di dialogo che esaminiamo è il <menu>: esso permette all'utente di operare una scelta tra diverse opzioni e spostare il flusso dell'applicazioni ad un diverso punto in base alla risposta. Facciamo subito un esempio:
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd">
<menu>
<property name="inputmodes" value="dtmf"/>
<prompt>
per lo sport premi 1, per il meteo premi 2, per l'oroscopo premi 3.
</prompt>
<choice dtmf="1" next="http://www.sport.example.com/vxml/start.vxml"/>
<choice dtmf="2" next="http://www.meteo.example.com/start.vxml"/>
<choice dtmf="3" next="http://www.oroscopo.example.com/start.vxml"/>
</menu>
</vxml>
Un menu è composto da quattro parti:
-
un header: che contiene il tag <menu>, e che apre la sezione di codice dedicata a questo elemento di dialogo.
-
un prompt: che legge all'utente le scelte possibili
-
le scelte <choice> : ognuna di queste opzioni descrive la parola o il tasto (attributo dtmf="..." per i tastierini del telefono) che deve essere riconosciuto, e quale evento deve essere invocato qualora l'utente scelga quell'opzione.
Nel nostro esempio abbiamo spostato il flusso su un file diverso attraverso l'attributo next="..."
- uno o più gestori di eventi: ovvero dei tag appositi, che vedremo tra poche righe, che si occupano di descrivere cosa succede qualora l'utente non scelga nessuna di quelle opzioni, la scelta non sia chiara, o altro.
Un altro modo per indicare una successione di opzioni numeriche è quella di impostare nel tag <menu> l'attributo dtmf="true", in questo caso l'interprete saprà che al primo evento corrisponderà il tasto 1, al secondo il tasto 2 e così via.
Il nostro codice così diventa più snello del precedente:
...
<menu dtmf="true">
<property name="inputmodes" value="dtmf"/>
<prompt>
per lo sport premi 1, per il meteo premi 2, per l'oroscopo premi 3.
</prompt>
<choice next="http://www.sport.example.com/vxml/start.vxml"/>
<choice next="http://www.meteo.example.com/start.vxml"/>
<choice next="http://www.oroscopo.example.com/start.vxml"/>
</menu>
...
Proviamo a capire meglio cosa accade: ogni volta che l'interprete si trova all'interno di un menu, ovvero il codice delimitato tra <menu> e </menu>, legge il prompt all'utente e si mette in attesa per la risposta.
A questo punto possono accadere tre diverse cose:
- l'utente sceglie una delle opzioni: in tal caso l'esecuzione si sposta sul tag <choice> corrispondente ed esegue il codice corrispondente
- la scelta dell'utente non è all'interno delle scelte possibili, oppure, il motore di riconoscimento ci restituisce una parola che non corrisponde ad alcuna scelta, in questo caso si scatena un evento di "nomatch".
- qualora l'utente non prema alcun tasto, o non dica nulla, o parli a bassa troppo voce, cioè in tutti quei casi in cui l'input non sia stato rilevato si scatena un evento di "noinput".
I gestori di eventi
I gestori di eventi ci permettono di far fronte ai flussi non previsti dell'applicazione e ci permettono di eseguire azioni specifiche, come ad esempio l'emissione di un prompt specifico che indichi all'utente dettagli sul cosa fare al verificarsi di un certo errore.
Inserendo i due gestori di eventi appena citati il nostro codice diventa:
...
<menu dtmf="true" >
<property name="inputmodes" value="dtmf"/>
<prompt>
per lo sport premi 1, per il meteo premi 2, per l'oroscopo premi 3.
</prompt>
<choice next="http://www.sport.example.com/vxml/start.vxml"/>
<choice next="http://www.meteo.example.com/start.vxml"/>
<choice next="http://www.oroscopo.example.com/start.vxml"/>
<noinput>
<prompt>
Non ho sentito la tua scelta premi 1 per lo sport, 2 per il meteo, 3 per l'oroscopo
</prompt>
</noinput>
<nomatch>
<prompt>
Sono spiacente, non ho capito la tua scelta. Premi 1 per lo sport, 2 per il meteo, 3 per l'oroscopo
</prompt>
</nomatch>
</menu>
...
Il tag <enumerate>
Quando vogliamo ottenere una serie di opzioni numerate in successione possiamo snellire ancora il codice usando un il tag <enumerate>, che genera un template da applicare ad ogni opzione all'interno del menu, assegnando un numero progressivo ad ogni elemento.
...
<menu dtmf="true" >
<property name="inputmodes" value="dtmf"/>
<prompt>
Benvenuto, premi
<enumerate>
<value expr="_dtmf"/> per <value expr="_prompt"/>,
</enumerate>
</prompt>
<choice next="http://www.sport.example.com/vxml/start.vxml">sport</choice>
<choice next="http://www.meteo.example.com/start.vxml">meteo</choice>
<choice next="http://www.oroscopo.example.com/start.vxml">oroscopo</choice>
<noinput>
<prompt>
Non ho sentito la tua scelta premi 1 per lo sport, 2 per il meteo, 3 per l'oroscopo
</prompt>
</noinput>
<nomatch>
<prompt>
Sono spiacente, non ho capito la tua scelta. Premi 1 per lo sport, 2 per il meteo, 3 per l'oroscopo
</prompt>
</nomatch>
</menu>
...
Abbiamo usato
"Benvenuto, premi 1 per sport, 2 per meteo 3, per orosocopo,"