@@ -26,11 +26,6 @@ class InlineKeyboardPagination implements InlineKeyboardPaginator
26
26
*/
27
27
private $ selected_page ;
28
28
29
- /**
30
- * @var integer
31
- */
32
- private $ number_of_pages ;
33
-
34
29
/**
35
30
* @var array
36
31
*/
@@ -68,6 +63,8 @@ public function setMaxButtons(int $max_buttons = 5): InlineKeyboardPagination
68
63
}
69
64
70
65
/**
66
+ * Return list of keyboard button labels.
67
+ *
71
68
* @return array
72
69
*/
73
70
public function getLabels (): array
@@ -76,13 +73,15 @@ public function getLabels(): array
76
73
}
77
74
78
75
/**
76
+ * Set the keyboard button labels.
77
+ *
79
78
* @param array $labels
80
79
*
81
80
* @return InlineKeyboardPagination
82
81
*/
83
82
public function setLabels ($ labels ): InlineKeyboardPagination
84
83
{
85
- $ this ->labels = array_merge ( $ this -> labels , $ labels ) ;
84
+ $ this ->labels = $ labels ;
86
85
87
86
return $ this ;
88
87
}
@@ -103,8 +102,9 @@ public function setCommand(string $command = 'pagination'): InlineKeyboardPagina
103
102
*/
104
103
public function setSelectedPage (int $ selected_page ): InlineKeyboardPagination
105
104
{
106
- if ($ selected_page < 1 || $ selected_page > $ this ->number_of_pages ) {
107
- throw new InlineKeyboardPaginationException ('Invalid selected page, must be between 1 and ' . $ this ->number_of_pages );
105
+ $ number_of_pages = $ this ->getNumberOfPages ();
106
+ if ($ selected_page < 1 || $ selected_page > $ number_of_pages ) {
107
+ throw new InlineKeyboardPaginationException ('Invalid selected page, must be between 1 and ' . $ number_of_pages );
108
108
}
109
109
$ this ->selected_page = $ selected_page ;
110
110
@@ -135,6 +135,32 @@ public function setItemsPerPage($items_per_page): InlineKeyboardPagination
135
135
return $ this ;
136
136
}
137
137
138
+ /**
139
+ * @param array $items
140
+ *
141
+ * @return InlineKeyboardPagination
142
+ * @throws InlineKeyboardPaginationException
143
+ */
144
+ public function setItems (array $ items ): InlineKeyboardPagination
145
+ {
146
+ if (empty ($ items )) {
147
+ throw new InlineKeyboardPaginationException ('Items list empty. ' );
148
+ }
149
+ $ this ->items = $ items ;
150
+
151
+ return $ this ;
152
+ }
153
+
154
+ /**
155
+ * Calculate and return the number of pages.
156
+ *
157
+ * @return int
158
+ */
159
+ public function getNumberOfPages (): int
160
+ {
161
+ return (int ) ceil (count ($ this ->items ) / $ this ->items_per_page );
162
+ }
163
+
138
164
/**
139
165
* TelegramBotPagination constructor.
140
166
*
@@ -143,13 +169,10 @@ public function setItemsPerPage($items_per_page): InlineKeyboardPagination
143
169
*/
144
170
public function __construct (array $ items , string $ command = 'pagination ' , int $ selected_page = 1 , int $ items_per_page = 5 )
145
171
{
146
- $ this ->number_of_pages = $ this ->countTheNumberOfPage (count ($ items ), $ items_per_page );
147
-
172
+ $ this ->setCommand ($ command );
173
+ $ this ->setItemsPerPage ($ items_per_page );
174
+ $ this ->setItems ($ items );
148
175
$ this ->setSelectedPage ($ selected_page );
149
-
150
- $ this ->items = $ items ;
151
- $ this ->items_per_page = $ items_per_page ;
152
- $ this ->command = $ command ;
153
176
}
154
177
155
178
/**
@@ -169,31 +192,34 @@ public function getPagination(int $selected_page = null): array
169
192
}
170
193
171
194
/**
195
+ * Generate the keyboard with the correctly labelled buttons.
196
+ *
172
197
* @return array
173
198
*/
174
199
protected function generateKeyboard (): array
175
200
{
176
- $ buttons = [];
201
+ $ buttons = [];
202
+ $ number_of_pages = $ this ->getNumberOfPages ();
177
203
178
- if ($ this -> number_of_pages > $ this ->max_buttons ) {
204
+ if ($ number_of_pages > $ this ->max_buttons ) {
179
205
$ buttons [1 ] = $ this ->generateButton (1 );
180
206
181
207
$ range = $ this ->generateRange ();
182
208
for ($ i = $ range ['from ' ]; $ i < $ range ['to ' ]; $ i ++) {
183
209
$ buttons [$ i ] = $ this ->generateButton ($ i );
184
210
}
185
211
186
- $ buttons [$ this -> number_of_pages ] = $ this ->generateButton ($ this -> number_of_pages );
212
+ $ buttons [$ number_of_pages ] = $ this ->generateButton ($ number_of_pages );
187
213
} else {
188
- for ($ i = 1 ; $ i <= $ this -> number_of_pages ; $ i ++) {
214
+ for ($ i = 1 ; $ i <= $ number_of_pages ; $ i ++) {
189
215
$ buttons [$ i ] = $ this ->generateButton ($ i );
190
216
}
191
217
}
192
218
193
219
// Set the correct labels.
194
220
foreach ($ buttons as $ page => &$ button ) {
195
221
$ in_first_block = $ this ->selected_page <= 3 && $ page <= 3 ;
196
- $ in_last_block = $ this ->selected_page >= $ this -> number_of_pages - 2 && $ page >= $ this -> number_of_pages - 2 ;
222
+ $ in_last_block = $ this ->selected_page >= $ number_of_pages - 2 && $ page >= $ number_of_pages - 2 ;
197
223
198
224
$ label_key = 'next ' ;
199
225
if ($ page === $ this ->selected_page ) {
@@ -202,15 +228,15 @@ protected function generateKeyboard(): array
202
228
$ label_key = 'default ' ;
203
229
} elseif ($ page === 1 ) {
204
230
$ label_key = 'first ' ;
205
- } elseif ($ page === $ this -> number_of_pages ) {
231
+ } elseif ($ page === $ number_of_pages ) {
206
232
$ label_key = 'last ' ;
207
233
} elseif ($ page < $ this ->selected_page ) {
208
234
$ label_key = 'previous ' ;
209
235
}
210
236
211
- $ label = $ this ->labels [$ label_key ];
237
+ $ label = $ this ->labels [$ label_key ] ?? '' ;
212
238
213
- if ($ label === '' || $ label === null ) {
239
+ if ($ label === '' ) {
214
240
$ button = null ;
215
241
continue ;
216
242
}
@@ -222,22 +248,25 @@ protected function generateKeyboard(): array
222
248
}
223
249
224
250
/**
251
+ * Get the range of intermediate buttons for the keyboard.
252
+ *
225
253
* @return array
226
254
*/
227
255
protected function generateRange (): array
228
256
{
229
257
$ number_of_intermediate_buttons = $ this ->max_buttons - 2 ;
258
+ $ number_of_pages = $ this ->getNumberOfPages ();
230
259
231
260
if ($ this ->selected_page === 1 ) {
232
261
$ from = 2 ;
233
262
$ to = $ from + $ number_of_intermediate_buttons ;
234
- } elseif ($ this ->selected_page === $ this -> number_of_pages ) {
235
- $ from = $ this -> number_of_pages - $ number_of_intermediate_buttons ;
236
- $ to = $ this -> number_of_pages ;
263
+ } elseif ($ this ->selected_page === $ number_of_pages ) {
264
+ $ from = $ number_of_pages - $ number_of_intermediate_buttons ;
265
+ $ to = $ number_of_pages ;
237
266
} else {
238
- if (($ this ->selected_page + $ number_of_intermediate_buttons ) > $ this -> number_of_pages ) {
239
- $ from = $ this -> number_of_pages - $ number_of_intermediate_buttons ;
240
- $ to = $ this -> number_of_pages ;
267
+ if (($ this ->selected_page + $ number_of_intermediate_buttons ) > $ number_of_pages ) {
268
+ $ from = $ number_of_pages - $ number_of_intermediate_buttons ;
269
+ $ to = $ number_of_pages ;
241
270
} elseif (($ this ->selected_page - 2 ) < 1 ) {
242
271
$ from = $ this ->selected_page ;
243
272
$ to = $ this ->selected_page + $ number_of_intermediate_buttons ;
@@ -251,29 +280,35 @@ protected function generateRange(): array
251
280
}
252
281
253
282
/**
254
- * @param int $next_page
283
+ * Generate the button for the passed page.
284
+ *
285
+ * @param int $page
255
286
*
256
287
* @return array
257
288
*/
258
- protected function generateButton (int $ next_page ): array
289
+ protected function generateButton (int $ page ): array
259
290
{
260
291
return [
261
- 'text ' => " $ next_page " ,
262
- 'callback_data ' => $ this ->generateCallbackData ($ next_page ),
292
+ 'text ' => ( string ) $ page ,
293
+ 'callback_data ' => $ this ->generateCallbackData ($ page ),
263
294
];
264
295
}
265
296
266
297
/**
267
- * @param int $next_page
298
+ * Generate the callback data for the passed page.
299
+ *
300
+ * @param int $page
268
301
*
269
302
* @return string
270
303
*/
271
- protected function generateCallbackData (int $ next_page ): string
304
+ protected function generateCallbackData (int $ page ): string
272
305
{
273
- return "$ this ->command ?currentPage= $ this ->selected_page &nextPage= $ next_page " ;
306
+ return "{ $ this ->command } ?currentPage= { $ this ->selected_page } &nextPage= { $ page } " ;
274
307
}
275
308
276
309
/**
310
+ * Get the prepared items for the selected page.
311
+ *
277
312
* @return array
278
313
*/
279
314
protected function getPreparedItems (): array
@@ -288,15 +323,4 @@ protected function getOffset(): int
288
323
{
289
324
return $ this ->items_per_page * ($ this ->selected_page - 1 );
290
325
}
291
-
292
- /**
293
- * @param $items_count
294
- * @param $items_per_page
295
- *
296
- * @return int
297
- */
298
- protected function countTheNumberOfPage ($ items_count , $ items_per_page ): int
299
- {
300
- return (int ) ceil ($ items_count / $ items_per_page );
301
- }
302
326
}
0 commit comments