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

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 саме тієї кнопки.

Що далі