Динамічні кнопки і параметри
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.*}}у шаблонах. - Зв'язки реакцій — куди ведуть кнопки і як побачити граф переходів.
- Колекції та дані — звідки брати списки для динамічних кнопок.