Перейти к содержимому

onCallback

Метод onCallback создает маршрут для обработки callback_query (нажатий на inline-кнопки).

Этот метод полезен, когда вы создаете клавиатуру вручную или получаете callback от внешних систем, и callback_data не соответствует ID кнопки, определенной через btn(). В большинстве случаев для создания меню рекомендуется использовать связку btn() и inlineKbd(), так как это упрощает код.

Правила парсинга плейсхолдеров (Regex Logic)

Плейсхолдер {name} преобразуется в строгий паттерн [a-zA-Z0-9_-]+. Суть: Аргумент может содержать только латинские буквы, цифры, дефис и нижнее подчеркивание. Важно: Кириллица, пробелы или символы вроде @ в плейсхолдер onCallback не попадут.

Параметры

#НазваниеТипОписание
1idstringУникальный идентификатор для этого маршрута.
2datastringЗначение callback_data, на которое должен среагировать этот маршрут. Если не указано, используется id.

Возвращает

Action — экземпляр класса Action (Вспомогательный класс), на который можно навешивать дальнейшие действия (text, func и т.д.).

Шаблоны и аргументы

onCallback поддерживает синтаксис в стиле Laravel для захвата переменных из текста команд. Вы можете использовать плейсхолдеры в фигурных скобках {name}, чтобы передать часть сообщения как аргумент в вашу функцию-обработчик. Значения, соответствующие этим плейсхолдерам, будут переданы в качестве аргументов в вашу функцию-обработчик func().

Пример использования

В этом примере мы создаем inline-кнопку "на лету", не используя btn(), и затем ловим ее нажатие через onCallback().

php
<?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
<?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();

Опубликовано под лицензией MIT.