Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I menu

Impostare un menu a scelta multipla e gestire gli eventi
Impostare un menu a scelta multipla e gestire gli eventi
Link copiato negli appunti

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:

Listato 2.0: Menu semplice

<?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:

Listato 2.1: Menu semplice con dtmf="true"

...
<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:

Listato 2.2: Menu semplice con dtmf "true" e gestori di eventi

...
<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.

Listato 2.3: Menu con enumerate

...
<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 per generare un prompt del tipo per opzione premi numero, e abbiamo spostato il prompt della singola opzione all'interno del tag choice, in questo caso il risultato del prompt sarà:

"Benvenuto, premi 1 per sport, 2 per meteo 3, per orosocopo,"

Ti consigliamo anche