Skip to content

Commit 651c338

Browse files
committed
Add Paginator interface for commands that use the inline keyboard paginator.
1 parent 25e6c9a commit 651c338

File tree

3 files changed

+60
-14
lines changed

3 files changed

+60
-14
lines changed

src/Entities/InlineKeyboard.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class InlineKeyboard extends Keyboard
2121
* Get an inline pagination keyboard.
2222
*
2323
* - $callback_data is an ID for the CallbackqueryCommand, to know where the request comes from.
24-
* It must contain a '%d' placeholder for the page number. If no placeholder is found, the ID is automatically appended with '_page_%d'
24+
* The ID is automatically appended with '_page_%d' to filter out the selected page number.
2525
*
2626
* - $labels allows for custom button labels, using '%d' placeholders.
2727
* Default:
@@ -46,9 +46,7 @@ class InlineKeyboard extends Keyboard
4646
*/
4747
public static function getPagination($callback_data, $current_page, $max_pages, array $labels = [])
4848
{
49-
if (strpos($callback_data, '%d') === false) {
50-
$callback_data .= '_page_%d';
51-
}
49+
$callback_data .= '_page_%d';
5250

5351
// Merge labels with defaults.
5452
$labels = array_merge([
@@ -99,4 +97,16 @@ public static function getPagination($callback_data, $current_page, $max_pages,
9997

10098
return new InlineKeyboard($buttons);
10199
}
100+
101+
/**
102+
* Extract the page number from the passed callback data.
103+
*
104+
* @param string $callback_data
105+
*
106+
* @return int
107+
*/
108+
public static function getPageFromCallbackData($callback_data)
109+
{
110+
return (int) preg_replace('/.*_page_(\d+)$/', '$1', $callback_data);
111+
}
102112
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* This file is part of the TelegramBot package.
4+
*
5+
* (c) Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace Longman\TelegramBot\Entities;
12+
13+
interface InlineKeyboardPaginator
14+
{
15+
/**
16+
* A unique identifier for the callback query.
17+
*
18+
* @return string
19+
*/
20+
public static function getCallbackDataId();
21+
22+
/**
23+
* Get the output for the currently selected page.
24+
*
25+
* @param int $current_page
26+
*
27+
* @return string
28+
*/
29+
public static function getOutput($current_page);
30+
31+
/**
32+
* Get the pagination for the current page.
33+
*
34+
* @param int $current_page
35+
*
36+
* @return InlineKeyboard
37+
*/
38+
public static function getPagination($current_page);
39+
}

tests/unit/Entities/InlineKeyboardTest.php

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,27 +153,24 @@ public function testInlineKeyboardAddRows()
153153
public function testInlineKeyboardPagination()
154154
{
155155
// Should get '_page_%d' appended to it.
156-
$callback_data = 'pagination_callback';
156+
$callback_data = 'cbdata';
157157

158158
// current
159159
$keyboard = InlineKeyboard::getPagination($callback_data, 1, 1);
160160
KeyboardTest::assertAllButtonPropertiesEqual([
161161
['· 1 ·'],
162162
], 'text', $keyboard);
163163
KeyboardTest::assertAllButtonPropertiesEqual([
164-
['pagination_callback_page_1'],
164+
['cbdata_page_1'],
165165
], 'callback_data', $keyboard);
166166

167-
// Shorter custom callback data.
168-
$callback_data = 'p%d';
169-
170167
// current, next, last
171168
$keyboard = InlineKeyboard::getPagination($callback_data, 1, 10);
172169
KeyboardTest::assertAllButtonPropertiesEqual([
173170
['· 1 ·', '2 ›', '10 »'],
174171
], 'text', $keyboard);
175172
KeyboardTest::assertAllButtonPropertiesEqual([
176-
['p1', 'p2', 'p10'],
173+
['cbdata_page_1', 'cbdata_page_2', 'cbdata_page_10'],
177174
], 'callback_data', $keyboard);
178175

179176
// first, previous, current, next, last
@@ -182,7 +179,7 @@ public function testInlineKeyboardPagination()
182179
['« 1', '‹ 4', '· 5 ·', '6 ›', '10 »'],
183180
], 'text', $keyboard);
184181
KeyboardTest::assertAllButtonPropertiesEqual([
185-
['p1', 'p4', 'p5', 'p6', 'p10'],
182+
['cbdata_page_1', 'cbdata_page_4', 'cbdata_page_5', 'cbdata_page_6', 'cbdata_page_10'],
186183
], 'callback_data', $keyboard);
187184

188185
// first, previous, current, last
@@ -191,7 +188,7 @@ public function testInlineKeyboardPagination()
191188
['« 1', '‹ 8', '· 9 ·', '10 »'],
192189
], 'text', $keyboard);
193190
KeyboardTest::assertAllButtonPropertiesEqual([
194-
['p1', 'p8', 'p9', 'p10'],
191+
['cbdata_page_1', 'cbdata_page_8', 'cbdata_page_9', 'cbdata_page_10'],
195192
], 'callback_data', $keyboard);
196193

197194
// first, previous, current
@@ -200,7 +197,7 @@ public function testInlineKeyboardPagination()
200197
['« 1', '‹ 9', '· 10 ·'],
201198
], 'text', $keyboard);
202199
KeyboardTest::assertAllButtonPropertiesEqual([
203-
['p1', 'p9', 'p10'],
200+
['cbdata_page_1', 'cbdata_page_9', 'cbdata_page_10'],
204201
], 'callback_data', $keyboard);
205202

206203
// custom labels
@@ -216,7 +213,7 @@ public function testInlineKeyboardPagination()
216213
['first 1', 'previous 4', 'cur 5 rent', '6 next', '10 last'],
217214
], 'text', $keyboard);
218215
KeyboardTest::assertAllButtonPropertiesEqual([
219-
['p1', 'p4', 'p5', 'p6', 'p10'],
216+
['cbdata_page_1', 'cbdata_page_4', 'cbdata_page_5', 'cbdata_page_6', 'cbdata_page_10'],
220217
], 'callback_data', $keyboard);
221218
}
222219
}

0 commit comments

Comments
 (0)