Теги активации
Теги активации определяют действия пользователей или события, которые могут перевести контекст диалога в тот или иной стейт. Все теги активации делятся на два вида: локальные и глобальные.
- По локальному тегу переход в стейт возможен только из ближайшего родительского, из соседних или дочерних стейтов.
- По глобальному тегу диалог может перейти в стейт из любого другого стейта в сценарии. Названия глобальных тегов заканчиваются на
!.
| Тег | Описание |
|---|---|
q q! | Объявляет паттерн, по которому диалог может перейти в стейт. |
intent intent! | Объявляет интент, по которому диалог может перейти в стейт. |
intentGroup intentGroup! | Объявляет группу интентов, по которым диалог может перейти в стейт. |
event event! | Объявляет событие, по которому диалог может перейти в стейт. |
Параметры
Параметры — пары «ключ — значение», которые отделяются от названия или значения тега (если оно есть) двумя вертикальными чертами. Если параметров несколько, они отделяются друг от друга запятыми. Параметры позволяют модифицировать поведение тега.
Для локальных тегов q, intent, intentGroup и event могут быть заданы параметры:
| Параметр | Тип | Описание | Значение по умолчанию |
|---|---|---|---|
fromState | Строка | Путь до стейта, из которого возможен переход в текущий стейт по данному тегу активации. | — |
toState | Строка | Путь до стейта, в который возможен переход из текущего стейта по данному тегу активации. | — |
onlyThisState | Логический | • Если true и указан параметр fromState, то переход в текущий стейт возможен строго из стейта в значении fromState, но не из его вложенных. • Если true и указан параметр toState, то переход в стейт в значении toState возможен строго из текущего стейта, но не из его вложенных. | false |
fromState
Параметр fromState задает путь до стейта, из которого возможен переход в текущий стейт по данному тегу активации.
fromState позволяет перевести диалог из определенного контекста в нужный стейт без использования глобальных паттернов.
Кроме того, это один из способов покинуть контекст модального стейта.Рассмотрим пример.
В сценарии ниже пользователь может выйти из контекста модального стейта OrderStatus, если не знает номер заказа.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
intent: /DontKnow || fromState = "/OrderStatus"
a: Чем еще я могу помочь?
toState
Параметр toState задает путь до стейта, в который возможен переход из текущего стейта по данному тегу активации.
fromState и toState одинаково, и ответ на вопрос, что лучше использовать, во многом зависит от личных предпочтений.
Когда из стейта нужно задать возможность перехода в несколько стейтов, разбросанные по разным частям сценария,
то предпочтительнее toState: он позволяет держать всю информацию, связанную с возможными изменениями контекста, в одном месте.Следующий пример работает так же, как предыдущий.
Обратите внимание, что теги активации с параметром toState обычно пишутся после тегов реакций.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
intent: /DontKnow || toState = "/WhatElse"
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?
onlyThisState
Параметр onlyThisState используется совместно с fromState или toState.
При значении true он накладывает ограничения на стейт, из которого или в который можно перейти по данному тегу активации.
- Если указан параметр
fromState, то переход в текущий стейт возможен строго из стейта в значенииfromState, но не из его вложенных. - Если указан параметр
toState, то переход в стейт в значенииtoStateвозможен строго из текущего стейта, но не из его вложенных.
Рассмотрим пример.
Если в предыдущем сценарии в стейт /WhatElse можно перейти из /OrderStatus и /OrderStatus/LocalCatchAll,
то в примере ниже только из /OrderStatus.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
intent: /DontKnow || toState = "/OrderStatus", onlyThisState = true
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?