2014-10-29 5 views
-2

Я создаю разбивку на страницы. У меня есть класс постраничной:Pagination Количество страниц

class Pagination { 
    public $current_page; 
    public $per_page; 
    public $total_count; 

    public function __construct($page=1, $per_page=10, $total_count=0){ 
     $this->current_page = (int)$page; 
     $this->per_page = (int)$per_page; 
     $this->total_count = (int)$total_count; 
    } 

    public function offset(){ 
     // Assuming 20 items per page: 
     // page 1 has an offset of 0 (1-1) * 20 
     // page 2 has an offset of 20 (2-1) * 20 
     // in other words, page 2 starts with item 21 
     return ($this->current_page - 1) * $this->per_page; 
    } 

    public function total_pages(){ 
     return ceil($this->total_count/$this->per_page);  
    } 

    public function previous_page(){ 
     return $this->current_page - 1; 
    } 

    public function next_page(){ 
     return $this->current_page + 1; 
    } 

    public function has_previous_page(){ 
     return $this->previous_page() >= 1 ? true : false; 
    } 

    public function has_next_page(){ 
     return $this->next_page() <= $this->total_pages() ? true : false; 
    } 
} 

Я также использовать его как это:

<?php 

    // 1. the current page number ($current_page) 
    $page = !empty($_GET['page']) ? (int)$_GET['page'] : 1; 

    // 2. records per page 
    $per_page = 8; 

    // 3. total record count ($total_count) 
    $total_count = Song::count_all(); 

    $pagination = new Pagination($page, $per_page, $total_count); 

    // Instead of finding all records, just find the records 
    // for this page 
    $sql  = "SELECT * FROM songs "; 
    $sql .= "ORDER BY dopeness DESC "; 
    $sql .= "LIMIT {$per_page} "; 
    $sql .= "OFFSET {$pagination->offset()}"; 
    $songs = Song::find_by_sql($sql); 
?> 



<?php 
    if($pagination->total_pages() > 1){ 
     if($pagination->has_previous_page()){ 
      echo "<a href=\"all_songs.php?page="; 
      echo $pagination->previous_page(); 
      echo "\">&laquo;Previous&nbsp;&nbsp;</a> "; 
     } 

     for($i=1; $i<=$pagination->total_pages(); $i++){ 
      if($i == $page){ 
       echo " <span class=\"selected\">{$i}</span> "; 
      } else { 
       echo " <a href=\"all_songs.php?page={$i}\">{$i}</a> "; 
      } 
     } 

     if($pagination->has_next_page()){ 
      echo "<a href=\"all_songs.php?page="; 
      echo $pagination->next_page(); 
      echo "\">&nbsp;&nbsp;Next&raquo;</a> "; 
     } 
    } 

?> 

Выход "предыдущая 1 2 3 (однако многие страницы) рядом". Что я хочу сделать, так это сделать так, что если будет более десяти страниц, будет «...» для последней ссылки, которая приведет вас на страницу 11-20 («предыдущий 11 12 13 следующий») и так далее на. Может ли кто-нибудь помочь мне заняться этим?

+0

Ваших код содержит ошибку в этой строке: '$ page =! empty ($ _ GET ['page'])? (int) $ _ GET ['page']: 1; 'где, если я отправляю« ха-ха »или что-то еще, а не число, результирующее значение для $ page будет 0. – DampeS8N

+0

Спасибо. Я исправлю это – user3836703

ответ

0

Вы должны не только отображать следующие 10 страниц, начиная с 0, но рассмотрите текущую страницу - то ходить 10 страниц на приходах, и сломать итерации, когда вы отображаетесь 10 страниц-кнопки:

$page = 5; //assuming within valid bounds 

    for($i=$page; $i<=$pagination->total_pages(); $i++){ 
     if ($i > $page+ 10){ 
      echo " ... "; 
      break; 
     } 

     if($i == $page){ 
      echo " <span class=\"selected\">{$i}</span> "; 
     } else { 
      echo " <a href=\"all_songs.php?page={$i}\">{$i}</a> "; 
     } 
    } 
+0

Это сработало отлично. Большое спасибо. – user3836703

Смежные вопросы