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

Button

Вспомогательный класс для генерации кнопок. Поддерживает все актуальные типы кнопок Telegram API.

Импорт

Для использования класса необходимо его импортировать через конструкцию use. Если вы планируете использовать цветные кнопки, также импортируйте перечисление ButtonStyle.

php
use ZenithGram\ZenithGram\Button;
use ZenithGram\ZenithGram\Enums\ButtonStyle;

Стили и Эмодзи (Общие параметры)

Абсолютно все методы класса Button принимают два дополнительных опциональных параметра: $style и $customEmojiId. Для удобства рекомендуется использовать именованные аргументы PHP 8.

  • Стили поддерживают 4 цвета: Primary (Синий), Success (Зеленый), Danger (Красный) и стандартный цвет Telegram.
  • Эмодзи работают, если у бота есть юзернейм с Fragment или у получателя есть Telegram Premium.
php
Button::cb(
    text: 'Удалить', 
    data: 'del_123', 
    style: ButtonStyle::Danger, 
    customEmojiId: '5368324170671202286'
);

Комплексный пример использования класса

php
<?php
// 1. Необходимые импорты
use ZenithGram\ZenithGram\Bot;
use ZenithGram\ZenithGram\ZG;
use ZenithGram\ZenithGram\Button;
use ZenithGram\ZenithGram\Enums\ButtonStyle;
use ZenithGram\ZenithGram\Enums\MessageParseMode;

$tg = ZG::create("BOT_TOKEN");
$bot = new Bot($tg);

// Inline-клавиатура
$bot->onBotCommand('menu', '/menu')
    ->func(function(ZG $tg) {
        
        // Формируем массив рядов
        $inlineKeyboard = [
            // Первый ряд: 3 кнопки со всеми доступными стилями
            [
                Button::cb('Отмена', 'cancel', ButtonStyle::Danger),
                Button::cb('Ок', 'confirm', ButtonStyle::Success),
                Button::cb('Инфо', 'info', ButtonStyle::Primary)
            ],
            // Второй ряд: 2 кнопки (Ссылка и Копирование текста с кастомным эмодзи)
            [
                Button::url('Наш сайт', 'https://example.com'),
                Button::copyText(
                    text: 'Промокод', 
                    textToCopy: 'SALE-2025', 
                    customEmojiId: '5368324170671202286' // ID эмодзи
                )
            ],
            // Третий ряд: 1 кнопка на всю ширину (Инлайн режим)
            [
                Button::switchInlineCurrent('🔎 Поиск по каталогу', 'найти ')
            ]
        ];

        $tg->msg("🗂 <b>Главное меню</b>\nВыберите нужное действие:")
            ->parseMode(MessageParseMode::HTML)
            ->inlineKbd($inlineKeyboard)
            ->send();
    });

// Reply-клавиатура
$bot->onBotCommand('tools', '/tools')
    ->func(function(ZG $tg) {
        
        $replyKeyboard = [
            // Первый ряд: запросы пользователей и чатов
            [
                Button::requestUsers('👥 Выбрать 2-х юзеров', requestId: 1, options: ['max_quantity' => 2]),
                Button::requestChat('📢 Выбрать канал', requestId: 2, chatIsChannel: true)
            ],
            // Второй ряд: локация и создание опроса
            [
                Button::location('📍 Моя геопозиция'),
                Button::poll('📊 Сделать опрос', type: 'regular')
            ],
            // Третий ряд: обычный текст для закрытия
            [
                Button::text('❌ Закрыть меню')
            ]
        ];

        $tg->msg("🛠 <b>Инструменты</b>\nВоспользуйтесь функциями ниже:")
            ->parseMode(MessageParseMode::HTML)
            ->kbd($replyKeyboard, resize: true) 
            ->send();
    });

$bot->run();

text

Обычная текстовая кнопка (Reply)

php
Button::text('Текст кнопки');

cb

Inline кнопка с Callback Data

php
Button::cb('Текст кнопки', 'callbackData');

url

Inline кнопка-ссылка

php
Button::url('Текст кнопки', 'https://example.com');

webApp

Кнопка для запуска WebApp (Поддерживается как для Inline, так и для Reply)

php
Button::webApp('Открыть приложение', 'https://app.url');

contact

Кнопка запроса контакта (Reply)

php
Button::contact('Отправить контакт');

location

Кнопка запроса геолокации (Reply)

php
Button::location('Отправить геопозицию');

copyText

Inline кнопка для копирования заданного текста в буфер обмена пользователя

php
Button::copyText('Скопировать промокод', 'PROMO-2025');

switchInline

Inline кнопка, переводящая пользователя в другой чат с активацией инлайн-режима бота

php
Button::switchInline('Поиск в другом чате', 'текст запроса');

switchInlineCurrent

Inline кнопка, активирующая инлайн-режим бота в текущем чате

php
Button::switchInlineCurrent('Искать здесь', 'текст запроса');

switchInlineChosen

Inline кнопка для активации инлайн-режима с предварительным выбором типа чата (группы, каналы, лс)

php
Button::switchInlineChosen('Выбрать чат', [
    'query' => 'запрос', 
    'allow_group_chats' => true
]);

loginUrl

Inline кнопка для беспарольной авторизации на сайте через Telegram

php
Button::loginUrl('Войти через Telegram', ['url' => 'https://example.com/login']);

requestUsers

Кнопка запроса выбора одного или нескольких пользователей/ботов (Reply)

php
Button::requestUsers('Выбрать 2-х Premium юзеров', requestId: 1, options: [
    'user_is_premium' => true,
    'max_quantity' => 2
]);

requestChat

Кнопка запроса выбора группы или канала по заданным критериям (Reply)

php
Button::requestChat('Выбрать канал', requestId: 2, chatIsChannel: true, options: [
    'chat_has_username' => true
]);

requestManagedBot

Кнопка запроса на создание управляемого бота (Reply)

php
Button::requestManagedBot('Создать бота', requestId: 3, options: [
    'suggested_name' => 'Мой новый бот'
]);

poll

Кнопка, предлагающая пользователю создать опрос или викторину и отправить боту (Reply)

php
Button::poll('Создать викторину', 'quiz'); // 'regular', 'quiz' или null

pay

Inline кнопка для оплаты счетов (включая Telegram Stars)

Важно

Эту кнопку нельзя прикрепить к обычному текстовому сообщению. Она должна быть первой кнопкой в первом ряду и отправляться исключительно через метод API sendInvoice.

php
Button::pay('Оплатить 100⭐');

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