easy-keyboard / fluent-keyboard
为 MTProto 语法创建的流畅键盘
Requires
- php-64bit: >=8.1
- ext-mbstring: *
Requires (Dev)
- amphp/php-cs-fixer-config: ^2.0
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-17 17:37:23 UTC
README
fluent-keyboard
为 MTProto 语法创建的流畅键盘
目录
安装
使用 composer 安装包
composer require easy-keyboard/fluent-keyboard
(返回顶部)
使用
如果您需要创建键盘,可以使用此包中提供的类作为直接替换。
以下示例将最佳说明
$this->messages->sendMessage( chat_id: 12345, text: 'Keyboard Example', reply_markup: KeyboardMarkup::new() ->singleUse() ->addButton(KeyboardButton::Text('Cancel')) ->addButton(KeyboardButton::Text('OK')) ->build() );
通过调用 KeyboardMarkup 的静态 new() 方法创建 ReplyKeyboardMarkup。之后,每个字段(如 singleUse 等)添加一些额外内容。可以通过调用 addButton() 方法添加按钮。我们稍后会对这一点进行详细说明。(请注意,此键盘需要转换为数组以便您的机器人可读,因此最后您需要调用 init() 方法)
(返回顶部)
定义键盘
您可以通过调用其类的静态 new() 方法来创建键盘。
之后,您可以通过调用 placeholder() 方法来链式调用方法,设置 Bot API 中可用的其他字段。
KeyboardMarkup::new() ->placeholder('Placeholder') ->build();
(返回顶部)
定义按钮
按钮以不同的方式创建
KeyboardButton::Phone('Send my Contact');
这同样适用于 InlineButton
InlineButton::Url('hello', 'https://example.com');
(返回顶部)
将按钮绑定到键盘
键盘没有按钮将无法工作,因此您需要将按钮传递给键盘。有几种方法可以这样做。
按行
KeyboardMarkup::new() ->row( KeyboardButton::Text('Cancel'), KeyboardButton::Text('OK') ) ->build();
如果您需要多于一行,多次调用 row()
KeyboardInline::new() ->row( InlineButton::Callback('1','page-1'), InlineButton::Callback('2','page-2'), InlineButton::Callback('3','page-3') ) ->row( InlineButton::Callback('prev','page-prev'), InlineButton::Callback('next','page-next') ) ->build();
您还可以通过其他方式添加回调数组或文本键盘
KeyboardInline::new() ->addCallbacks([ '1' => 'page-1', '2' => 'page-2', '3' => 'page-3', ],[ 'prev' => 'page-prev', 'next' => 'page-next' ]) ->build();
KeyboardMarkup::new() ->addTexts([ 'Cancel', 'Ok' ]) ->build();
按按钮
KeyboardMarkup::new() ->addButton(KeyboardButton::Text('First Button')) ->addButton(KeyboardButton::Text('Second Button')) ->build();
如果您需要多于一行,只需不带参数调用 row 方法,然后继续调用 addButton()
KeyboardInline::new() ->addButton(InlineButton::Callback('A', 'answer-a')) ->addButton(InlineButton::Callback('B', 'answer-b')) ->row() ->addButton(InlineButton::Callback('C', 'answer-c')) ->addButton(InlineButton::Callback('D', 'answer-d')) ->build();
您可以根据自己的喜好,将按钮直接定义如这些示例所示,或者先生成整个行,然后将变量传递给 row() 方法。
您可以通过调用 remove 方法删除最后一个按钮,以下是一个示例
KeyboardInline::new() ->addButton(InlineButton::Callback('A', 'answer-a')) ->addButton(InlineButton::Callback('B', 'answer-b')) ->row() ->addButton(InlineButton::Callback('C', 'answer-c')) ->addButton(InlineButton::Callback('D', 'answer-d')) ->remove() ->build();
在这个示例中,按钮 D 将从按钮中删除。
按坐标
您可以在您想要的任何坐标处添加按钮!(注意,坐标从 0 开始,就像数组索引一样。)例如,假设我们有一个这样的键盘
$keyboard = KeyboardInline::new() ->addButton(InlineButton::Callback('Numbers', 'Numbers')) ->addButton(InlineButton::Callback('Status', 'Status')) ->row() ->addButton(InlineButton::Callback('Add', 'Add')) ->addButton(InlineButton::Callback('Remove', 'Remove'));
我们可以通过调用 addToCoordinates 方法添加具有其坐标(行和列)的新按钮。此方法将在您传入的坐标处添加新按钮,并移动该坐标的下一个按钮。此图片显示了新按钮的位置
$keyboard->addToCoordinates(0, 1, InlineButton::Callback('Middle','Middle'));
结果应如下所示
您还可以在特定坐标处替换,与 addToCoordinates 不同,replaceIntoCoordinates 方法将您的按钮替换为传入的坐标。例如,如果我们想在这个例子中将“添加”替换如下所示
我们应该使用此代码
$keyboard->replaceIntoCoordinates(1, 0, InlineButton::Callback('Replaced Add','Add'));
结果应如下所示
您还可以通过坐标删除按钮。例如,如果我们想删除上一个示例中的“添加”按钮,我们应该运行此代码
$keyboard->removeFromCoordinates(1, 0);
作为堆栈
如果您想添加具有各自行的多个按钮,可以使用 Stack() 方法。
KeyboardInline::new() ->Stack( InlineButton::Login('Login', 'https://example.com/login'), InlineButton::Url('Visit Homepage', 'https://example.com') ) ->build();
您可以根据需要混合使用row()、Stack()和addButton()方法。
(返回顶部)
KeyboardForceReply 和 KeyboardHide
KeyboardForceReply和KeyboardHide可以像普通键盘一样使用,但它们不会接收任何按钮。
#[FilterAnd(new FilterPrivate,new FilterIncoming)] public function handleExit(Message $message){ $message->reply('Thank you', reply_markup : KeyboardHide::new()->build() ); }
$data['reply_markup'] = KeyboardForceReply::new() ->addButton(KeyboardButton::Text('Hello please reply')) ->placeholder('must reply') ->build();
(返回顶部)
键盘对等类型
我们提供了三种类型的数据对等,可以通过机器人请求:RequestUser、RequestGroup和RequestChannel。
KeyboardMarkup::new() ->addButton(KeyboardButton::Peer('Request for user', 0, RequestUser::new()));
KeyboardMarkup::new() ->addButton(KeyboardButton::Peer('Request for chat', 1, RequestGroup::new()));
KeyboardMarkup::new() ->addButton(KeyboardButton::Peer('Request for broadcast', 2, RequestChannel::new()));
您还可以使用更简单的语法来创建更好的键盘。
KeyboardMarkup::new() ->requestUser('Request for user', 0);
KeyboardMarkup::new() ->requestGroup('Request for chat', 1);
KeyboardMarkup::new() ->requestChannel('Request for broadcast', 2);
(返回顶部)
将 Telegram 键盘转换为 Fluent 键盘
现在您可以使用fromRawReplyMarkup方法轻松地将mtproto的Telegram键盘转换为fluent键盘进行修改等操作!以下是一个示例。
$fluentKeyboard = Keyboard::fromRawReplyMarkup($replyMarkup);
如您所知,$fluentKeyboard是一个对象,您可以对其进行修改并添加更多按钮。以下是一个$fluentKeyboard为KeyboardInline实例的示例。
$fluentKeyboard->addButton(InlineButton::Callback('End', 'End'));
最后,您可以在其中调用build方法并将其传递给某个Telegram方法。以下是一个MadelineProto的示例。
#[FilterAnd(new FilterPrivate,new FilterIncoming)] public function modify(Message $message){ $message->reply('That is new keyboard', reply_markup : $fluentKeyboard->build() ); }
(返回顶部)



