Динамические кнопки и параметры

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 именно той кнопки.

Что дальше