Когда не знаешь, сколько вешать
История про крутые нестандартные чат-боты.
Бывают случаи, когда необходимо отправить сообщение, а количество кнопок к нему неизвестно на стадии проектирования воронки - станет известно в процессе диалога. Да, так бывает :). Здесь нам также приходит на помощь способность конструктора Salebot выполнять скрипты Python.
Загрузка скриптов Python в Salebot по этой ссылке, больше не повторяюсь.
Рассмотрим эту историю от простого к сложному - всего рассмотрено 3 варианта.
Важно: примеры проверялись в тестовой консоли и не учитывали ограничений по кнопкам конкретных мессенджеров. Как говорится, будьте внимательны и осторожны :).
1. Мы просто задаём в динамике число кнопок, не заморачиваясь их отображением
Схема тупо выводит кнопки в линию
Код скрипта Python "sb_3buttons.py" (копипаст работает). Не забываем, что в Питоне отступы - это символ табуляции (клавиша "Tab")
def handle(data):
''' Получаем из переданных параметров число '''
n = json.loads(data)["n"]
''' Создаём список для итогового результата '''
_buttons = []
''' В цикле формируем набор словарей с параметрами кнопок '''
for i in range(n):
bdict = {"line":0, "index_in_line":i, "text":f"Кнопка {i+1}", "type":"inline"}
''' Добавляем полученный словарь в список '''
_buttons.append(bdict) ''' Возвращаем полученное значение для блока кнопок '''
return {'btns': _buttons}2. Учимся формировать ряды кнопок
Схема выводит заданное число рядов с заданным числом кнопок
Код скрипта Python "sb_manybuttons.py "
# -*- coding: utf-8 -*-
import json
def handle(data):
''' Получаем число рядов '''line = json.loads(data)['n']
''' Получаем число кнопок в ряду '''
ind = json.loads(data)['m']
_buttons = []
cnt = 0 ''' Первый цикл - ряд кнопок '''
for i in range(line): ''' Второй цикл - кнопки в ряду '''
for j in range(ind): ''' Порядковый номер кнопки '''
cnt += 1
bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
_buttons.append(bdict)
return {'btns': _buttons}3. У нас есть общее число кнопок и желаемое число кнопок в ряде
Самая гибкая и универсальная схема по общему числу кнопок сначала вычисляет число полных рядов кнопок, а затем остаток достраивает в последнем ряду. Прикольно получилось :)
Схема аналогична той, что в варианте 2. Немного другие тексты в диалогах - оно и понятно 😊. Название файла со скриптом Python sb_manybuttons_lined.py. Вот его код:
# -*- coding: utf-8 -*-
import json
def handle(data):
''' Получаем общее число кнопок '''
amount = json.loads(data)['n'] ''' Получаем число кнопок в ряду '''
btns_in_line = json.loads['m']
_buttons = [] ''' Получаем число полных рядов '''
full_lines = amount // btns_in_line ''' Остаток для последнего ряда '''
leaving = amount % btns_in_line
cnt = 0
for i in range(full_lines):
for j in range(btns_in_line):
cnt += 1
bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
_buttons.append(bdict) ''' Формируем последний ряд из полученного остатка '''
if (leaving > 0):
i += 1
for j in range(leaving):
cnt += 1
bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
_buttons.append(bdict) return {'btns': _buttons}Ничто не мешает попробовать эти схемы в действии - они полностью рабочие и вовсю применяются в ТГ и ВК.
Благодарность в виде доната приветствуется 😉. Как говорят восточные зулусы, buy me a coffee 😃