@@ -26,11 +26,6 @@ class InlineKeyboardPagination implements InlineKeyboardPaginator
2626 */
2727 private $ selected_page ;
2828
29- /**
30- * @var integer
31- */
32- private $ number_of_pages ;
33-
3429 /**
3530 * @var array
3631 */
@@ -68,6 +63,8 @@ public function setMaxButtons(int $max_buttons = 5): InlineKeyboardPagination
6863 }
6964
7065 /**
66+ * Return list of keyboard button labels.
67+ *
7168 * @return array
7269 */
7370 public function getLabels (): array
@@ -76,13 +73,15 @@ public function getLabels(): array
7673 }
7774
7875 /**
76+ * Set the keyboard button labels.
77+ *
7978 * @param array $labels
8079 *
8180 * @return InlineKeyboardPagination
8281 */
8382 public function setLabels ($ labels ): InlineKeyboardPagination
8483 {
85- $ this ->labels = array_merge ( $ this -> labels , $ labels ) ;
84+ $ this ->labels = $ labels ;
8685
8786 return $ this ;
8887 }
@@ -103,8 +102,9 @@ public function setCommand(string $command = 'pagination'): InlineKeyboardPagina
103102 */
104103 public function setSelectedPage (int $ selected_page ): InlineKeyboardPagination
105104 {
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 );
108108 }
109109 $ this ->selected_page = $ selected_page ;
110110
@@ -135,6 +135,32 @@ public function setItemsPerPage($items_per_page): InlineKeyboardPagination
135135 return $ this ;
136136 }
137137
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+
138164 /**
139165 * TelegramBotPagination constructor.
140166 *
@@ -143,13 +169,10 @@ public function setItemsPerPage($items_per_page): InlineKeyboardPagination
143169 */
144170 public function __construct (array $ items , string $ command = 'pagination ' , int $ selected_page = 1 , int $ items_per_page = 5 )
145171 {
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 );
148175 $ this ->setSelectedPage ($ selected_page );
149-
150- $ this ->items = $ items ;
151- $ this ->items_per_page = $ items_per_page ;
152- $ this ->command = $ command ;
153176 }
154177
155178 /**
@@ -169,31 +192,34 @@ public function getPagination(int $selected_page = null): array
169192 }
170193
171194 /**
195+ * Generate the keyboard with the correctly labelled buttons.
196+ *
172197 * @return array
173198 */
174199 protected function generateKeyboard (): array
175200 {
176- $ buttons = [];
201+ $ buttons = [];
202+ $ number_of_pages = $ this ->getNumberOfPages ();
177203
178- if ($ this -> number_of_pages > $ this ->max_buttons ) {
204+ if ($ number_of_pages > $ this ->max_buttons ) {
179205 $ buttons [1 ] = $ this ->generateButton (1 );
180206
181207 $ range = $ this ->generateRange ();
182208 for ($ i = $ range ['from ' ]; $ i < $ range ['to ' ]; $ i ++) {
183209 $ buttons [$ i ] = $ this ->generateButton ($ i );
184210 }
185211
186- $ buttons [$ this -> number_of_pages ] = $ this ->generateButton ($ this -> number_of_pages );
212+ $ buttons [$ number_of_pages ] = $ this ->generateButton ($ number_of_pages );
187213 } else {
188- for ($ i = 1 ; $ i <= $ this -> number_of_pages ; $ i ++) {
214+ for ($ i = 1 ; $ i <= $ number_of_pages ; $ i ++) {
189215 $ buttons [$ i ] = $ this ->generateButton ($ i );
190216 }
191217 }
192218
193219 // Set the correct labels.
194220 foreach ($ buttons as $ page => &$ button ) {
195221 $ 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 ;
197223
198224 $ label_key = 'next ' ;
199225 if ($ page === $ this ->selected_page ) {
@@ -202,15 +228,15 @@ protected function generateKeyboard(): array
202228 $ label_key = 'default ' ;
203229 } elseif ($ page === 1 ) {
204230 $ label_key = 'first ' ;
205- } elseif ($ page === $ this -> number_of_pages ) {
231+ } elseif ($ page === $ number_of_pages ) {
206232 $ label_key = 'last ' ;
207233 } elseif ($ page < $ this ->selected_page ) {
208234 $ label_key = 'previous ' ;
209235 }
210236
211- $ label = $ this ->labels [$ label_key ];
237+ $ label = $ this ->labels [$ label_key ] ?? '' ;
212238
213- if ($ label === '' || $ label === null ) {
239+ if ($ label === '' ) {
214240 $ button = null ;
215241 continue ;
216242 }
@@ -222,22 +248,25 @@ protected function generateKeyboard(): array
222248 }
223249
224250 /**
251+ * Get the range of intermediate buttons for the keyboard.
252+ *
225253 * @return array
226254 */
227255 protected function generateRange (): array
228256 {
229257 $ number_of_intermediate_buttons = $ this ->max_buttons - 2 ;
258+ $ number_of_pages = $ this ->getNumberOfPages ();
230259
231260 if ($ this ->selected_page === 1 ) {
232261 $ from = 2 ;
233262 $ 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 ;
237266 } 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 ;
241270 } elseif (($ this ->selected_page - 2 ) < 1 ) {
242271 $ from = $ this ->selected_page ;
243272 $ to = $ this ->selected_page + $ number_of_intermediate_buttons ;
@@ -251,29 +280,35 @@ protected function generateRange(): array
251280 }
252281
253282 /**
254- * @param int $next_page
283+ * Generate the button for the passed page.
284+ *
285+ * @param int $page
255286 *
256287 * @return array
257288 */
258- protected function generateButton (int $ next_page ): array
289+ protected function generateButton (int $ page ): array
259290 {
260291 return [
261- 'text ' => " $ next_page " ,
262- 'callback_data ' => $ this ->generateCallbackData ($ next_page ),
292+ 'text ' => ( string ) $ page ,
293+ 'callback_data ' => $ this ->generateCallbackData ($ page ),
263294 ];
264295 }
265296
266297 /**
267- * @param int $next_page
298+ * Generate the callback data for the passed page.
299+ *
300+ * @param int $page
268301 *
269302 * @return string
270303 */
271- protected function generateCallbackData (int $ next_page ): string
304+ protected function generateCallbackData (int $ page ): string
272305 {
273- return "$ this ->command ?currentPage= $ this ->selected_page &nextPage= $ next_page " ;
306+ return "{ $ this ->command } ?currentPage= { $ this ->selected_page } &nextPage= { $ page } " ;
274307 }
275308
276309 /**
310+ * Get the prepared items for the selected page.
311+ *
277312 * @return array
278313 */
279314 protected function getPreparedItems (): array
@@ -288,15 +323,4 @@ protected function getOffset(): int
288323 {
289324 return $ this ->items_per_page * ($ this ->selected_page - 1 );
290325 }
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- }
302326}
0 commit comments