Propriété de métadonnées dans les composants de réponse communs
Vous utilisez la propriété Metadata dans les composants Common Response pour définir comment les messages seront affichés pour les utilisateurs.
metadata:
responseItems:
- text: "To which location do you want the pizza to be delivered?"
type: "text"
name: "What location"
separateBubbles: true
globalActions:
- label: "Send Location"
type: "location"
name: "SendLocation"
Propriété | Description | Obligatoire? |
---|---|---|
responseItems |
Liste des éléments de réponse, chacun ayant généré un nouveau message envoyé au client de clavardage (ou plusieurs messages lorsque vous définissez l'itération pour l'élément de réponse à l'aide de la propriété iteratorVariable ou d'une combinaison des propriétés iteratorVariable et iteratorExpression ). Définissez les éléments de réponse en utilisant ces valeurs :
|
Oui |
globalActions |
Liste d'actions globales, c'est-à-dire qui ne sont pas spécifiques à un élément de réponse. Ces actions sont généralement affichées au bas de la fenêtre de clavardage. Dans Facebook Messenger, par exemple, ces options sont appelées réponses rapides. | Non |
keywords |
Liste de mots clés correspondant à ceux entrés par un utilisateur pour les données utiles de republication correspondantes. Les mots clés prennent en charge les canaux textuels où les boutons d'action ne s'affichent pas. | Non |
Propriété | Description | Obligatoire? | |
---|---|---|---|
type |
Type d'élément de réponse qui détermine le format du message. Vous pouvez définir un message en tant que text , attachment ou cards .
|
Oui | |
name |
Nom de l'élément de réponse utilisé à l'interne. Il n'est pas utilisé lors de l'exécution. | Non | |
iteratorVariable |
Ajoute de manière dynamique plusieurs éléments de texte, mot clé ou fichier joint à la réponse en répétant les éléments de variable. | Non | |
iteratorExpression |
Expression FreeMarker utilisée pour afficher les valeurs d'un tableau imbriqué dans la variable spécifiée par la propriété iteratorVariable .
Par exemple, si vous avez réglé la valeur de la propriété |
Non | |
visible |
Détermine la manière dont les messages sont affichés suivant l'entrée et le canal de l'utilisateur. Voir La propriété visible. | Non | |
rangeStart |
Si vous avez spécifié une valeur iteratorVariable , vous pouvez créer un sous-ensemble d'éléments de réponse en combinant les propriétés rangeStart et rangeSize . Vous pouvez entrer une valeur codée de façon permanente ou utiliser une expression FreeMarker référençant une variable de flux de dialogue qui contient le début de l'intervalle. En utilisant une variable rangeStart , vous pouvez ensuite passer à la page du jeu de données suivant en définissant la variable rangeStart dans les données utiles de l'option de navigation. Vous pouvez voir un exemple des propriétés rangeStart et rangeSize dans l'état OrderPizza de CrcPizzaBot.
|
Non | |
rangeSize |
Nombre d'éléments de réponse affichés comme indiqué par les propriétés iteratorVariable et rangeStart .
|
Non | |
channelCustomProperties |
Liste des propriétés qui déclenchent des fonctions propres à un canal. Étant donné que ces fonctions sont propres à la plate-forme, elles ne font pas partie du groupe de pages Réponse commune. Elles ne peuvent donc pas être contrôlées par les propriétés de niveau racine ou élément de réponse du groupe. Vous pouvez trouver un exemple de cette propriété dans l'état OrderPizza de CrcPizzaBot. Pour des informations détaillées sur l'utilisation de channelCustomProperties et sur les propriétés disponibles pour chaque canal, voir Extensions propres au canal.
|
Non |
Propriétés des métadonnées de mot clé
.
L'extrait de code suivant illustre comment un jeu de mots clés peut être généré à partir d'une variable
pizzaSize
qui contient la liste des valeurs définies pour une entité PizzaSize.
responseItems:
- type: "text"
text: "What size of pizza do you want?"
actions:
- label: "(${enumValue[0]?upper_case})${enumValue?keep_after(enumValue[0])}"
type: "postback"
keyword: "${enumValue[0]?upper_case},${(enumValue?index)+1}"
payload:
variables:
pizzaSize: "${enumValue}"
iteratorVariable: "pizzaSize.type.enumValues"
Propriété | Description | Obligatoire? |
---|---|---|
keyword |
Liste de mots clés qui déclenchent les données utiles de republication définies par la propriété payload . Vous pouvez utiliser une expression FreeMarker pour retourner les mots clés que la propriété iteratorVariable génère à partir des entités de liste de valeurs à l'aide des propriétés type et enumValues (iteratorVariable: "pizzaSize.type.enumValues" ).
|
Oui |
label |
Étiquette de l'action, qui peut être une chaîne de texte ou une expression Apache FreeMarker. Par exemple, une expression qui indique un mot clé de deux lettres apparaît comme suit :
|
Non |
skipAutoNumber |
Réglez à true pour supprimer la numérotation automatique d'un élément de clé lorsque l'option Enable Auto Numbering on Cards (Activer la numérotation automatique des cartes) est définie au niveau de l'assistant numérique ou de la compétence.
|
Non |
visible |
Détermine la manière dont les messages texte sont affichés selon l'entrée et le canal d'utilisateur. Voir La propriété visible | Non |
iteratorVariable |
Ajoute de manière dynamique plusieurs mots clés en passant en boucle sur les éléments stockés dans la variable indiquée. Par exemple, iteratorVariable: "pizzaSize.type.enumValues" .
|
Non |
iteratorExpression |
Expression FreeMarker utilisée pour afficher les valeurs d'un tableau imbriqué dans la variable spécifiée par la propriété iteratorVariable .
Par exemple, si vous avez réglé la valeur de la propriété |
|
payload |
Données utiles de republication, qui ont les propriétés suivantes.
|
Extraire des mots clés des messages
Le composant déclenche une republication lorsque les utilisateurs entrent un nombre, mais vous pouvez étendre votre compétence pour qu'elle prenne en charge une entrée plus générale telle que La première ou essayons la une. Pour ce faire, créez une variable de tableau pour les expressions de mot clé (par exemple, premier, 1er, un, deuxième, 2e, deux, etc.)
keyword
des métadonnées. Par exemple, c'est à quoi cela peut ressembler dans un flux pour commander une pizza.- keyword: "${pizzas.name},<#if pizzas?index <KEYWORDS_VAR.value?size>${numberKeywords.value[pizzas?index].keywords}</#if>,<#if pizzas?index==cardsRangeStart?number+[cardsRangeStart?number+3,pizzaCount.value?number-cardsRangeStart?number-1]?min>last</#if>"
Dans cette définition, le dernier mot clé est basé sur le début de l'intervalle courant. Il est réglé à la dernière pizza actuellement affichée, selon le nombre de fois où le client a entré "more".La propriété visible
visible
facultative.
Propriété | Description | Obligatoire? |
---|---|---|
expression |
Directive Apache FreeMarker qui montre ou masque conditionnellement le texte, la carte ou le fichier joint. Par exemple, l'état OrderPizza de CrcPizzaBot utilise ""<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>" |
Non |
|
Pour include et exclude , entrez une liste séparée par des virgules de types de canal pour lesquels le texte, la carte ou le fichier joint doivent être affichés (include ) ou masqués (exclude ). Les valeurs de canal possibles sont :
|
Non |
onInvalidUserInput |
Indicateur booléen qui affiche l'élément de texte ou le fichier joint lorsque l'entrée de l'utilisateur est valide (value=false ) ou non valide (value=true ).
|
Non |
onDisambiguation |
Lorsque true , affiche uniquement l'élément de réponse, la carte ou l'action lorsqu'une invite de désambiguïsation est affichée.
|
Non |
entitiesToResolve |
Utilisez cette propriété pour créer un message personnalisé pour chaque élément d'entité composite. Ajoutez une liste séparée par des virgules de noms d'élément d'entité composite pour lesquels l'élément de réponse doit être affiché (include ) ou masqué (exclude ).
|
Non |
Propriétés des métadonnées d'action
Vous pouvez définir des actions pour une carte ou des listes, un type de réponse ou des actions globales d'un composant (par exemple, les actions de réponse rapide de Facebook). Vous ne pouvez pas configurer d'actions pour les messages avec fichier joint.
Propriété | Description | Obligatoire? | |
---|---|---|---|
type |
Type d'action :
|
Oui | |
label |
Étiquette de l'action. Pour localiser cette étiquette, vous pouvez utiliser une expression FreeMarker pour référencer une entrée dans l'ensemble de ressources de votre robot. | Oui | |
iteratorVariable |
Option permettant d'ajouter plusieurs actions en passant en boucle sur les éléments stockés dans la variable spécifiée. Vous ne pouvez pas utiliser cette propriété avec les actions de partage et d'emplacement. | Non | |
iteratorExpression |
Expression FreeMarker utilisée pour afficher les valeurs d'un tableau imbriqué dans la variable spécifiée par la propriété iteratorVariable .
Par exemple, si vous avez réglé la valeur de la propriété |
Non | |
imageUrl |
URL de l'image utilisée pour une icône identifiant une action. Vous pouvez utiliser cette propriété pour afficher une icône de bouton de réponse rapide Facebook (qui est une action globale). | Non | |
skipAutoNumbering |
Lorsque cette propriété est réglée à true , elle exclut une action de republication individuelle de la numérotation automatique. Vous pouvez utiliser cette propriété pour une réponse textuelle ou une réponse avec carte.
|
Non | |
channelCustomProperties |
Liste de propriétés dont certaines déclenchent des fonctionnalités spécifiques à un canal non contrôlées par les propriétés d'action standard. Vous pouvez trouver un exemple dans l'état OrderPizza de CrcPizzaBot.
|
Non | |
name |
Nom qui identifie l'action sur la plate-forme de l'assistant numérique. Ce nom est utilisé à l'interne et ne s'affiche pas dans le message. | Non | |
visible |
Détermine le mode d'affichage des fichiers joints suivant l'entrée et le canal d'utilisateur. Voir La propriété visible. | Non | |
payload |
Objet de données utiles pour les éléments de réponse call , url et postback . Voir Propriétés de données utiles.
|
Non |
Propriétés de données utiles
Propriété | Description | Obligatoire? |
---|---|---|
action |
Transition action déclenchée lorsque l'utilisateur choisit cette action.
|
Non |
variables |
Définit les valeurs des variables lorsque vous réglez le type d'action à postback et ajoutez des propriétés de données utiles nommées pour les variables. Lorsque l'utilisateur touche l'action, les variables sont réglées aux valeurs spécifiées par cette propriété.
|
Non |
url |
URL du site Web qui s'ouvre lorsque les utilisateurs touchent cette action. | Cette propriété est requise pour le type d'action url .
|
phoneNumber |
Numéro de téléphone appelé lorsqu'un utilisateur touche cette action. | Cette propriété est requise pour le type d'action call .
|
Rendu des actions sans republication sur les canaux textuels
Quelques points à noter pour ces propriétés de métadonnées d'action pour les composants de réponse commune.
-
Si le canal textuel prend en charge les hyperliens, vous pouvez les utiliser à la place des boutons lorsque le type de l'action globale est
url
oucall
. -
Les types d'action
share
etlocation
sont ignorés ou ne sont pas rendus.
Conseil :
Il n'est pas possible de numéroter les actions sans republication commeurl
et call
, car elles n'ont pas été transmises au moteur de dialogue et ne peuvent donc pas être déclenchées par des mots clés. Par conséquent, si vous mélangez les deux types d'action, le message de votre robot peut sembler incohérent car seules certaines options sont numérotées.
À l'aide de la trousse SDK, vous pouvez créer une sortie plus cohérente en désactivant la numérotation automatique pour la republication. Par exemple :
{
"type": "text",
"text": "Please choose one of the following options",
"actions": [
{
"type": "url",
"label": "Check out our website",
"url": "http://www.oracle.com"
},
{
"type": "postback",
"label": "<#if autoNumberPostbackActions.value>Enter 1 to Order pizza<#else>Order Pizza<#if>"
"skipAutoNumber": true
"keyword": "1"
"postback": { ...}
}
]
}
Élément de réponse textuelle
Voici les propriétés des éléments de réponse textuelle dans les composants de réponse commune.
Propriété | Description | Obligatoire? | |
---|---|---|---|
text |
Texte qui invite l'utilisateur. | Oui | |
iteratorExpression |
Expression FreeMarker utilisée pour afficher les valeurs d'un tableau imbriqué dans la variable spécifiée par la propriété iteratorVariable .
Par exemple, si vous avez réglé la valeur de la propriété |
||
iteratorVariable |
Ajoute de manière dynamique plusieurs éléments de texte, mot clé ou fichier joint à la réponse en répétant les éléments de variable. | Non | |
footerText |
Texte affiché au bas du message (au-dessous des actions de texte et de bouton, le cas échéant). Ajoutez un pied de page pour améliorer la sortie sur les canaux textuels. Comme indiqué dans la rubrique Pieds de page, vous pouvez utiliser des expressions FreeMarker pour définir le texte du pied de page pour les canaux textuels. | Non | |
separateBubbles |
Vous pouvez définir cette propriété si vous définissez également la propriété iteratorVariable . Lorsque cette propriété est réglée à true , chaque élément de texte est envoyé sous forme de message distinct, comme Pizzas et Pastas dans les états ShowMenu et OrderPizza de CrcPizzaBot. Si vous la réglez à false , un seul message texte, dont chaque élément débute sur une nouvelle ligne, est envoyé.
|
Non | |
visible |
Détermine la manière dont les messages texte sont affichés selon l'entrée et le canal d'utilisateur. Voir La propriété visible. | Non | |
actions |
Action de republication. Pour prendre en charge le texte seul, vous pouvez définir des mots clés. | Non |
showMenu
de CrcPizzaBot :
Comme il désigne postback
comme une action, il permet à la compétence de gérer le comportement inattendu de l'utilisateur, par exemple la sélection d'un élément dans un ancien message au lieu du message le plus récent.metadata:
responseItems:
- type: "text"
text: "Hello ${profile.firstName}, this is our menu today:"
footerText: "${(textOnly.value=='true')?then('Enter number to make your choice','')}"
name: "hello"
separateBubbles: true
actions:
- label: "Pizzas"
type: "postback"
keyword: "${numberKeywords.value[0].keywords}"
payload:
action: "pizza"
name: "Pizzas"
- label: "Pastas"
keyword: "${numberKeywords.value[1].keywords}"
type: "postback"
payload:
action: "pasta"
name: "Pastas"
Élément de réponse avec carte
Voici les propriétés des éléments de réponse de carte dans les composants de réponse commune.
Propriété | Description | Obligatoire? | |
---|---|---|---|
cardLayout |
Disposition de carte : horizontal (valeur par défaut) et vertical .
|
Oui | |
headerText |
Texte d'en-tête. Par exemple : headerText: "<#if cardsRangeStart?number == 0>Here are our pizzas you can order today:<#else>Some more pizzas for you:</#if>" .
|
Non | |
title |
Titre de la carte | Oui | |
description |
Description de la carte, qui s'affiche en tant que sous-titre. | Non | |
imageUrl |
URL de l'image, qui s'affiche sous le sous-titre. | Non | |
cardUrl |
URL d'un site Web. Elle s'affiche sous forme d'hyperlien sur la carte. Les utilisateurs touchent ce lien pour l'ouvrir. | Non | |
iteratorExpression |
Expression FreeMarker utilisée pour afficher les valeurs d'un tableau imbriqué dans la variable spécifiée par la propriété iteratorVariable .
Par exemple, si vous avez réglé la valeur de la propriété |
||
iteratorVariable |
Ajoute de manière dynamique plusieurs cartes à la réponse en passant en boucle sur les éléments stockés dans la variable que vous indiquez pour cette propriété. Même si vous définissez la variable en tant que chaîne, elle contient un tableau JSON lorsqu'elle est utilisée en tant que variable d'itérateur. Vous pouvez référencer des propriétés dans un objet du tableau avec une expression comme ${iteratorVarName.propertyName} . Par exemple, avec une variable d'itérateur nommée pizzas , la propriété de nom d'une pizza peut être référencée à l'aide de l'expression ${pizzas.name} .
|
Non | |
rangeStart |
Si vous avez spécifié une valeur iteratorVariable , vous pouvez créer un sous-ensemble de cartes en combinant les propriétés rangeStart et rangeSize . Vous pouvez entrer une valeur codée de façon permanente ou utiliser une expression FreeMarker référençant une variable qui contient le début de l'intervalle. En utilisant une variable rangeStart , vous pouvez ensuite passer à la page du jeu de données suivant en définissant la variable rangeStart dans les données utiles d'une option de navigation.
|
Non | |
rangeSize |
Nombre de cartes affichées comme indiqué par les propriétés iteratorVariable et rangeStart .
|
Non | |
visible |
Détermine le rendu des étiquettes d'action selon l'entrée et le canal d'utilisateur. Voir La propriété visible. | Non |
Vous pouvez affecter un jeu d'actions spécifiques à une carte particulière ou une liste d'actions jointes à la fin de la liste de cartes.
OrderPizza
inclut une définition d'élément de réponse avec carte, comme illustré dans l'extrait de code suivant :responseItems:
- type: "cards"
headerText: "<#if cardsRangeStart?number == 0>Here are our pizzas you can order today:<#else>Some more pizzas for you:</#if>"
cardLayout: "vertical"
name: "PizzaCards"
actions:
- label: "More Pizzas"
keyword: "more"
type: "postback"
skipAutoNumber: true
visible:
expression: "<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>"
payload:
action: "more"
variables:
cardsRangeStart: "${cardsRangeStart?number+4}"
name: "More"
cards:
- title: "${(textOnly=='true')?then((pizzas?index+1)+'. ','')}${pizzas.name}"
description: "${pizzas.description}"
imageUrl: "${pizzas.image}"
name: "PizzaCard"
iteratorVariable: "pizzas"
rangeStart: "${cardsRangeStart}"
rangeSize: "4"
actions:
- label: "Order Now"
type: "postback"
payload:
action: "order"
variables:
orderedPizza: "${pizzas.name}"
orderedPizzaImage: "${pizzas.image}"
name: "Order"
visible:
expression: "${(textOnly=='true')?then('false','true')}"
Rendu des cartes sur les canaux textuels
Les composants de réponse communs affichent les réponses sous forme de cartes. Lorsque votre compétence est exécutée sur un canal textuel, certaines propriétés d'élément de réponse avec carte se comportent différemment. Voici quelques points à garder à l'esprit.
-
Le défilement vertical ou horizontal n'est pas possible (comportements définis par l'option
cardLayout
). Toutes les cartes sont affichées dans une bulle de message unique, qui peut inclure un en-tête et un pied de page. Les propriétés de cartetitle
etdescription
sont séparées par un caractère de nouvelle ligne. Vous pouvez numéroter la propriété title de la carte. -
Les hyperliens sont toujours pris en charge dans les canaux textuels. L'adresse configurée pour la propriété
cardUrl
est affichée dans la bulle, et les propriétéstitle
etdescription
sont séparées par un caractère de nouvelle ligne. -
Les images spécifiées par la propriété
imageURL
sont rendues. - Le texte de l'étiquette des boutons d'action est affiché (mais les boutons eux-mêmes ne sont pas rendus). Les utilisateurs peuvent entrer le texte ou, si la numérotation automatique est activée, le numéro correspondant pour des raisons pratiques.
Optimiser les cartes sur des canaux textuels avec des mots clés
La plupart des cartes comportent une seule action, comme le bouton Order Now (Commander maintenant) de CRCPizzaBot et une action globale telle que More (Plus) pour charger la carte suivante dans le carrousel. Comme illustré dans la rubrique Rendu des cartes sur les canaux textuels?, l'étiquette de chaque action est numérotée automatiquement lorsque la compétence est exécutée sur des canaux de SMS ou textuels. Dans ces canaux, un jeu de cartes est représenté dans une bulle unique, ce qui peut devenir long et donc difficile à lire. Vous pouvez éviter ce problème en configurant des actions de republication qui ne sont pas associées aux étiquettes d'action, mais exécutées par des mots clés utilisateur (1,2,3, cheese ou more, par exemple).
Description de l'illustration cards-text-only.png
Vous pouvez masquer les étiquettes d'action lorsque votre compétence est exécutée sur des canaux textuels à l'aide de ces directives générales.
- Définissez la propriété
keywords
. Dans l'extrait de code suivant de CRCPizzaBot, l'expression${pizza.name}
définie pour la propriété keyword définit un mot clé pour chaque nom de pizza :metadata: keywords: - keyword: "${pizzas.name},<#if pizzas?index <numberKeywords.value?size>${numberKeywords.value[pizzas?index].keywords}</#if>,<#if pizzas?index==cardsRangeStart?number+[cardsRangeStart?number+3,pizzaCount.value?number-cardsRangeStart?number-1]?min>last</#if>" visible: expression: "${textOnly.value}" ...
Ces mots clés sont ajoutés uniquement lorsque la variable
textOnly
est vraie.
card
:
- Définissez la propriété
title
. Dans l'extrait de code suivant, une expression utilise la variable FreeMarkerindex
pour ajouter un nombre en préfixe du titre (retourné par${pizzas.name}
lorsque la valeur de la variabletextOnly
esttrue
). Cela signifie que lorsque le client entre more, la compétence charge une autre bulle de message contenant le groupe suivant de pizzas en commençant au numéro 5 (rangeSize: "4"
).cards: - title: "${(textOnly=='true')?then((pizzas?index+1)+'. ','')}${pizzas.name}" description: "${pizzas.description}" imageUrl: "${pizzas.image}" name: "PizzaCard" iteratorVariable: "pizzas" rangeStart: "${cardsRangeStart}" rangeSize: "4"
- Dans l'extrait de code suivant, les actions de carte (
"Order"
et"More Pizzas"
) ne sont affichées que lorsque la valeur de la variabletextOnly
estfalse
:- label: "More Pizzas" keyword: "more" type: "postback" skipAutoNumber: true visible: expression: "<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>"
- Ajoutez un pied de page qui s'affiche uniquement lorsque la valeur de la variable
textOnly
esttrue
.footerText: "<#if textOnly=='true'>Enter a pizza number to make your choice<#if cardsRangeStart?number+4 < pizzas.value?size>, or type 'more' to see more pizzas</#if></#if>"
Élément de réponse avec fichier joint
L'élément de réponse attachment
inclut les propriétés suivantes.
Propriété | Description | Obligatoire? |
---|---|---|
attachmentType |
Type de fichier joint : image , audio , video et file (fichier).
|
Oui |
attachmentURL |
URL ou source de téléchargement du fichier joint. | Oui |
Confirmation
de CrcPizzaBot utilise un élément de réponse avec fichier joint pour afficher la photo de la commande, photo différente de l'élément présenté dans le menu.metadata:
responseItems:
- text: "Thank you for your order, your ${pizzaSize} ${orderedPizza} pizza\
\ will be delivered in 30 minutes at GPS position ${location.value.latitude},${location.value.longitude}!"
type: "text"
name: "conf"
separateBubbles: true
- type: "attachment"
attachmentType: "image"
name: "image"
attachmentUrl: "${orderedPizzaImage}"
Action
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type d'action | chaîne | Oui |
label |
Texte de l'étiquette descriptive de l'action. | chaîne | Au moins un élément label ou imageUrl doit être inclus.
|
imageUrl |
Image de l'action | chaîne | Au moins une propriété label ou imageUrl unique doit être incluse.
|
style |
Style de rendu du bouton | "primary" , "danger" , "default" |
Non |
displayType |
Rendu du type d'élément d'action (bouton, lien ou icône) | "button" , "link" , "icon" |
Non |
channelExtensions |
Propriétés d'extension propres au canal associées à l'action | JSONObject | Non |
Champ
Field
contient les propriétés suivantes :
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | String |
Non |
label |
Étiquette du champ | String |
Oui |
channelExtensions |
Jeu de propriétés d'extension propres au canal. | Map<ChannelType, JSONObject> |
Non |
marginTop |
Quantité d'espace vertical entre ce champ et le champ précédent dans la même colonne. Les valeurs autorisées sont none , medium (valeur par défaut) et large .
|
String |
Non |
labelFontSize |
Taille de police utilisée pour l'étiquette de champ. Les valeurs autorisées sont small , medium (valeur par défaut) et large .
|
String |
Non |
labelFontWeight |
Poids de police utilisé pour l'étiquette de champ. Les valeurs autorisées sont light , medium (valeur par défaut) et en gras.
|
String |
Non |
displayInTable |
Expression FreeMarker booléenne qui vous permet d'inclure conditionnellement un champ dans la disposition de table dans un élément de réponse dataSet. | String |
Non (par défaut, true )
|
displayInForm |
Expression FreeMarker booléenne qui vous permet d'inclure conditionnellement un champ dans un élément de réponse editForm ou dans la disposition de formulaire d'un élément de réponse dataSet | String |
Non (par défaut, true )
|
Champ ReadOnly
Field
et possèdent les propriétés supplémentaires suivantes :
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
value |
Valeur du champ | chaîne | Oui |
width |
Pourcentage suggéré de la largeur totale disponible que le champ doit occuper dans une disposition de tableau. | nombre | Non |
alignment |
Alignement de la valeur dans une colonne de table. L'alignement par défaut est right .
|
"left" , "center" et "right" |
Non |
Dans la version 23.06 d'Oracle Digital Assistant, les champs en lecture seule ne s'affichent pas dans les formulaires d'entrée, même s'ils sont reçus dans les données utiles du message.
TextField
TextField
hérite de toutes les propriétés du champ ReadOnly. displayType
pour cet élément est "text"
. Il possède les propriétés supplémentaires suivantes :
Nom | Description | Type | Obligatoire? |
---|---|---|---|
truncateAt |
Position à laquelle le texte long est tronqué et des points de suspension sont ajoutés pour indiquer que la valeur a été tronquée. | Un entier | Non |
fontSize |
Taille de police utilisée pour la valeur field . Les valeurs autorisées sont small , medium (valeur par défaut) et large .
|
Chaîne | Non |
fontWeight |
Poids de police utilisé pour la valeur field . Les valeurs autorisées sont légères, moyennes (valeur par défaut) et en gras.
|
Chaîne | Non |
LinkField
LinkField
hérite de toutes les propriétés du champ ReadOnly. Il possède les propriétés supplémentaires suivantes :
Nom | Description | Type | Obligatoire? |
---|---|---|---|
linkLabel |
Étiquette utilisée pour le lien hypertexte | Chaîne | Non |
imageUrl |
URL de l'image qui ouvre un lien lorsque l'utilisateur clique dessus. | Chaîne | Non |
MediaField
MediaField
hérite de toutes les propriétés du champ ReadOnly. Il possède les propriétés supplémentaires suivantes :
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
mediaType |
Type de média du champ ("video" , "audio" , "image" )
|
String |
Oui |
Formulaire
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
title |
Titre affiché au-dessus de la disposition du formulaire | Chaîne | Non |
fields |
Liste des champs en lecture seule dans le formulaire | Liste<ReadOnlyField> | Oui |
formRows |
Liste des rangées affichées dans le formulaire. | Lister<FormRow> | |
actions |
Liste des actions | Lister<Action> | Non |
selectAction |
Action exécutée lorsque le formulaire a été sélectionné. Lorsque les utilisateurs positionnent le pointeur de la souris sur le formulaire, l'étiquette de l'action s'affiche sous forme d'infobulle (lorsqu'elle est prise en charge par le canal). | Action | Non |
channelExtensions |
Propriétés d'extension propres au canal associées au message | JSONObject | Non |
FormRow
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
columns |
Liste des colonnes affichées dans la rangée du formulaire. | Lister <colonne> | Oui |
selectAction |
Actions exécutées lorsque le formulaire a été sélectionné. Lorsque les utilisateurs positionnent le pointeur de la souris sur le formulaire, l'étiquette de l'action s'affiche sous forme d'infobulle (lorsqu'elle est prise en charge par le canal). | Action | Non |
separator |
Le réglage de cette propriété à Vrai insère une ligne de séparation au-dessus du contenu dans la ligne du formulaire. | Boolean | Non |
channelExtensions |
Propriétés d'extension propres au canal associées au message | JSONObject | Non |
Colonne
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
fields |
Liste des champs qui s'affichent verticalement dans la colonne. Ces champs doivent être des instances ReadOnlyField lorsque la colonne est utilisée dans une FormRow dans une Form . Les champs peuvent être en lecture seule et modifiables lorsque FormRow est utilisé dans un EditFormMessagePayload .
|
Lister les<champ> | Oui |
verticalAlignment |
Alignement vertical de la colonne par rapport aux autres colonnes de la même ligne de formulaire. | Chaîne | Non |
width |
Détermine la largeur de la colonne dans la rangée du formulaire. Les valeurs autorisées sont auto (valeur par défaut) et stretch . Lorsque cette option est réglée à stretch , la colonne prend toute la largeur restante après l'affichage des colonnes à largeur automatique. Si plusieurs colonnes sont réglées à stretch , elles divisent uniformément la largeur restante.
|
Chaîne | Non |
channelExtensions |
Propriétés d'extension propres au canal associées au message | JSONObject | Non |
Élément de réponse editForm
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type d'élément de réponse. | editform |
Oui |
title |
Le titre du formulaire | Chaîne | Non |
items |
Liste de champs, en lecture seule et modifiables. | Liste<field> |
Oui |
formColumns |
Nombre de colonnes utilisées pour la disposition du formulaire. La valeur par défaut est une colonne. | Entier | Non |
actions |
Liste des actions liées à la carte. | Lister<Action> |
Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ textInput
Champ permettant d'entrer du texte libre. Vous pouvez définir les caractères minimum et maximum pour ce champ et appliquer le formatage à l'aide d'expressions rationnelles.
submittedFields
générée (un mappage).
- displayType: textInput
multiLine: true
defaultValue: "${(submittedFields.value.Description)!''}"
minLength: 10
name: Description
label: Description
placeholder: What is the expense justification?
clientErrorMessage: "Description must be 10 characters minimum, 50 characters maximum."
maxLength: 50
required: true
- displayType: textInput
multiLine: true
defaultValue: "${(submittedFields.value.Notes)!''}"
minLength: 10
name: Notes
inputStyle: email
label: Notes
placeholder: Expense notes (optional)
maxLength: 50
required: false
Cet extrait illustre la collecte de l'entrée utilisateur en référençant une variable d'entité composite.L'élément d'entité composite référencé peut être une chaîne.
- displayType: textInput
serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Tip'])!''}"
defaultValue: "${(expense.value.Tip.originalString)!''}"
displayInForm: "${(((expense.value.TipIncluded.yesno)!'') == 'NO')?then(true, false)}"
name: Tip
label: Tip
placeholder: Enter the tip
clientErrorMessage: Tip is required
required: true
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ. | textInput (chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette du champ | Chaîne | Non |
defaultValue |
La valeur initiale. Selon l'expression FreeMarker dans le modèle, la valeur est une chaîne lorsque l'élément d'entité référencé (représenté par myText ) n'a pas de valeur ("${(submittedFields.value.myText)!''}" ).
|
Chaîne | Non |
validationRegularExpression |
Expression rationnelle qui spécifie le format de l'entrée de texte. | Chaîne | Non |
multiline |
Le réglage de cette propriété à true permet aux utilisateurs d'entrer plusieurs lignes de texte.
|
Boolean | Non |
minlength |
Nombre minimum de caractères requis pour valider le champ. Les utilisateurs reçoivent un message d'erreur s'ils entrent trop peu de caractères. | Entier | Non |
maxLength |
Nombre maximal ou limite de caractères. | Entier | Non |
inputStyle |
Format appliqué au client. Les formats sont les suivants :
|
Chaîne | Non |
placeholder |
Conseil décrivant comment utiliser ce champ. Ce texte s'affiche lorsque les utilisateurs n'ont pas encore entré d'entrée. Par exemple :
|
Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | boolean |
Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale. | Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ datePicker
maxDate
et minDate
du composant valident l'entrée utilisateur.
Le canal Slack ne prend pas en charge cette validation des valeurs minimale et maximale.
submittedFields
générée (un mappage). - displayType: datePicker
defaultValue: "${(submittedFields.value.Date)!''}"
name: Date
maxDate: "${.now?iso_utc[0..9]}"
label: Expense Date
placeholder: Pick a date in the past
clientErrorMessage: Expense date is required and must be in the past.
required: true
Cet extrait montre comment capturer l'entrée utilisateur en référençant une variable d'entité composite. - displayType: datePicker
serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Date'])!''}"
defaultValue: "${(expense.value.Date.date?number_to_date?iso_utc)!''}"
name: Date
maxDate: "${.now?iso_utc[0..9]}"
label: Expense Date
placeholder: Pick a date in the past
clientErrorMessage: Expense date is required and must be in the past.
required: true
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | datePicker (chaîne)
|
Oui |
id |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette descriptive. | Chaîne | Non |
defaultValue |
Valeur par défaut du champ, formatée comme AAAA-MM-JJ. Le modèle définit cette chaîne comme une expression Apache FreeMarker qui retourne une chaîne vide lorsque l'élément d'entité composite référencé (représenté par myDate ) a une valeur nulle.
|
Chaîne | Non |
minDate |
Première date de l'intervalle de jours autorisés. Le canal Slack ne prend pas en charge cette validation côté client. | Chaîne | Non |
maxDate |
Dernière date dans l'intervalle de jours autorisés. Le modèle définit cette chaîne comme le jour courant ("${.now?iso_utc[0..9]}" ). Le canal Slack ne prend pas en charge cette validation côté client.
|
Chaîne | Non |
placeholder |
Description de l'entrée attendue qui s'affiche lorsque l'utilisateur n'a pas encore sélectionné de date. | Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | booléen | Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale. | Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ timePicker
maxTime
et minTime
du composant valident l'entrée utilisateur.
Le canal Slack ne prend pas en charge la validation des valeurs minimale et maximale.
submittedFields
générée (un mappage). - displayType: timePicker
defaultValue: "${(submittedFields.value.Time.value?time.xs?string['hh:mm a'])!''}"
maxTime: "23:00"
minTime: "13:00"
name: Time
label: Expense Time
placeholder: What time was the expense?
clientErrorMessage: This time is outside the limits.
required: true
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | timePicker (chaîne)
|
Oui |
id |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette décrivant les paramètres de sélection des heures. | Chaîne | Oui |
defaultValue |
Valeur initiale de ce champ, au format 24 heures. Le modèle définit cette chaîne comme une expression Apache FreeMarker qui retourne une chaîne vide lorsque l'élément d'entité composite référencé (représenté par myTime ) a une valeur nulle.
|
Chaîne | Non |
minTime |
Définit l'heure autorisée au plus tôt, entrée en tant que HH:MM au format 24 heures. Par exemple : 00:00 |
Chaîne | Non |
maxTime |
Définit le dernier temps autorisé, entré en tant que HH:MM, au format 24 heures. Par exemple, 13:00 .
|
Chaîne | Non |
placeholder |
Conseil pour l'entrée. Selon le modèle, l'exemple placeholder est Pick a time in the morning , qui reflète les valeurs minTime et maxTime de l'exemple du modèle, 00:00 et 12:00 .
|
Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | boolean |
Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Par exemple, Time must be in the morning . Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale.
|
Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ numberInput
- displayType: numberInput
minValue: 5
serverErrorMessage: "${(amountError.value)!''}"
maxValue: 500
defaultValue: "${(submittedFields.value.Amount)!''}"
name: Amount
label: Amount
placeholder: Enter the expense amount (do not include currency symbol)
clientErrorMessage: Amount is required and must be between 5 and 500 characters
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | numberInput (chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette descriptive de la valeur de date requise par l'utilisateur. | Chaîne | Non |
defaultValue |
La valeur initiale. Le modèle définit cette chaîne comme une expression Apache FreeMarker qui retourne une chaîne vide lorsque l'élément d'entité composite référencé (représenté par myNumber ) a une valeur nulle. "${(submittedFields.value.myNumber)!''}" |
Chaîne | Non |
maxvalue |
Le plus grand nombre autorisé. Le canal Slack ne prend pas en charge la validation de valeur minimale ou maximale. | Entier | Non |
minvalue |
Un plus petit nombre autorisé | Entier | Non |
placeholder |
Conseil décrivant l'utilisation du champ. Ce texte s'affiche lorsque l'utilisateur n'a pas encore entré de nombre. | Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | boolean |
Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale. | Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ singleSelect
- Sur le canal Microsoft Teams, cet élément s'affiche toujours sous forme de liste (même si
layoutStyle
est réglé àradioGroup
) car les cartes adaptatives ne prennent pas en charge les boutons radio. - Sur le canal Slack, cet élément s'affiche sous forme de liste au lieu d'un groupe radio lorsqu'il y a plus de dix options.
submittedFields
générée (une variable de mappage) - displayType: singleSelect
defaultValue: "${(submittedFields.value.Type)!''}"
name: Type
options:
- iteratorVariable: option
iteratorExpression: "${expenseType.type.enumValues?split(',')}"
label: "${option}"
value: "${option}"
layoutStyle: list
label: Expense Type
placeholder: Select expense type
clientErrorMessage: Expense type is required
required: true
Conseil :
Bien queclientErrorMessage
soit un attribut facultatif, nous vous recommandons de le définir pour les compétences exécutées sur le canal Microsoft Teams, car les cartes adaptatives ne génèrent pas de message lorsque la validation côté client échoue.
- autoSubmit: true
displayType: singleSelect
serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Type'])!''}"
defaultValue: "${(expense.value.Type.value)!''}"
name: Type
options:
- iteratorVariable: option
iteratorExpression: "${expenseType.type.enumValues?split(',')}"
label: "${option}"
value: "${option}"
layoutStyle: list
label: Expense Type
placeholder: Select expense type
clientErrorMessage: Expense type is required
required: true
Nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | singleSelect (chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Texte de l'étiquette de champ décrivant le contenu de la liste à sélection unique. | Chaîne | Oui |
defaultValue |
La sélection par défaut. Le modèle définit cette valeur de chaîne comme une expression Apache FreeMarker qui retourne une chaîne vide lorsque l'élément d'entité composite référencé (représenté par mySingleSelect) a une valeur nulle. "${(submittedFields.value.mySingleSelect)!''}" |
Chaîne | Non |
options |
Tableau des options disponibles. Le modèle définit ces options statiquement avec des paires label et value individuelles avec des valeurs de chaîne, mais vous pouvez alimenter les options de sélection de manière dynamique à l'aide des propriétés iteratorVariable et iteratorExpression : Dans cet extrait de code, les valeurs de type de frais retournées par les propriétés type et enum sont séquencées dans la liste à l'aide de l'élément intégré split .
|
Liste<option> | Oui |
layoutStyle |
Comment les options à sélection unique sont présentées dans le formulaire. Ils peuvent être regroupés sous forme de liste (layoutStyle: list ) ou de boutons radio (layoutStyle: radioGroup ).
|
Chaîne | |
placeholder |
Conseil décrivant l'utilisation du champ. Elle s'affiche lorsque l'utilisateur n'a pas encore effectué la sélection. Par exemple :
Ce paramètre fictif s'affiche uniquement pour le rendu de la disposition de liste. |
Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | boolean |
Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale. | Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Le champ multiSelect
- Sur le canal Microsoft Teams, cet élément s'affiche toujours sous forme de liste (même si
layoutStyle
est réglé àcheckboxes
), car les cartes adaptatives ne prennent pas en charge les cases à cocher à sélection multiple. - Sur le canal Slack, cet élément s'affiche sous forme de liste au lieu d'un ensemble de cases à cocher à sélection multiple lorsqu'il y a plus de dix options.
submittedFields
générée (un mappage). - displayType: multiSelect
defaultValue: "${(submittedFields.value.Attendees?join(','))!''}"
name: Attendees
options:
- iteratorVariable: option
iteratorExpression: "${attendee.type.enumValues?split(',')}"
label: "${option}"
value: "${option}"
layoutStyle: list
label: Attendees
placeholder: Select one or more attendees
Cet extrait illustre le référencement d'une entité composite pour alimenter la liste. - displayType: multiSelect
serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Attendees'])!''}"
displayInForm: "${(((expense.value.Type.value)!'') == 'Meal')?then(true, false)}"
defaultValue: "${(expense.value.Attendees?map(a -> a.value)?join(','))!''}"
name: Attendees
options:
- iteratorVariable: option
iteratorExpression: "${attendee.type.enumValues?split(',')}"
label: "${option}"
value: "${option}"
layoutStyle: list
label: Attendees
placeholder: Select attendees
clientErrorMessage: Attendees are required when expense type is a Meal
required: true
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | multiselect (chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette de champ qui décrit le contenu de la liste multiSelect. | Chaîne | Oui |
defaultValue |
La sélection par défaut. Le modèle définit cette chaîne comme une expression Apache FreeMarker qui retourne une chaîne vide lorsque l'élément d'entité composite référencé (représenté par myMultiSelect ) a une valeur nulle.
|
List<String> |
Non |
options |
Tableau des options disponibles. Le modèle définit ces options statiquement avec des paires label et value individuelles avec des valeurs de chaîne, mais vous pouvez alimenter les options de sélection de manière dynamique à l'aide des propriétés iteratorVariable et iteratorExpression :
|
List<option> |
Oui |
placeholder |
Conseil décrivant l'utilisation du champ. Elle s'affiche lorsque l'utilisateur n'a effectué aucune sélection.
Ce paramètre fictif s'affiche uniquement pour la disposition de liste. Il n'est pas disponible pour les dispositions de case à cocher. |
Chaîne | Non |
layoutStyle |
Disposition des options multiSelect. Les options sont list et checkboxes .
|
Chaîne | Non |
autoSubmit |
Lorsque la valeur est réglée à true , le formulaire est partiellement soumis lorsque l'utilisateur a entré une valeur pour le champ. Dans FormSubmissionMessagePayload , partialSubmitField est réglé au nom du champ où autoSubmit est réglé à true . Nous vous recommandons de configurer la soumission automatique pour les champs dépendants conditionnellement. Par exemple, définissez cette propriété lorsqu'un champ doit être affiché ou masqué en fonction de la valeur d'un autre champ, ou lorsque les valeurs autorisées d'un champ dépendent de la valeur définie dans un autre champ. En soumettant automatiquement un champ dont dépendent d'autres champs, le formulaire peut être mis à jour immédiatement avec les modifications pertinentes apportées aux champs dépendants.
|
Chaîne | Non |
required |
Indique si la soumission du formulaire nécessite une entrée utilisateur dans ce champ | booléen | Non |
clientErrorMessage |
Message utilisé par certains clients (équipes MS, messagerie Apple Business ) en cas d'échec de la validation côté client. Dans Slack, cette propriété n'est utilisée que lorsque le formulaire modifiable est affiché dans la page de conversation. Il ne s'affiche pas dans une boîte de dialogue modale. | Chaîne | Non |
serverErrorMessage |
Message d'erreur envoyé au client lorsque la validation côté serveur d'une valeur de champ de formulaire échoue. Lorsque des erreurs côté serveur de ce type se produisent, nous vous recommandons de remplacer le message de formulaire courant plutôt qu'un nouveau message ajouté à la conversation en configurant la propriété channelExtensions pour indiquer que le dernier message de formulaire doit être remplacé.
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Champ à bascule
Sur le canal Slack, cet élément s'affiche sous la forme d'une paire de boutons radio.
- displayType: toggle
defaultValue: "false"
name: TipIncluded
labelOn: Tip
label: Tip Included?
valueOff: "false"
labelOff: No Tip
valueOn: "true"
Cet extrait illustre la capture des entrées utilisateur en référençant une variable d'entité composite. - autoSubmit: true
displayType: toggle
defaultValue: "${(expense.value.TipIncluded.yesno)!'YES'}"
name: TipIncluded
labelOn: "Yes"
label: Tip Included?
valueOff: "NO"
labelOff: "No"
required: false
valueOn: "YES"
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | toggle (chaîne)
|
Oui |
id |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
label |
Étiquette décrivant ce qui se passe lorsque le commutateur est activé. | Chaîne | Oui |
defaultValue |
La valeur initiale. Si vous voulez que l'activation/désactivation soit activée initialement, réglez cette valeur à valueOn . Le modèle définit cette chaîne comme une expression Apache FreeMarker qui active l'activation/désactivation lorsque l'élément d'entité composite référencé (représenté par myToggle ) a une valeur nulle.
|
Chaîne | Oui |
valueOff |
Valeur lorsque le commutateur est désactivé. La valeur par défaut, selon le modèle, est false (valueOff: "false" ).
|
Chaîne | Oui |
valueOn |
Valeur lorsque le commutateur est activé. La valeur par défaut du modèle est true (value On: "true" ).
|
Chaîne | Oui |
labelOn |
Étiquette de la position de la bascule | Chaîne | Non |
labelOff |
Étiquette de la position désactivée du commutateur. | Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Champ de texte
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type d'élément. | text (une chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
value |
Valeur brute du champ | Chaîne | Oui |
width |
Pourcentage de la largeur totale disponible que l'article doit occuper dans une disposition de tableau. La largeur restante, à partir de 100 moins les articles avec une largeur spécifiée, est également divisée sur les articles sans une largeur spécifiée. | Entier | Non |
alignment |
Alignement de la valeur avec une colonne de table. | left , center et right . La valeur par défaut est right .
|
Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Champ de lien
Nom | Description | Type | Obligatoire? |
---|---|---|---|
displayType |
Type de champ | link (chaîne)
|
Oui |
name |
Nom unique du champ dans le formulaire d'entrée. Ce nom est utilisé comme identificateur au moment de l'exécution. | Chaîne | Oui |
value |
Adresse URL. Par exemple : http:www.oracle.com |
Chaîne | Oui |
width |
Pourcentage de la largeur totale disponible que l'article doit occuper dans une disposition de tableau. La largeur restante, à partir de 100 moins les articles avec une largeur spécifiée, est également divisée sur les articles sans une largeur spécifiée. | Entier | Non |
alignment |
Alignement de la valeur avec une colonne de table. Les valeurs autorisées sont left , center et right . La valeur par défaut est right .
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
EditFormMessagePayload
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type de données utiles du message. | editForm (chaîne)
|
Oui |
headerText |
Texte d'en-tête affiché au-dessus du formulaire. | Chaîne | Non |
footerText |
Texte qui s'affiche sous le formulaire et les actions, mais au-dessus des actions globales. | Chaîne | Non |
title |
Le titre du formulaire | Chaîne | Non |
formRows |
Liste des rangées affichées dans le formulaire. | Liste<FormRow> |
Non |
fields |
Liste de champs, en lecture seule et modifiables. | Liste<field> |
Oui |
formColumns |
Nombre de colonnes utilisées pour la disposition du formulaire. La valeur par défaut est une colonne. | Entier | Non |
actions |
Liste des actions. | Lister<Action> |
Non |
globalActions |
Liste d'actions globales. Le rendu de ces actions est propre au canal. Par exemple, les actions sur Facebook sont affichées par reply_actions .
|
Lister<Action> |
Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
Soumission automatique d'un champ
autoSubmit
réglée à true
, le client envoie un FormSubmissionMessagePayload
avec le mappage submittedField
contenant les valeurs de champ valides qui ont été entrées jusqu'à présent, ou simplement la valeur du champ soumis automatiquement (la mise en oeuvre est propre au canal). Tous les champs qui ne sont pas encore définis (qu'ils soient obligatoires ou non) ou les champs qui violent une validation côté client ne sont pas inclus dans le mappage submittedField
. Si le champ soumis automatiquement lui-même contient une valeur non valide, FormSubmissionMessagePayload
n'est pas envoyé et le message d'erreur du client s'affiche à la place.
Microsoft Teams ne prend pas en charge la soumission automatique.
SubmitFormAction
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type d'action | submitForm (chaîne)
|
Oui |
postback |
Données utiles de republication, qui peuvent inclure une propriété d'action pour déclencher la navigation. Nous recommandons que la valeur de cette propriété soit extraite de l'objet de republication FormSubmissionMessagePayload .
|
JSONObject | Non |
variable |
Nom de la variable qui stocke les valeurs soumises. Ces valeurs sont dans FormSubmissionMessagePayload .
|
Chaîne | Non |
processingMethod |
Instructions de traitement utilisées par le groupe de pages Résoudre entités pour les valeurs de champ soumises. Vous pouvez régler cette valeur à FormSubmissionMessagePayload , mais vous pouvez également définir :
|
Chaîne | Oui |
label |
Étiquette de l'action d'affichage. | Chaîne | Oui - Vous devez spécifier au moins une valeur label ou imageUrl .
|
imageUrl |
Image de l'action d'affichage. | Chaîne | Vous devez spécifier au moins une valeur label ou imageUrl .
|
channelExtensions |
Jeu de propriétés d'extension propres au canal. Par exemple, vous pouvez définir la hauteur maximale pour Facebook Messenger. | Carte<ChannelType, JSONObject> |
Non |
FormSubmissionMessagePayload
SubmitFormAction
. Il possède les propriétés suivantes :
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type des données utiles. | "formSubmission" (une valeur de chaîne)
|
Oui |
submittedFields |
Paires clé-valeur des valeurs de champ soumises. La clé est le nom (ID) du champ. | Mapper <Chaîne, Objet> | Oui |
postback |
Données utiles de republication, qui peuvent inclure une propriété d'action pour déclencher la navigation. Nous recommandons que la valeur soit tirée de SubmitFormAction |
JSONObject | Non |
partialSubmitField |
Nom du champ qui déclenche la soumission d'un formulaire partiel. Les champs pour lesquels la soumission automatique est activée (autoSubmit: true ) peuvent déclencher une soumission partielle de formulaire.
|
Chaîne | Non |
Mise à jour du formulaire d'entrée
autosubmit
est réglé à true
dans un champ, soit parce que l'utilisateur a appuyé sur le bouton d'action submitForm
, il peut arriver que l'utilisateur n'ait pas fourni toutes les informations requises, ou que certaines valeurs de champ contiennent une valeur non valide. Dans un tel cas, le moteur de dialogue enverra un nouveau message EditFormMessagePayload
, mais ce message devrait remplacer le message de formulaire précédent. Pour indiquer au canal client de remplacer le message de formulaire précédent, au lieu d'ajouter un nouveau message de formulaire à la conversation, configurez la propriété d'extension de canal replaceMessage
comme suit :- channel: ${system.channelType}
properties:
replaceMessage: "${system.message.messagePayload.type == 'formSubmission'}"
channelExtensions
de niveau racine des données utiles du composant de réponse commun :...,
"channelExtensions": { "replaceMessage": "true"}
TableMessagePayload
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type de données utiles du message | "table" |
Oui |
headings |
Liste des en-têtes de colonne de table | Lister<TableHeading> | Oui |
rows |
Liste des rangées de table | Lister les<rangées> | Oui |
forms |
Liste des formulaires | Liste | Oui |
formColumns |
Nombre de colonnes utilisées dans la disposition du formulaire. La valeur par défaut est 1. | Entier | Oui |
paginationInfo |
Informations de pagination pouvant être utilisées pour afficher les boutons du jeu précédent ou suivant | PaginationInfo | Oui |
Rangée
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
fields |
Liste de champs en lecture seule | Lister le <champ ReadOnly> | Oui |
selectAction |
Actions exécutées lorsque le formulaire a été sélectionné. Lorsque les utilisateurs positionnent le pointeur de la souris sur le formulaire, l'étiquette de l'action s'affiche sous forme d'infobulle (lorsqu'elle est prise en charge par le canal). | Action | Non |
channelExtensions |
Propriétés d'extension propres au canal associées au message | Mapper <ChannelType>,JSONObject | Non |
TableHeading
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
label |
L'étiquette d'en-tête | Chaîne | Oui |
width |
Largeur de lable du titre | Chaîne | Non |
alignment |
Alignement de la valeur de colonne (left , right ou center ). Par défaut, right .
|
Chaîne | Non |
channelExtensions |
Jeu de propriétés d'extension propres au canal. |
|
Non |
PaginationInfo
Représente les informations de pagination pour les résultats dans les objets Table
, Form
et Table-Form
.
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
totalCount |
Nombre total de résultats | nombre | Oui |
rangeSize |
Taille de l'intervalle des résultats par page | nombre | Oui |
status |
Message de statut de pagination | chaîne | Oui |
currentRangeSize |
Taille de l'intervalle de résultats courant | nombre | Oui |
rangeStart |
Décalage de début de l'intervalle de résultats courant | nombre | Oui |
nextRangeSize |
Taille de l'intervalle de résultats suivant | nombre | Oui |
hasPrevious |
Indique s'il existe un jeu de résultats précédent | booléen | Oui |
hasNext |
Indique s'il existe un jeu de résultats suivant | booléen | Oui |
tableFormMessageLayout
Le nom | Description | Type | Obligatoire? |
---|---|---|---|
type |
Type de données utiles du message | "tableForm" |
Oui |
headings |
Liste des en-têtes de colonne de table | Lister<TableHeading> | Oui |
rows |
Liste des rangées de table | Lister les<rangées> | Oui |
forms |
Liste des formulaires | Liste | Oui |
formColumns |
Nombre de colonnes utilisées dans la disposition du formulaire. La valeur par défaut est 1. | Entier | Oui |
showFormButtonLabel |
Étiquette du bouton utilisé pour afficher la disposition du formulaire pour une rangée spécifique. | Chaîne | Oui |
paginationInfo |
Informations de pagination pouvant être utilisées pour afficher les boutons du jeu précédent ou suivant | PaginationInfo | Oui |
Élément de réponse dataSet
L'élément de réponse dataSet
vous permet de créer des tables et des formulaires. Elle inclut les propriétés suivantes.
Propriété | Description | Obligatoire? |
---|---|---|
layout |
Style de disposition utilisé pour afficher dataSet. Les valeurs autorisées sont table , form et tableForm .
|
Oui |
formColumns |
Nombre de colonnes utilisées pour afficher les éléments dans une disposition de formulaire. Applicable uniquement lorsque la disposition est form ou tableForm . Par défaut : 1 .
|
Non |
showFormButtonLabel |
Étiquette utilisée pour ouvrir la boîte de dialogue de formulaire dans un style de disposition tableForm . Actuellement, elle n'est utilisée que sur les canaux Slack. Les autres canaux prennent en charge le développement de la rangée du tableau pour afficher les éléments supplémentaires dans une disposition de formulaire
|
Non |
data |
Sert à définir une entrée de données dans dataSet . Voir Propriétés de données DataSet |
Oui |
Propriétés de données DataSet
La propriété data
de l'élément de réponse dataSet
inclut les sous-propriétés suivantes.
Propriété | Description | Obligatoire? |
---|---|---|
iteratorExpression |
Définit une expression Freemarker qui retourne une liste d'entrées à itérer, ce qui vous permet d'ajouter dynamiquement plusieurs entrées de données à dataSet .
|
Non |
iteratorVariable |
Indique le nom de la variable d'itérateur que vous pouvez utiliser pour référencer l'entrée de données courante dans la liste des entrées de données qui sont itérées. | Non |
rangeSize |
Nombre d'entrées de données qui seront affichées simultanément lorsque vous aurez spécifié les propriétés iteratorExpression et iteratorVariable .
|
Non |
visible |
Détermine la manière dont les messages sont affichés suivant l'entrée et le canal de l'utilisateur. Voir La propriété visible. | Non |
formTitle |
Titre utilisé pour la boîte de dialogue de formulaire dans la disposition tableForm du canal Slack. Affiche par défaut View details .
|
Non |
items |
Éléments de données à afficher pour chaque entrée de données. Voir DataSet Propriétés de l'élément de données. | Oui |
Propriétés de l'élément de données DataSet
Propriété | Description | Obligatoire? |
---|---|---|
width |
Pourcentage (exprimé en nombre entier) de la largeur totale disponible que l'élément doit utiliser dans une disposition de tableau. La largeur restante, à partir de 100 moins les articles avec une largeur spécifiée, est également divisée sur les articles sans une largeur spécifiée. | Non |
alignment |
Alignement de la valeur avec une colonne de table. Les valeurs autorisées sont left , center et right . La valeur par défaut est left .
|
Non |
displayType |
Type d'affichage de l'article. Les valeurs autorisées sont text et link . La valeur par défaut est text .
|
Non |
linkLabel |
Étiquette utilisée pour l'hyperlien lorsque le type d'affichage est réglé à link . La valeur par défaut est la valeur de la propriété value de l'élément.
|
Non |
displayInTable |
Définit si l'élément doit être affiché en tant que colonne dans la table. Cette propriété est applicable uniquement dans la disposition tableForm . La valeur par défaut est false .
|
Non |
displayInForm |
Définit si l'élément doit être affiché en tant que champ dans le formulaire. Cette propriété est applicable uniquement dans la disposition tableForm . La valeur par défaut est false .
|
Non |
label |
Étiquette de l'élément de données. | Oui |
value |
Valeur de l'élément de données. | Oui |
La variable system.entityToResolve
system.entityToResolve
fournit des informations sur le statut courant du processus de résolution d'entité tel qu'exécuté par les composants Résoudre les entités et Réponse commune. Vous référencez généralement les propriétés de cette valeur de variable dans les métadonnées du composant de réponse commune lorsque vous souhaitez personnaliser des messages. Vous pouvez l'utiliser pour définir la logique d'un message d'erreur d'entité ou pour diverses propriétés appartenant aux groupes de pages Résoudre entités et Réponse commune. Ajoutez les propriétés suivantes pour retourner la valeur d'entité courante :
userInput
prompt
promptCount
updatedEntities
outOfOrderMatches
disambiguationValues
enumValues
needShowMoreButton
rangeStartVar
nextRangeStart
prompt
, errorMessage
et les règles de validation.
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
system.entityToResolve
. Parmi celles-ci se trouve un message défini pour la propriété text
, qui confirme la mise à jour d'une valeur d'entité précédemment définie à l'aide d'une directive Apache FreeMarker list
et de la propriété updatedEntities
. metadata:
responseItems:
- type: "text"
text: "<#list system.entityToResolve.value.updatedEntities>I have updated <#items as ent>${ent.description}<#sep> and </#items>. </#list><#list system.entityToResolve.value.outOfOrderMatches>I got <#items as ent>${ent.description}<#sep> and </#items>. </#list>"
- type: "text"
text: "${system.entityToResolve.value.prompt}"
actions:
- label: "${enumValue}"
type: "postback"
iteratorVariable: "system.entityToResolve.value.enumValues"
needShowMoreButton
, rangeStartVar
et nextRangeStart
: globalActions:
- label: "Show More"
type: "postback"
visible:
expression: "${system.entityToResolve.value.needShowMoreButton}"
payload:
action: "system.showMore"
variables:
${system.entityToResolve.value.rangeStartVar}: ${system.entityToResolve.value.nextRangeStart}
- label: "Cancel"
type: "postback"
visible:
onInvalidUserInput: true
payload:
action: "cancel"
L'étiquette Show More doit comprendre system.showMore
(action: "system.showMore"
). Sinon, elle ne fonctionne pas.
Validation d'un message utilisateur
variable
. Par exemple, lorsque la propriété variable
est définie en tant que type primitif (chaîne, valeur boolean, flottant, double), ces composants tentent de rapprocher la valeur à un des types primitifs. Lorsque la propriété de variable est définie pour une variable de type d'entité, ces composants appellent le moteur TLN pour résoudre la valeur à une des entités. Toutefois, lorsque ces composants ne peuvent pas valider une valeur, votre robot peut afficher un message d'erreur.
En référençant la variable system.invalidUserInput
, vous pouvez ajouter un message d'erreur conditionnel aux réponses de votre robot. Cette variable est une expression booléenne. Vous pouvez l'utiliser comme condition avec la directive FreeMarker if
pour afficher le message uniquement lorsqu'un utilisateur entre une valeur non valide. Sinon, le message est masqué. L'état AskPizzaSize
de CrcPizzaBot référencé dans l'extrait de code suivant illustre cette situation en ajoutant cette variable comme condition dans un modèle FreeMarker évalué par la directive if
. Étant donné qu'elle est réglée à true
, le robot ajoute un message d'erreur au message standard (What size do you want? (quelle taille voulez-vous?)) lorsque l'utilisateur entre une valeur non valide.
metadata:
responseItems:
- type: "text"
text: "<#if system.invalidUserInput == 'true'>Invalid size, please try again.\
\ </#if>What size do you want?"
name: "What size"
separateBubbles: true