动态按钮与参数
Inline 按钮不一定是静态的。GetMyBot 可以根据数据构建键盘——每个列表元素对应一个按钮——并为每个按钮附加发送时固定的独立参数集。这是"显示目录 → 用户选择具体商品 → 处理该商品"场景的基础。一切都在"发送消息"动作的消息块中配置。
从列表生成动态按钮
**"从列表生成动态按钮"**块将 ctx 中的数组展开为键盘:每个数组元素对应一个按钮。需配置四项内容:
- 列表 —
ctx中数组的键(over),例如ctx.products。数组通常由"查询数据源"、"Web 请求"或计算动作放入。 - 元素别名 — 模板中访问元素所用的名称(
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。