Динамические кнопки и параметры
Inline-кнопки бывают не только статичными. GetMyBot умеет строить клавиатуру из данных — по кнопке на каждый элемент списка — и прикреплять к каждой кнопке свой набор параметров, зафиксированный в момент отправки. Это основа сценариев «покажи каталог → пользователь выбирает конкретный товар → оформляем именно его». Всё настраивается в блоке сообщения действия «Отправить сообщение».
Динамические кнопки из списка
Блок «Динамические кнопки из списка» разворачивает массив из ctx в клавиатуру: одна кнопка на каждый элемент массива. Настраиваются четыре вещи:
- Список — ключ массива в контексте (
over), напримерctx.products. Массив обычно кладут туда действия «Запрос к источнику», «Веб-запрос» или вычисление. - Псевдоним элемента — имя, под которым элемент доступен в шаблоне (
as, по умолчаниюitem). - Кнопок в ряд — сколько кнопок ставить в строку (
columns, по умолчанию1). - Шаблон кнопки — обычная кнопка, но её текст и поля поддерживают подстановки по псевдониму:
{{item.name}},{{item.price}}и т. д.
При отправке шаблон рендерится для каждого элемента, и появляется столько кнопок, сколько элементов в списке. Так строятся каталоги, списки записей коллекции и меню из данных.
Пример
В ctx.products лежит массив объектов с полями id, name, price. В шаблоне кнопки укажите текст {{item.name}} — {{item.price}} ₽, а в Carry — ключ product_id со значением {{item.id}}. Получите по кнопке на товар, и при нажатии бот будет точно знать, какой товар выбрали.
Параметры в нажатии (Carry)
Блок «Carry — снимок данных в нажатие кнопки» прикрепляет к кнопке набор пар ключ → значение, вычисленных и зафиксированных в момент отправки сообщения. При нажатии эти значения восстанавливаются в ctx — поэтому каждая кнопка несёт свои параметры (per-invocation), даже если кнопок десятки и отправлены они одним сообщением.
- carry ключ — имя, под которым значение вернётся в
ctxпри нажатии. - carry значение — шаблон с подстановками (
{{item.id}},{{param.order_id}},{{ctx.x}}), который вычисляется при отправке. - Одноразовая (
single_use) — payload сгорает после первого нажатия. - Время жизни payload (
ttl_seconds) — срок годности снимка в секундах (0— значение по умолчанию).
Это и есть критичная фича «параметры из ссылки, привязанные к конкретной кнопке»: значение запоминается в кнопке, а не в общем состоянии пользователя, поэтому параллельные нажатия не перетирают друг друга.
Установка параметров кнопкой (set_params)
Помимо снимка Carry, кнопка умеет прямо задавать параметры подписчика при нажатии — поле «Параметры» (set_params). В отличие от Carry (временные значения в ctx), set_params пишет в постоянные параметры пользователя ({{param.ключ}}), которые сохраняются между запусками. Аналогичное поле есть и у блока сообщения — тогда параметры ставятся при отправке, а не при нажатии.
Кнопка при нажатии также может ставить и снимать метки — теми же полями, что и блок сообщения.
Чем отличаются три механизма
- Carry — снимок в
ctx, живёт до нажатия, привязан к конкретной кнопке, с TTL и одноразовостью. - set_params на кнопке — пишет постоянные параметры подписчика при нажатии.
- set_params на блоке — пишет постоянные параметры при отправке сообщения.
Для сценария «выбрал товар — оформили его» используйте динамические кнопки + Carry: список товаров разворачивается в кнопки, а product_id каждого товара уезжает в Carry именно той кнопки.
Что дальше
- Сообщения и кнопки — блоки сообщения, типы кнопок и поведение при нажатии.
- Подстановки и формулы — переменные
{{item.*}},{{ctx.*}},{{param.*}}в шаблонах. - Связи реакций — куда ведут кнопки и как увидеть граф переходов.
- Коллекции и данные — откуда брать списки для динамических кнопок.