Как выполнить эхо-повторение трех точек «…» после определенного числа (например, 9) и повторить последние два числа после трех точек «…» (например, 57 и 58) для разбивки на страницы с использованием MySQLi и PHP?
Вот код:
<?php $output = ""; $tpages = ceil($engine->numrows("SELECT null FROM `cms_articles_comments` WHERE `article_id` = '" . $id . "'") / 10); if ($page == 1) { $output .= '<button type="button" class="btn btn-info pull-left goToTop" disabled><i class="fa fa-arrow-left"></i> Previous</button>'; } else { $output .= '<a href="/articles/' . $seo . '&p=' . ($page - 1) . '#comments" ng-click="progress()" class="btn btn-info pull-left goToTop"><i class="fa fa-arrow-left"></i> Previous</a>'; } if ($page >= $tpages) { $output .= '<button type="button" class="btn btn-info pull-right goToTop" disabled>Next <i class="fa fa-arrow-right"></i></button>'; } else { $output .= '<a href="/articles/' . $seo . '&p=' . ($page + 1) . '#comments" ng-click="progress()" class="btn btn-info pull-right goToTop">Next <i class="fa fa-arrow-right"></i></a>'; } $output .= '<div class="fpagination fpagination-centered"><ul>'; for($i = 1; $i <= $tpages; $i++) { if ($i == $page) { $output .= '<li class="active"><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } else { $output .= '<li><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } } $output .= '</ul></div>'; echo $output; ?>
С приведенным выше кодом я получаю следующее:
Я хочу, чтобы список разбиения на страницы отображался следующим образом:
prntscr.com/a0azua, prntscr.com/a0ay1s
Заранее спасибо.
Система отображения, которую вы ищете, сложнее, чем кажется, потому что, если у вас есть 58 страниц, а ваша текущая страница – 53, вам нужно будет показать эту трехточечную кнопку до страницы 53, а не после:
1 2 ... 50 51 52 [53] 54 55 56 57 58
И когда вашей текущей странице будет 20, вы хотите, чтобы они отображались с обеих сторон:
1 2 ... 18 19 [20] 21 22 23 ... 57 58
В общем, вам нужна система, в которой выводится максимальное количество меток / кнопок (в вашем примере это 12), а также подсчет трехточечных меток.
Было бы удобно показывать по крайней мере две страницы, предшествующие текущей странице, и две следующие за ней.
Вы можете написать функцию для создания списка номеров страниц, которые следуют этим правилам, и использовать число 0 для обозначения кнопки с тремя точками:
// Returns an array of $max_length (or less) page numbers // where a 0 in the returned array denotes a gap in the series. // Parameters: // $tpages: total number of pages // $page: current page // $max_length: maximum size of returned array function getPageList($tpages, $page, $max_length) { if ($tpages <= $max_length) { // no breaks in list return range(1, $tpages); } if ($page <= $max_length - 5) { // no break on left of page return array_merge(range(1, $max_length-3), array(0, $tpages-1, $tpages)); } if ($page >= $tpages - $max_length + 6) { // no break on right of page return array_merge(array(1, 2, 0), range($tpages - $max_length + 4, $tpages)); } // breaks on both sides $size = $max_length - 6; $first = $page - floor(($size-1)/2); return array_merge(array(1, 2, 0), range($first, $first + $size - 1), array(0, $tpages-1, $tpages)); }
Если вы вызываете эту функцию следующим образом:
getPageList(58, 53, 12)
Он вернет это:
[1, 2, 0, 50, 51, 52, 53, 54, 55, 56, 57, 58]
Или, например, изменение текущего номера страницы:
getPageList(58, 20, 12)
Он вернет это:
[1, 2, 0, 18, 19, 20, 21, 22, 23, 0, 57, 58]
Обратите внимание на нули, которые являются держателями мест для трехточечных кнопок.
Теперь сложная часть была выполнена. Вы можете вызывать эту функцию из вашего существующего кода, не изменяя многое. Вместо цикла for
вы будете использовать foreach
на выходе вышеуказанной функции. В цикле у вас будет дополнительный тест на ноль, так что вы можете вывести метку с тремя точками:
$output = ""; // first part of your code for getting $tpages and // generating prev/next buttons comes here: it does not change // ... // $output .= '<div class="fpagination fpagination-centered"><ul>'; foreach (getPageList($tpages, $page, 12) as $i) { if ($i == $page) { $output .= '<li class="active"><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } else if ($i == 0) { $output .= '<li>…</li>'; } else { $output .= '<li><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } } $output .= '</ul></div>'; echo $output;
Обратите внимание, что последний аргумент функции getPageList равен 12. Вы можете настроить этот номер в соответствии с вашими потребностями. Это зависит от того, насколько широка ваша продукция.
$bOutputOnce = FALSE; for($i = 1; $i <= $tpages; $i++) { if ($i == $page) { $output .= '<li class="active"><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } elseif (($i <= 9) or ($i >= ($tpages - 2))) { $output .= '<li><a href="/articles/' . $seo . '&p=' . $i . '#comments" ng-click="progress()" class="goToTop">' . $i . '</a></li>'; } elseif ($bOutputOnce == FALSE) { $output .= '<li>…</li>'; $bOutputOnce = TRUE; } }
Но опять же, лучше использовать фреймворк. Кроме того, если у вас меньше 9 страниц, это создает проблему, и для этого вам нужно добавить еще какой-нибудь код if / else. На самом деле, будет очень странно, если у вас будет 11 страниц, потому что это будет 9 … 10 11, что не имеет смысла.