Привет! Сегодня я хотел бы поделиться с вами своим опытом в создании inline-пагинации для Telegram-бота на aiogram с кнопками ″Вперед″ и ″Назад″. Я столкнулся с этой задачей при разработке своего бота, и хочу рассказать вам, как я ее решил.Inline-пагинация представляет собой способ организации информации на несколько страниц, чтобы пользователь мог легко просматривать большие объемы данных. В моем случае, я использовал ее для вывода результатов поиска пользователя.
Первым шагом я создал функцию, которая получает список значений для каждой страницы. Предположим, что у меня есть функция search(query), которая возвращает список результатов поиска для данного запроса. Чтобы организовать пагинацию, я создал вспомогательную функцию, которая разбивает список результатов на отдельные страницы и возвращает их в виде списка списков.
python
def paginate_results(results, items_per_page)⁚
pages []
for i in range(0, len(results), items_per_page)⁚
page results[i⁚i items_per_page]
pages.append(page)
return pages
Затем я создал функцию, которая отправляет пользователю первую страницу результатов поиска и выводит кнопки ″Вперед″ и ″Назад″ для навигации по страницам.
python
async def send_results_page(user_id, results, page_number, total_pages)⁚
page results[page_number]
keyboard types.InlineKeyboardMarkup(row_width2)
prev_button types.InlineKeyboardButton(text″Назад″, callback_dataf″prev⁚{page_number}″)
next_button types.InlineKeyboardButton(text″Вперед″, callback_dataf″next⁚{page_number}″)
if page_number > 0⁚
keyboard.add(prev_button)
if page_number < total_pages — 1⁚
keyboard.add(next_button)
await bot.send_message(user_id, f″Страница {page_number 1} из {total_pages}″)
await bot.send_message(user_id, ″, ″.join(page), reply_markupkeyboard)
Теперь давайте посмотрим, как я использую эти функции в основной части бота. У меня есть функция, которая обрабатывает входящие команды от пользователя⁚
python
@dp.callback_query_handler(lambda query⁚ query.data.split(″⁚″)[0] in [″prev″, ″next″])
async def handle_pagination_callback(query⁚ types.CallbackQuery)⁚
_, page_number query.data.split(″⁚″)
page_number int(page_number)
user_id query.from_user.id
if query.data.startswith(″prev″)⁚
page_number - 1
elif query.data.startswith(″next″)⁚
page_number 1
results search(query) # получаем результаты поиска
pages paginate_results(results, 6)
await send_results_page(user_id, pages, page_number, len(pages))