Вот решения вашей проблемы постраничной, вид решения Google использует для постраничного это результатов поиска. В принципе, идея этого решения заключается в следующем:
В любой момент времени будет отображаться не более 5 ссылок на страницы, т. Е. С точки зрения текущей страницы, отображения двух страниц-предшественников и преемников. Позвольте мне объяснить эту вещь, используя два сценария,
Case (1): Когда количество страниц равно или меньше, чем 5 (Допустим, у нас есть 4 страницы)
В этом случае мы имеем отобразить все ссылки разбивки на страницы без каких-либо предшествующих или последующих точек, как это:
// User is on page 1
1 2 3 4
- - -
// User is on page 3
1 2 3 4
- - -
// User is on page 4
1 2 3 4
- - -
Случай (2): Когда количество страниц превышает 5 (Допустим, у нас есть 10 страниц)
В этом случае, мы должны отображать как ссылки разбивки на страницы и точки, соответственно, как это:
// User is on page 1
1 2 3 4 5 ...
- - - -
// User is on page 5
... 3 4 5 6 7 ...
- - - -
// User is on page 10
... 6 7 8 9 10
- - - -
Таким образом, после получения текущего номера страницы с помощью $page_cr=($start/$row_per_page)+1;
, алгоритма этой пользовательских постраничной системы будет так :
Проверьте, больше ли количество страниц больше 5 или нет. Если это больше 5, перейдите к шагу 2 в противном случае перейдите к шагу 5.
Найдите диапазон надстроек страниц, например 1-10 или 1-20 и т. Д. Например, если $page = 10
, то этот диапазон надмножеств будет 1-10. Код для этого шага заключается в следующем:
// Superset range of pages
$superset_range = range(1, $page);
Найти диапазон подмножества страниц для отображения, как 1-5 или 3-7 и т.д. Например, если $page = 10
, то этот диапазон подмножества будет 1-5 , или 3-7, или 6-10 и т. д., это может быть любая последовательная пятерка страниц между 1 и 10. Кроме того, при необходимости отрегулируйте этот диапазон. Код этого шага заключается в следующем:
// Subset range of pages to display
$subset_range = range($page_cr - 2, $page_cr + 2);
// Adjust the range
foreach($subset_range as $p){
if($p <= 0){
array_shift($subset_range);
$subset_range[] = $subset_range[count($subset_range) - 1] + 1;
}elseif($p > $page){
array_pop($subset_range);
array_unshift($subset_range, $subset_range[0] - 1);
}
}
Показать разбивки на страницы ссылки и точек соответственно.Код этого шага заключается в следующем:
// Display pagination links and dots
if($subset_range[0] > $superset_range[0]){
echo "<div class='pagination'>... </div>";
}
foreach($subset_range as $p){
if($page_cr != $p){
echo "<div class='pagination'>"."<a href='index.php?go=product&start=".$row_per_page*($p-1)."'>$p </a>"."</div>";
}else{
echo "<div class='pagination'>".$p." "."</div>";
}
}
if($subset_range[count($subset_range) - 1] < $superset_range[count($superset_range) - 1]){
echo "<div class='pagination'> ...</div>";
}
Показать все разбиения на страницы ссылки, используя ваш старый код, как это:
// Display all page links
for($i = 1; $i <= $page; $i++){
if($page_cr != $i){
echo "<div class='pagination'>"."<a href='index.php?go=product&start=".$row_per_page*($i-1)."'>$i </a>"."</div>";
}else{
echo "<div class='pagination'>".$i." "."</div>";
}
}
Так вот полный код:
$result1 = $mysqli->query("SELECT * FROM product");
$row_per_page= 10;
$rows=$result1->num_rows;
if ($rows > $row_per_page){
$page=ceil($rows/$row_per_page);
}else{
$page=1;
}
if(isset($_GET['start']) && (int)$_GET['start']){
$start=$_GET['start'];
}else{
$start=0;
}
$result=$mysqli->query("SELECT * FROM product limit $start,$row_per_page");
while ($rows = $result->fetch_assoc()) {
echo $rows['name'];
}
$page_cr=($start/$row_per_page) + 1; // Page number
if($page > 5){
// From the current page's perspective, display two predecessor and successor pages
// Superset range of pages
$superset_range = range(1, $page);
// Subset range of pages to display
$subset_range = range($page_cr - 2, $page_cr + 2);
// Adjust the range
foreach($subset_range as $p){
if($p <= 0){
array_shift($subset_range);
$subset_range[] = $subset_range[count($subset_range) - 1] + 1;
}elseif($p > $page){
array_pop($subset_range);
array_unshift($subset_range, $subset_range[0] - 1);
}
}
// Display pagination links and dots
if($subset_range[0] > $superset_range[0]){
echo "<div class='pagination'>... </div>";
}
foreach($subset_range as $p){
if($page_cr != $p){
echo "<div class='pagination'>"."<a href='index.php?go=product&start=".$row_per_page*($p-1)."'>$p </a>"."</div>";
}else{
echo "<div class='pagination'>".$p." "."</div>";
}
}
if($subset_range[count($subset_range) - 1] < $superset_range[count($superset_range) - 1]){
echo "<div class='pagination'> ...</div>";
}
}else{
// Display all page links
for($i = 1; $i <= $page; $i++){
if($page_cr != $i){
echo "<div class='pagination'>"."<a href='index.php?go=product&start=".$row_per_page*($i-1)."'>$i </a>"."</div>";
}else{
echo "<div class='pagination'>".$i." "."</div>";
}
}
}
Вы должны быть более конкретными с логикой. Все это кажется произвольным. Когда вы находитесь на странице 1, вы показываете 5 страниц с начала и 4 страницы с конца. Когда вы находитесь на странице 6, вы показываете 4 страницы (начиная со страницы 6) и 4 страницы с конца. Существует ли какое-либо правило, регулирующее это? Любая спецификация? – apokryfos
Вам просто нужны математические проверки, например 'if ($ i> $ page_cr + 5)' ... –
Я редактирую свое сообщение, чтобы вы поняли. Благодаря !!! – XCode2015