onCallback
Метод onCallback создает маршрут для обработки callback_query (нажатий на inline-кнопки).
Этот метод полезен, когда вы создаете клавиатуру вручную или получаете callback от внешних систем, и callback_data не соответствует ID кнопки, определенной через btn(). В большинстве случаев для создания меню рекомендуется использовать связку btn() и inlineKbd(), так как это упрощает код.
Правила парсинга плейсхолдеров (Regex Logic)
Плейсхолдер {name} преобразуется в строгий паттерн [a-zA-Z0-9_-]+. Суть: Аргумент может содержать только латинские буквы, цифры, дефис и нижнее подчеркивание. Важно: Кириллица, пробелы или символы вроде @ в плейсхолдер onCallback не попадут.
Параметры
| # | Название | Тип | Описание |
|---|---|---|---|
| 1 | id | string | Уникальный идентификатор для этого маршрута. |
| 2 | data | string | Значение callback_data, на которое должен среагировать этот маршрут. Если не указано, используется id. |
Возвращает
Action — экземпляр класса Action (Вспомогательный класс), на который можно навешивать дальнейшие действия (text, func и т.д.).
Шаблоны и аргументы
onCallback поддерживает синтаксис в стиле Laravel для захвата переменных из текста команд. Вы можете использовать плейсхолдеры в фигурных скобках {name}, чтобы передать часть сообщения как аргумент в вашу функцию-обработчик. Значения, соответствующие этим плейсхолдерам, будут переданы в качестве аргументов в вашу функцию-обработчик func().
Пример использования
В этом примере мы создаем inline-кнопку "на лету", не используя btn(), и затем ловим ее нажатие через onCallback().
<?php
require_once __DIR__ . '/vendor/autoload.php';
use ZenithGram\ZenithGram\ZG;
use ZenithGram\ZenithGram\Bot;
use ZenithGram\ZenithGram\Button;
$tg = ZG::create(BOT_TOKEN);
$bot = new Bot($tg);
// По команде /vote отправляем сообщение с кнопками, созданными вручную
$bot->onBotCommand('vote', '/vote')
->text('Вам нравится эта библиотека?')
->inlineKbd([
[
// Кнопка, созданная "на лету"
Button::cb('Да 👍', 'vote_yes'),
Button::cb('Нет 👎', 'vote_no')
]
]);
// Обработчик для callback_data 'vote_yes'
$bot->onCallback('handle_vote_yes', 'vote_yes')
->query('Спасибо за ваш голос!') // Всплывающее уведомление
->editText('Вы проголосовали "Да". Отлично!'); // Редактируем исходное сообщение
// Обработчик для callback_data 'vote_no'
$bot->onCallback('handle_vote_no', 'vote_no')
->query('Спасибо за ваш голос!')
->editText('Вы проголосовали "Нет". Жаль!');
$bot->run();Пример с плейсхолдером
<?php
require_once __DIR__ . '/vendor/autoload.php';
use ZenithGram\ZenithGram\ZG;
use ZenithGram\ZenithGram\Bot;
use ZenithGram\ZenithGram\Button;
$tg = ZG::create(BOT_TOKEN);
$bot = new Bot($tg);
$bot->onBotCommand('vote', '/vote')
->text('Вам нравится эта библиотека?')
->inlineKbd([
[
Button::cb('Да 👍', 'vote_yes'),
Button::cb('Нет 👎', 'vote_no'),
],
]);
$bot->onCallback('handle_vote', 'vote_{voted}')
->func(function(ZG $tg, string $voted) {
$tg->answerCallbackQuery(['text' => 'Спасибо за ваш голос!']);
if ($voted === 'yes') {
$tg->msg('Вы проголосовали "Да". Отлично!')->editText();
} else {
$tg->msg('Вы проголосовали "Нет". Жаль!')->editText();
}
});
$bot->run();